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

Commit b7ee0e7

Browse files
committed
Add RuntimeDepCollector, deprecate RuntimeRoot
Usages of RuntimeDepCollector not yet implemented
1 parent 3146098 commit b7ee0e7

43 files changed

Lines changed: 148 additions & 45 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

runtime-dep/src/main/java/net/raphimc/javadowngrader/runtime/RuntimeRoot.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@
2727
/**
2828
* This class is used to get the URI of this package.
2929
*/
30-
@SuppressWarnings("unused")
30+
@Deprecated
3131
public class RuntimeRoot {
3232
}

src/main/java/net/raphimc/javadowngrader/JavaDowngrader.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,26 @@ public class JavaDowngrader {
6161
*
6262
* @param classNode The class to downgrade
6363
* @param targetVersion The target Java version
64+
* @see ClassNode
6465
*/
6566
public static void downgrade(final ClassNode classNode, final int targetVersion) {
67+
downgrade(classNode, targetVersion, RuntimeDepCollector.NULL);
68+
}
69+
70+
/**
71+
* Downgrades the given class to the target version
72+
*
73+
* @param classNode The class to downgrade
74+
* @param targetVersion The target Java version
75+
* @param depCollector The {@link RuntimeDepCollector} to use to collect runtime dependencies. Check the javadoc
76+
* of {@link RuntimeDepCollector} for more info.
77+
* @see ClassNode
78+
* @see RuntimeDepCollector
79+
*/
80+
public static void downgrade(final ClassNode classNode, final int targetVersion, final RuntimeDepCollector depCollector) {
6681
for (DowngradingTransformer transformer : TRANSFORMER) {
6782
if (transformer.getTargetVersion() >= targetVersion && classNode.version > transformer.getTargetVersion()) {
68-
transformer.transform(classNode);
83+
transformer.transform(classNode, depCollector);
6984
}
7085
}
7186
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* This file is part of JavaDowngrader - https://github.com/RaphiMC/JavaDowngrader
3+
* Copyright (C) 2023 RK_01/RaphiMC and contributors
4+
*
5+
* This program is free software; you can redistribute it and/or
6+
* modify it under the terms of the GNU Lesser General Public
7+
* License as published by the Free Software Foundation; either
8+
* version 3 of the License, or (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package net.raphimc.javadowngrader;
19+
20+
import java.util.function.Consumer;
21+
22+
/**
23+
* This is called with the internal name of a class to include as a runtime dependency.
24+
*/
25+
@FunctionalInterface
26+
public interface RuntimeDepCollector extends Consumer<String> {
27+
RuntimeDepCollector NULL = c -> {};
28+
}

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

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.util.Constants;
2122
import org.objectweb.asm.Handle;
2223
import org.objectweb.asm.Opcodes;
2324
import org.objectweb.asm.Type;
2425
import org.objectweb.asm.commons.ClassRemapper;
25-
import org.objectweb.asm.commons.SimpleRemapper;
26+
import org.objectweb.asm.commons.Remapper;
2627
import org.objectweb.asm.tree.*;
2728

2829
import java.lang.reflect.Field;
@@ -67,6 +68,10 @@ protected void addClassReplacement(final String oldName, final String newName) {
6768
}
6869

6970
public void transform(final ClassNode classNode) {
71+
transform(classNode, RuntimeDepCollector.NULL);
72+
}
73+
74+
public void transform(final ClassNode classNode, final RuntimeDepCollector depCollector) {
7075
if (classNode.version > this.sourceVersion) {
7176
throw new IllegalArgumentException("Input class version is higher than supported");
7277
}
@@ -94,7 +99,9 @@ public void transform(final ClassNode classNode) {
9499
replacer = this.methodCallReplacers.get(methodInsn.owner + ';' + methodInsn.name);
95100
}
96101
if (replacer != null) {
97-
methodNode.instructions.insertBefore(methodInsn, replacer.getReplacement(classNode, methodNode, methodInsn.name, methodInsn.desc));
102+
methodNode.instructions.insertBefore(
103+
methodInsn, replacer.getReplacement(classNode, methodNode, methodInsn.name, methodInsn.desc, depCollector)
104+
);
98105
methodNode.instructions.remove(methodInsn);
99106
}
100107
} else if (insn instanceof InvokeDynamicInsnNode) {
@@ -119,7 +126,9 @@ public void transform(final ClassNode classNode) {
119126
for (int i1 = 0; i1 < argumentTypes.length; i1++) {
120127
bridgeMethod.instructions.add(new VarInsnNode(argumentTypes[i1].getOpcode(Opcodes.ILOAD), i1));
121128
}
122-
bridgeMethod.instructions.add(replacer.getReplacement(classNode, bridgeMethod, handle.getName(), handle.getDesc()));
129+
bridgeMethod.instructions.add(replacer.getReplacement(
130+
classNode, bridgeMethod, handle.getName(), handle.getDesc(), depCollector
131+
));
123132
bridgeMethod.instructions.add(new InsnNode(Type.getReturnType(handle.getDesc()).getOpcode(Opcodes.IRETURN)));
124133
classNode.methods.add(bridgeMethod);
125134

@@ -134,7 +143,17 @@ public void transform(final ClassNode classNode) {
134143

135144
if (!this.classReplacements.isEmpty()) {
136145
final ClassNode remappedNode = new ClassNode();
137-
final ClassRemapper classRemapper = new ClassRemapper(remappedNode, new SimpleRemapper(this.classReplacements));
146+
final ClassRemapper classRemapper = new ClassRemapper(remappedNode, new Remapper() {
147+
@Override
148+
public String map(String internalName) {
149+
final String newName = classReplacements.get(internalName);
150+
if (newName != null) {
151+
depCollector.accept(newName);
152+
return newName;
153+
}
154+
return internalName;
155+
}
156+
});
138157
classNode.accept(classRemapper);
139158

140159
// Modify the class inplace

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import org.objectweb.asm.tree.ClassNode;
2122
import org.objectweb.asm.tree.InsnList;
2223
import org.objectweb.asm.tree.MethodNode;
2324

2425
public interface MethodCallReplacer {
2526

26-
InsnList getReplacement(final ClassNode classNode, final MethodNode method, String originalName, final String originalDesc);
27+
InsnList getReplacement(final ClassNode classNode, final MethodNode method, String originalName, final String originalDesc, final RuntimeDepCollector depCollector);
2728

2829
}

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/CharacterToStringMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.tree.*;
2324

2425
public class CharacterToStringMCR implements MethodCallReplacer {
2526
@Override
26-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc) {
27+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
2728
final InsnList replacement = new InsnList();
2829

2930
// int

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/FilesReadStringMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.tree.*;
2324

2425
public class FilesReadStringMCR implements MethodCallReplacer {
2526

2627
@Override
27-
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc) {
28+
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
2829
final InsnList replacement = new InsnList();
2930

3031
if (originalDesc.equals("(Ljava/nio/file/Path;)Ljava/lang/String;")) {

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/ListToArrayMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,15 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.tree.*;
2324

2425
public class ListToArrayMCR implements MethodCallReplacer {
2526

2627
@Override
27-
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc) {
28+
public InsnList getReplacement(ClassNode classNode, MethodNode methodNode, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
2829
final InsnList replacement = new InsnList();
2930

3031
// List IntFunction

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/OptionalIsEmptyMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.tree.*;
@@ -30,7 +31,7 @@ public OptionalIsEmptyMCR(final String optionalClass) {
3031
}
3132

3233
@Override
33-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc) {
34+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
3435
final InsnList replacement = new InsnList();
3536

3637
// Optional

src/main/java/net/raphimc/javadowngrader/transformer/j10/methodcallreplacer/PathOfMCR.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818
package net.raphimc.javadowngrader.transformer.j10.methodcallreplacer;
1919

20+
import net.raphimc.javadowngrader.RuntimeDepCollector;
2021
import net.raphimc.javadowngrader.transformer.MethodCallReplacer;
2122
import org.objectweb.asm.Opcodes;
2223
import org.objectweb.asm.tree.ClassNode;
@@ -27,7 +28,7 @@
2728
public class PathOfMCR implements MethodCallReplacer {
2829

2930
@Override
30-
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc) {
31+
public InsnList getReplacement(ClassNode classNode, MethodNode method, String originalName, String originalDesc, RuntimeDepCollector depCollector) {
3132
final InsnList result = new InsnList();
3233
result.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/nio/file/Paths", "get", originalDesc));
3334
return result;

0 commit comments

Comments
 (0)