Skip to content

Commit f5a5677

Browse files
committed
allow to handle conflict with class loading and evaluate values lazily
1 parent 814e769 commit f5a5677

File tree

3 files changed

+40
-16
lines changed

3 files changed

+40
-16
lines changed

src/main/java/io/papermc/typewriter/preset/EnumRewriter.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package io.papermc.typewriter.preset;
22

33
import com.google.common.base.Preconditions;
4-
import io.papermc.typewriter.SourceFile;
54
import io.papermc.typewriter.preset.model.EnumValue;
65
import io.papermc.typewriter.replace.SearchMetadata;
76
import io.papermc.typewriter.replace.SearchReplaceRewriter;
@@ -37,28 +36,27 @@ protected void appendEnumValue(T item, StringBuilder builder, String indent, boo
3736
builder.append('\n');
3837
}
3938

40-
@Override
41-
public boolean registerFor(SourceFile file) {
42-
boolean canRegister = super.registerFor(file);
43-
if (canRegister) {
44-
this.values = this.getValues().iterator();
45-
}
46-
return canRegister;
47-
}
48-
4939
private boolean canReachEnd(SearchMetadata metadata) {
5040
// the default behavior might fail for simple enum or with trailing comments that's why a setting exists
5141
return Objects.requireNonNullElseGet(this.reachEnd, () -> metadata.replacedContent().stripTrailing().endsWith(";"));
5242
}
5343

44+
private void populateValues() {
45+
if (this.values == null) {
46+
this.values = this.getValues().iterator();
47+
}
48+
}
49+
5450
@Override
5551
protected void replaceLine(SearchMetadata metadata, StringBuilder builder) {
52+
this.populateValues();
5653
Preconditions.checkState(this.values.hasNext(), "Enum size doesn't match between generated values and replaced values.");
5754
appendEnumValue(this.values.next(), builder, metadata.indent(), this.canReachEnd(metadata));
5855
}
5956

6057
@Override
6158
protected void insert(SearchMetadata metadata, StringBuilder builder) {
59+
this.populateValues();
6260
boolean reachEnd = this.canReachEnd(metadata);
6361

6462
while (this.values.hasNext()) {

src/main/java/io/papermc/typewriter/preset/SwitchCaseRewriter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,10 @@ public abstract class SwitchCaseRewriter extends SearchReplaceRewriter {
1414

1515
protected abstract Iterable<String> getCases();
1616

17-
@Override
18-
public boolean registerFor(SourceFile file) {
19-
boolean canRegister = super.registerFor(file);
20-
if (canRegister) {
17+
private void populateCases() {
18+
if (this.cases == null) {
2119
this.cases = this.getCases().iterator();
2220
}
23-
return canRegister;
2421
}
2522

2623
private void appendCase(StringBuilder builder, SearchMetadata metadata) {
@@ -30,12 +27,14 @@ private void appendCase(StringBuilder builder, SearchMetadata metadata) {
3027

3128
@Override
3229
protected void replaceLine(SearchMetadata metadata, StringBuilder builder) {
30+
this.populateCases();
3331
Preconditions.checkState(this.cases.hasNext(), "Switch case size doesn't match between generated values and replaced values.");
3432
appendCase(builder, metadata);
3533
}
3634

3735
@Override
3836
protected void insert(SearchMetadata metadata, StringBuilder builder) {
37+
this.populateCases();
3938
while (this.cases.hasNext()) {
4039
appendCase(builder, metadata);
4140
}

src/main/java/io/papermc/typewriter/util/ClassNamedView.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,35 @@ public Optional<ClassNamed> tryFindFirst(String name) {
7171
return this.findFirstFile(name).map(SourceFile::mainClass);
7272
}
7373

74+
public Stream<ClassNamed> find(String name) {
75+
int dotIndex = name.indexOf('.');
76+
final String fileName;
77+
@Nullable String nestedClassNames;
78+
if (dotIndex != -1) { // take in account nested names
79+
fileName = name.substring(0, dotIndex);
80+
nestedClassNames = name.substring(dotIndex + 1);
81+
} else {
82+
fileName = name;
83+
nestedClassNames = null;
84+
}
85+
86+
return this.findFile(fileName)
87+
.map(file -> {
88+
if (nestedClassNames != null) {
89+
ClassNamed clazz = file.mainClass();
90+
return ClassNamed.of(
91+
clazz.packageName(),
92+
clazz.simpleName(),
93+
nestedClassNames
94+
);
95+
}
96+
97+
return file.mainClass();
98+
});
99+
}
100+
74101
public Optional<SourceFile> findFirstFile(String name) {
75-
try (Stream<SourceFile> stream = this.findFile(name)) { // handle conflict
102+
try (Stream<SourceFile> stream = this.findFile(name)) {
76103
return stream.findFirst();
77104
}
78105
}

0 commit comments

Comments
 (0)