2929import java .lang .reflect .Field ;
3030import java .lang .reflect .Modifier ;
3131import java .util .*;
32+ import java .util .stream .Collectors ;
3233
3334public 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}
0 commit comments