Skip to content

Commit e95e54e

Browse files
committed
transformer: Return changed method/class nodes from transformation
1 parent 6d240dc commit e95e54e

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

src/main/java/io/github/notstirred/dasm/transformer/Transformer.java

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.github.notstirred.dasm.util.ClassNodeProvider;
1414
import io.github.notstirred.dasm.util.NotifyStack;
1515
import io.github.notstirred.dasm.util.TypeUtil;
16+
import lombok.Data;
1617
import lombok.Getter;
1718
import org.apache.logging.log4j.LogManager;
1819
import 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

Comments
 (0)