1
1
package io .github .notstirred .dasm .transformer ;
2
2
3
+ import io .github .notstirred .dasm .annotation .parse .AddedParameter ;
3
4
import io .github .notstirred .dasm .annotation .parse .redirects .FieldRedirectImpl ;
4
5
import io .github .notstirred .dasm .annotation .parse .redirects .MethodRedirectImpl ;
5
6
import io .github .notstirred .dasm .api .provider .MappingsProvider ;
23
24
import org .objectweb .asm .tree .InvokeDynamicInsnNode ;
24
25
import org .objectweb .asm .tree .MethodNode ;
25
26
26
- import java .util .Collection ;
27
- import java .util .HashMap ;
28
- import java .util .Map ;
27
+ import java .util .*;
29
28
30
29
import static org .objectweb .asm .Opcodes .*;
31
30
import static org .objectweb .asm .Type .getObjectType ;
@@ -100,12 +99,13 @@ public void transform(ClassNode targetClass, ClassTransform transform) throws No
100
99
MethodRedirectImpl methodRedirect = builtRedirects .methodRedirects ().get (key );
101
100
String dstName = methodRedirect == null ? name : methodRedirect .dstName ();
102
101
103
- String redirectedDescriptor = applyTransformsToMethodDescriptor (descriptor , redirects );
102
+ String redirectedDescriptor = applyTransformsToMethodDescriptor (descriptor , redirects , Collections . emptyList () );
104
103
105
104
return dasmTransformingVisitor (
106
105
super .visitMethod (access , dstName , redirectedDescriptor , signature , exceptions ),
107
106
redirects ,
108
- mappingsProvider
107
+ mappingsProvider ,
108
+ Collections .emptyList ()
109
109
);
110
110
}
111
111
};
@@ -137,9 +137,9 @@ public void transform(ClassNode targetClass, Collection<MethodTransform> transfo
137
137
TransformRedirects transformRedirects = new TransformRedirects (transform .redirectSets (), this .mappingsProvider );
138
138
try {
139
139
if (transform .inPlace ()) {
140
- applyRedirects (srcClass , transform .srcMethod (), transformRedirects , true );
140
+ applyRedirects (srcClass , transform .srcMethod (), transformRedirects , transform . addedParameters (), true );
141
141
} else {
142
- cloneAndApplyRedirects (srcClass , targetClass , transform .srcMethod (), transform .dstMethodName (), transformRedirects , true );
142
+ cloneAndApplyRedirects (srcClass , targetClass , transform .srcMethod (), transform .dstMethodName (), transformRedirects , transform . addedParameters (), true );
143
143
}
144
144
145
145
} catch (SrcMethodNotFound e ) {
@@ -155,7 +155,7 @@ public void transform(ClassNode targetClass, Collection<MethodTransform> transfo
155
155
* @param redirects lambda redirects are implicitly added, so the parameter is modified.
156
156
*/
157
157
private MethodNode cloneAndApplyRedirects (ClassNode srcClass , ClassNode targetClass , ClassMethod srcMethod , String dstMethodName ,
158
- TransformRedirects redirects , boolean debugLogging ) throws SrcMethodNotFound {
158
+ TransformRedirects redirects , List < AddedParameter > addedParameters , boolean debugLogging ) throws SrcMethodNotFound {
159
159
Method existingMethod = srcMethod .remap (this .mappingsProvider ).method ();
160
160
161
161
MethodNode srcMethodNode = srcClass .methods .stream ()
@@ -164,7 +164,7 @@ private MethodNode cloneAndApplyRedirects(ClassNode srcClass, ClassNode targetCl
164
164
165
165
cloneAndApplyLambdaRedirects (srcClass , targetClass , srcMethodNode , redirects , debugLogging );
166
166
167
- String dstMethodDescriptor = applyTransformsToMethodDescriptor (srcMethodNode .desc , redirects );
167
+ String dstMethodDescriptor = applyTransformsToMethodDescriptor (srcMethodNode .desc , redirects , addedParameters );
168
168
169
169
MethodNode existingMethodNode = removeExistingMethod (targetClass , dstMethodName , dstMethodDescriptor );
170
170
if (existingMethodNode != null && (existingMethodNode .access & ACC_NATIVE ) == 0 ) {
@@ -173,7 +173,7 @@ private MethodNode cloneAndApplyRedirects(ClassNode srcClass, ClassNode targetCl
173
173
// FIXME: transform exceptions
174
174
MethodNode dstMethodNode = new MethodNode (srcMethodNode .access , dstMethodName , dstMethodDescriptor , null , srcMethodNode .exceptions .toArray (new String [0 ]));
175
175
176
- srcMethodNode .accept (dasmTransformingVisitor (dstMethodNode , redirects , mappingsProvider ));
176
+ srcMethodNode .accept (dasmTransformingVisitor (dstMethodNode , redirects , mappingsProvider , addedParameters ));
177
177
178
178
dstMethodNode .name = dstMethodName ;
179
179
@@ -184,16 +184,19 @@ private MethodNode cloneAndApplyRedirects(ClassNode srcClass, ClassNode targetCl
184
184
/**
185
185
* Apply all dasm transforms to a method body
186
186
*/
187
- private static MethodVisitor dasmTransformingVisitor (MethodVisitor visitor , TransformRedirects redirects , MappingsProvider mappingsProvider ) {
187
+ private static MethodVisitor dasmTransformingVisitor (MethodVisitor visitor , TransformRedirects redirects , MappingsProvider mappingsProvider ,
188
+ List <AddedParameter > addedParameters ) {
188
189
// FIXME: line numbers
190
+ visitor = new ParameterAdder (visitor , addedParameters );
189
191
visitor = new Interfacicitifier (visitor , redirects );
190
192
visitor = new MethodRemapper (visitor , new TypeRemapper (redirects .typeRedirects (), false , mappingsProvider ));
191
193
visitor = new RedirectVisitor (visitor , redirects , mappingsProvider );
192
194
visitor = new ConstructorToFactoryBufferingVisitor (visitor , redirects );
193
195
return visitor ;
194
196
}
195
197
196
- private static String applyTransformsToMethodDescriptor (String methodDescriptor , TransformRedirects redirects ) {
198
+ private static String applyTransformsToMethodDescriptor (String methodDescriptor , TransformRedirects redirects ,
199
+ List <AddedParameter > addedParameters ) {
197
200
Type [] parameterTypes = Type .getArgumentTypes (methodDescriptor );
198
201
Type returnType = Type .getReturnType (methodDescriptor );
199
202
@@ -208,7 +211,12 @@ private static String applyTransformsToMethodDescriptor(String methodDescriptor,
208
211
returnType = redirects .typeRedirects ().getOrDefault (returnType , new TypeAndIsInterface (returnType , false )).type ();
209
212
}
210
213
211
- return Type .getMethodDescriptor (returnType , parameterTypes );
214
+ List <Type > parameterTypeList = new ArrayList <>(Arrays .asList (parameterTypes ));
215
+ for (AddedParameter addedParameter : addedParameters ) {
216
+ parameterTypeList .add (addedParameter .type ());
217
+ }
218
+
219
+ return Type .getMethodDescriptor (returnType , parameterTypeList .toArray (new Type [0 ]));
212
220
}
213
221
214
222
private void cloneAndApplyLambdaRedirects (ClassNode srcClass , ClassNode targetClass , MethodNode method , TransformRedirects redirects ,
@@ -245,6 +253,7 @@ private void cloneAndApplyLambdaRedirects(ClassNode srcClass, ClassNode targetCl
245
253
new ClassMethod (Type .getObjectType (handle .getOwner ()), new Method (name , desc )),
246
254
newName ,
247
255
redirects ,
256
+ Collections .emptyList (),
248
257
debugLogging
249
258
);
250
259
}
@@ -266,7 +275,7 @@ private void cloneAndApplyLambdaRedirects(ClassNode srcClass, ClassNode targetCl
266
275
}
267
276
268
277
private void applyRedirects (ClassNode srcClass , ClassMethod srcMethod , TransformRedirects redirects ,
269
- boolean debugLogging ) throws SrcMethodNotFound {
278
+ List < AddedParameter > addedParameters , boolean debugLogging ) throws SrcMethodNotFound {
270
279
Method existingMethod = srcMethod .remap (this .mappingsProvider ).method ();
271
280
272
281
MethodNode originalMethod = srcClass .methods .stream ()
@@ -275,7 +284,7 @@ private void applyRedirects(ClassNode srcClass, ClassMethod srcMethod, Transform
275
284
276
285
applyLambdaRedirects (srcClass , originalMethod , redirects , debugLogging );
277
286
278
- String dstMethodDescriptor = applyTransformsToMethodDescriptor (originalMethod .desc , redirects );
287
+ String dstMethodDescriptor = applyTransformsToMethodDescriptor (originalMethod .desc , redirects , addedParameters );
279
288
280
289
MethodNode existingMethodNode = removeExistingMethod (srcClass , originalMethod .name , dstMethodDescriptor );
281
290
if (existingMethodNode != null && (existingMethodNode .access & ACC_NATIVE ) == 0 && !originalMethod .desc .equals (dstMethodDescriptor )) {
@@ -285,7 +294,7 @@ private void applyRedirects(ClassNode srcClass, ClassMethod srcMethod, Transform
285
294
286
295
MethodNode dstMethodNode = new MethodNode (originalMethod .access , originalMethod .name , dstMethodDescriptor , null , originalMethod .exceptions .toArray (new String [0 ]));
287
296
originalMethod .accept (
288
- dasmTransformingVisitor (dstMethodNode , redirects , mappingsProvider )
297
+ dasmTransformingVisitor (dstMethodNode , redirects , mappingsProvider , addedParameters )
289
298
);
290
299
srcClass .methods .remove (originalMethod );
291
300
srcClass .methods .add (dstMethodNode );
@@ -320,6 +329,7 @@ private void applyLambdaRedirects(ClassNode srcClass, MethodNode method, Transfo
320
329
srcClass ,
321
330
new ClassMethod (Type .getObjectType (handle .getOwner ()), new Method (name , desc )),
322
331
redirects ,
332
+ Collections .emptyList (),
323
333
debugLogging
324
334
);
325
335
}
0 commit comments