Skip to content
This repository was archived by the owner on May 12, 2024. It is now read-only.

Commit c1afa54

Browse files
committed
Fix including Object in the output
1 parent 0c4e508 commit c1afa54

3 files changed

Lines changed: 58 additions & 24 deletions

File tree

src/main/java/net/raphimc/javadowngrader/transformer/DowngradingTransformer.java

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import java.lang.reflect.Field;
3030
import java.lang.reflect.Modifier;
3131
import java.util.*;
32+
import java.util.stream.Collectors;
3233

3334
public abstract class DowngradingTransformer {
3435

@@ -38,7 +39,7 @@ public abstract class DowngradingTransformer {
3839
private final int targetVersion;
3940

4041
private final Map<String, MethodCallReplacer> methodCallReplacers = new HashMap<>();
41-
private final Map<String, List<String>> classReplacements = new HashMap<>();
42+
private final Map<String, ClassReplacement> classReplacements = new HashMap<>();
4243

4344
public DowngradingTransformer(final int sourceVersion, final int targetVersion) {
4445
this.sourceVersion = sourceVersion;
@@ -57,26 +58,16 @@ protected void addMethodCallReplacer(final int opcode, final String owner, final
5758
this.methodCallReplacers.put(owner + ';' + name + descriptor, replacer);
5859
}
5960

60-
protected void addClassReplacement(final String name) {
61-
addClassReplacement(name, Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + name);
62-
}
63-
64-
protected void addClassReplacement(final String name, String[] extraDeps) {
65-
for (int i = 0; i < extraDeps.length; i++) {
66-
extraDeps[i] = Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + extraDeps[i];
67-
}
68-
addClassReplacement(name, Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + name, extraDeps);
61+
protected void addClassReplacement(final String name, final ClassReplacement replacement) {
62+
classReplacements.put(name, replacement);
6963
}
7064

71-
protected void addClassReplacement(final String oldName, final String newName) {
72-
this.classReplacements.put(oldName, Collections.singletonList(newName));
65+
protected void addClassReplacement(final String name) {
66+
addClassReplacement(name, ClassReplacement.ofRuntime(name));
7367
}
7468

75-
protected void addClassReplacement(final String oldName, final String newName, String... extraDeps) {
76-
final List<String> classes = new ArrayList<>(1 + extraDeps.length);
77-
classes.add(newName);
78-
Collections.addAll(classes, extraDeps);
79-
this.classReplacements.put(oldName, classes);
69+
protected void addClassReplacementWithExtraDeps(final String name, String... extraDeps) {
70+
addClassReplacement(name, ClassReplacement.ofRuntime(name, extraDeps));
8071
}
8172

8273
public void transform(final ClassNode classNode, final DowngradeResult result) {
@@ -161,13 +152,16 @@ public void transform(final ClassNode classNode, final RuntimeDepCollector depCo
161152
final ClassRemapper classRemapper = new ClassRemapper(remappedNode, new Remapper() {
162153
@Override
163154
public String map(String internalName) {
164-
final List<String> classes = classReplacements.get(internalName);
165-
if (classes == null) {
155+
final ClassReplacement replacement = classReplacements.get(internalName);
156+
if (replacement == null) {
166157
return internalName;
167158
}
168159
result.setRequiresStackMapFrames();
169-
classes.forEach(depCollector);
170-
return classes.get(0);
160+
if (replacement.includeDependency) {
161+
depCollector.accept(replacement.newName);
162+
replacement.extraDependencies.forEach(depCollector);
163+
}
164+
return replacement.newName;
171165
}
172166
});
173167
classNode.accept(classRemapper);
@@ -205,4 +199,44 @@ public int getTargetVersion() {
205199
return this.targetVersion;
206200
}
207201

202+
protected static final class ClassReplacement {
203+
private final String newName;
204+
private final boolean includeDependency;
205+
private final List<String> extraDependencies;
206+
207+
private ClassReplacement(String newName, boolean includeDependency, List<String> extraDependencies) {
208+
if (!includeDependency && !extraDependencies.isEmpty()) {
209+
throw new IllegalArgumentException("Cannot have extraDependencies if includeDependency is false!");
210+
}
211+
this.newName = newName;
212+
this.includeDependency = includeDependency;
213+
this.extraDependencies = extraDependencies;
214+
}
215+
216+
public static ClassReplacement ofAbsolute(String newName) {
217+
return new ClassReplacement(newName, true, Collections.emptyList());
218+
}
219+
220+
public static ClassReplacement ofRuntime(String newName) {
221+
return ofAbsolute(Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + newName);
222+
}
223+
224+
public static ClassReplacement ofAbsolute(String newName, String... extraDependencies) {
225+
return new ClassReplacement(newName, true, Arrays.asList(extraDependencies));
226+
}
227+
228+
public static ClassReplacement ofRuntime(String newName, String... extraDependencies) {
229+
return new ClassReplacement(
230+
Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + newName, true,
231+
Arrays.stream(extraDependencies)
232+
.map(c -> Constants.JAVADOWNGRADER_RUNTIME_PACKAGE + c)
233+
.collect(Collectors.toList())
234+
);
235+
}
236+
237+
public static ClassReplacement ofRenameOnly(String newName) {
238+
return new ClassReplacement(newName, false, Collections.emptyList());
239+
}
240+
}
241+
208242
}

src/main/java/net/raphimc/javadowngrader/transformer/j15/Java16ToJava15.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public Java16ToJava15() {
3030

3131
this.addMethodCallReplacer(Opcodes.INVOKEINTERFACE, "java/util/stream/Stream", "toList", "()Ljava/util/List;", new StreamToListMCR());
3232

33-
this.addClassReplacement("java/lang/Record", "java/lang/Object");
33+
this.addClassReplacement("java/lang/Record", ClassReplacement.ofRenameOnly("java/lang/Object"));
3434
}
3535

3636
@Override

src/main/java/net/raphimc/javadowngrader/transformer/j8/Java9ToJava8.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public Java9ToJava8() {
6161
this.addMethodCallReplacer(Opcodes.INVOKEVIRTUAL, "java/util/regex/Matcher", "appendReplacement", "(Ljava/lang/StringBuilder;Ljava/lang/String;)Ljava/util/regex/Matcher;", new MatcherAppendReplacementMCR());
6262
this.addMethodCallReplacer(Opcodes.INVOKEVIRTUAL, "java/util/regex/Matcher", "appendTail", "(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder;", new MatcherAppendTailMCR());
6363

64-
this.addClassReplacement("java/lang/StackWalker", new String[] {"java/lang/StackWalker$Option"});
64+
this.addClassReplacementWithExtraDeps("java/lang/StackWalker", "java/lang/StackWalker$Option");
6565
this.addClassReplacement("java/lang/StackWalker$Option");
6666

6767
this.addMethodCallReplacer(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", new ClassGetModuleMCR());
@@ -78,7 +78,7 @@ public Java9ToJava8() {
7878
this.addMethodCallReplacer(Opcodes.INVOKEVIRTUAL, "java/util/OptionalDouble", "stream", new OptionalStreamMCR("Double", "D"));
7979

8080
this.addMethodCallReplacer(Opcodes.INVOKESTATIC, "java/lang/Runtime", "version", new RuntimeVersionMCR());
81-
this.addClassReplacement("java/lang/Runtime$Version", new String[] {"java/lang/Runtime$VersionPattern"});
81+
this.addClassReplacementWithExtraDeps("java/lang/Runtime$Version", "java/lang/Runtime$VersionPattern");
8282
}
8383

8484
@Override

0 commit comments

Comments
 (0)