1313import io .github .notstirred .dasm .util .ClassNodeProvider ;
1414import io .github .notstirred .dasm .util .NotifyStack ;
1515import io .github .notstirred .dasm .util .TypeUtil ;
16+ import lombok .Data ;
1617import lombok .Getter ;
1718import org .apache .logging .log4j .LogManager ;
1819import org .apache .logging .log4j .Logger ;
@@ -41,7 +42,7 @@ public Transformer(ClassNodeProvider classNodeProvider, MappingsProvider mapping
4142 this .mappingsProvider = mappingsProvider ;
4243 }
4344
44- public void transform (ClassNode targetClass , ClassTransform transform ) throws NoSuchTypeExists {
45+ public TransformResult < ClassNode > transform (ClassNode targetClass , ClassTransform transform ) throws NoSuchTypeExists {
4546 ClassNode sourceClass ;
4647 if (transform .srcType ().equals (transform .dstType ())) { // inplace transform
4748 sourceClass = new ClassNode ();
@@ -129,10 +130,13 @@ public MethodVisitor visitMethod(int access, String name, String descriptor, Str
129130 };
130131 sourceClass .accept (cv );
131132 oldNode .accept (cv );
133+
134+ return new TransformResult <>(targetClass , Collections .emptyList ());
132135 }
133136
134- public List <Notification > transform (ClassNode targetClass , Collection <MethodTransform > transforms ) {
137+ public TransformResult < List <MethodNode > > transform (ClassNode targetClass , Collection <MethodTransform > transforms ) {
135138 NotifyStack dasmClassExceptions = NotifyStack .of (targetClass );
139+ List <MethodNode > modifiedMethods = new ArrayList <>();
136140
137141 Type targetClassType = Type .getType (TypeUtil .typeNameToDescriptor (targetClass .name ));
138142 for (MethodTransform transform : transforms ) {
@@ -153,14 +157,16 @@ public List<Notification> transform(ClassNode targetClass, Collection<MethodTran
153157
154158 TransformRedirects transformRedirects = new TransformRedirects (transform .redirectSets (), this .mappingsProvider );
155159 if (transform .inPlace ()) {
156- applyRedirects (srcClass , transform .srcMethod (), transformRedirects , transform .transformChanges (), transform .originalTransformData (), methodExceptions , true );
160+ applyRedirects (srcClass , transform .srcMethod (), transformRedirects , transform .transformChanges (), transform .originalTransformData (), methodExceptions , true )
161+ .ifPresent (modifiedMethods ::add );
157162 } else {
158163 // FIXME: java 8 synthetic accessor methods
159- cloneAndApplyRedirects (srcClass , targetClass , transform .srcMethod (), transform .dstMethodName (), transformRedirects , transform .transformChanges (), transform .originalTransformData (), methodExceptions , true );
164+ cloneAndApplyRedirects (srcClass , targetClass , transform .srcMethod (), transform .dstMethodName (), transformRedirects , transform .transformChanges (), transform .originalTransformData (), methodExceptions , true )
165+ .ifPresent (modifiedMethods ::add );
160166 }
161167 }
162168
163- return dasmClassExceptions .notifications ();
169+ return new TransformResult <>( modifiedMethods , dasmClassExceptions .notifications () );
164170 }
165171
166172 /**
@@ -185,13 +191,13 @@ private Optional<MethodNode> cloneAndApplyRedirects(ClassNode srcClass, ClassNod
185191 );
186192 }
187193
188- private void applyRedirects (ClassNode srcClass , ClassMethod srcMethod ,
189- TransformRedirects redirects ,
190- MethodTransform .TransformChanges transformChanges ,
191- MethodTransform .OriginalTransformData originalTransformData ,
192- NotifyStack methodExceptions ,
193- boolean debugLogging ) {
194- redirects (srcClass , srcClass , srcMethod , srcMethod .method ().getName (), redirects , transformChanges , originalTransformData , methodExceptions , debugLogging ,
194+ private Optional < MethodNode > applyRedirects (ClassNode srcClass , ClassMethod srcMethod ,
195+ TransformRedirects redirects ,
196+ MethodTransform .TransformChanges transformChanges ,
197+ MethodTransform .OriginalTransformData originalTransformData ,
198+ NotifyStack methodExceptions ,
199+ boolean debugLogging ) {
200+ return redirects (srcClass , srcClass , srcMethod , srcMethod .method ().getName (), redirects , transformChanges , originalTransformData , methodExceptions , debugLogging ,
195201 (srcMethodNode , dstMethodNode , existingMethodNode ) -> {
196202 applyLambdaRedirects (srcClass , srcMethodNode , redirects , methodExceptions , debugLogging );
197203 if (debugLogging && existingMethodNode != null && (existingMethodNode .access & ACC_NATIVE ) == 0 && !srcMethodNode .desc .equals (dstMethodNode .desc )) {
@@ -393,6 +399,12 @@ private static MethodNode removeExistingMethod(ClassNode node, String name, Stri
393399 return methodNode ;
394400 }
395401
402+ @ Data
403+ public static class TransformResult <T > {
404+ private final T changed ;
405+ private final List <Notification > notifications ;
406+ }
407+
396408 @ Getter
397409 public static class SrcMethodNotFound extends Notification {
398410 public SrcMethodNotFound (ClassMethod method , Method remappedMethod ) {
0 commit comments