Skip to content

Commit de509b6

Browse files
committed
transformer: Improve error message for non-matching visibility of methods
1 parent 9a736b4 commit de509b6

File tree

4 files changed

+29
-12
lines changed

4 files changed

+29
-12
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ plugins {
1010

1111
group 'io.github.notstirred'
1212
archivesBaseName = "dasm"
13-
version '2.2.1'
13+
version '2.3.0'
1414

1515
ext.ossrhUsername = project.findProperty("ossrhUsername") ?: "" // Enter in ~/.gradle/gradle.properties, not here.
1616
ext.ossrhPassword = project.findProperty("ossrhPassword") ?: "" // Enter in ~/.gradle/gradle.properties, not here.

src/main/java/io/github/notstirred/dasm/annotation/AnnotationParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,8 @@ public Optional<Collection<MethodTransform>> buildMethodTargets(ClassNode target
186186
addedParameters,
187187
visibility.first,
188188
visibility.second
189-
)
189+
),
190+
new MethodTransform.OriginalTransformData(targetClass.name, method)
190191
);
191192

192193
AnnotationNode addToSetsAnnotation = getAnnotationIfPresent(method.invisibleAnnotations, AddTransformToSets.class);

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,9 @@ public void transform(ClassNode targetClass, Collection<MethodTransform> transfo
142142
TransformRedirects transformRedirects = new TransformRedirects(transform.redirectSets(), this.mappingsProvider);
143143
try {
144144
if (transform.inPlace()) {
145-
applyRedirects(srcClass, transform.srcMethod(), transformRedirects, transform.transformChanges(), true);
145+
applyRedirects(srcClass, transform.srcMethod(), transformRedirects, transform.transformChanges(), transform.originalTransformData(), true);
146146
} else {
147-
cloneAndApplyRedirects(srcClass, targetClass, transform.srcMethod(), transform.dstMethodName(), transformRedirects, transform.transformChanges(), true);
147+
cloneAndApplyRedirects(srcClass, targetClass, transform.srcMethod(), transform.dstMethodName(), transformRedirects, transform.transformChanges(), transform.originalTransformData(), true);
148148
}
149149

150150
} catch (SrcMethodNotFound e) {
@@ -163,8 +163,9 @@ private MethodNode cloneAndApplyRedirects(ClassNode srcClass, ClassNode targetCl
163163
ClassMethod srcMethod, String dstMethodName,
164164
TransformRedirects redirects,
165165
MethodTransform.TransformChanges transformChanges,
166+
MethodTransform.OriginalTransformData originalTransformData,
166167
boolean debugLogging) throws DasmTransformException {
167-
return redirects(srcClass, targetClass, srcMethod, dstMethodName, redirects, transformChanges, debugLogging,
168+
return redirects(srcClass, targetClass, srcMethod, dstMethodName, redirects, transformChanges, originalTransformData, debugLogging,
168169
(srcMethodNode, dstMethodNode, existingMethodNode) -> {
169170
cloneAndApplyLambdaRedirects(srcClass, targetClass, srcMethodNode, redirects, debugLogging);
170171
if (debugLogging && existingMethodNode != null && (existingMethodNode.access & ACC_NATIVE) == 0) {
@@ -179,8 +180,9 @@ private MethodNode cloneAndApplyRedirects(ClassNode srcClass, ClassNode targetCl
179180
private void applyRedirects(ClassNode srcClass, ClassMethod srcMethod,
180181
TransformRedirects redirects,
181182
MethodTransform.TransformChanges transformChanges,
183+
MethodTransform.OriginalTransformData originalTransformData,
182184
boolean debugLogging) throws DasmTransformException {
183-
redirects(srcClass, srcClass, srcMethod, srcMethod.method().getName(), redirects, transformChanges, debugLogging,
185+
redirects(srcClass, srcClass, srcMethod, srcMethod.method().getName(), redirects, transformChanges, originalTransformData, debugLogging,
184186
(srcMethodNode, dstMethodNode, existingMethodNode) -> {
185187
applyLambdaRedirects(srcClass, srcMethodNode, redirects, debugLogging);
186188
if (debugLogging && existingMethodNode != null && (existingMethodNode.access & ACC_NATIVE) == 0 && !srcMethodNode.desc.equals(dstMethodNode.desc)) {
@@ -202,6 +204,7 @@ private MethodNode redirects(ClassNode srcClass, ClassNode targetClass,
202204
ClassMethod srcMethod, String dstMethodName,
203205
TransformRedirects redirects,
204206
MethodTransform.TransformChanges transformChanges,
207+
MethodTransform.OriginalTransformData originalTransformData,
205208
boolean debugLogging,
206209
RedirectsFunction f) throws DasmTransformException {
207210
Method existingMethod = srcMethod.remap(this.mappingsProvider).method();
@@ -213,7 +216,7 @@ private MethodNode redirects(ClassNode srcClass, ClassNode targetClass,
213216
String dstMethodDescriptor = applyTransformsToMethodDescriptor(srcMethodNode.desc, redirects, transformChanges.addedParameters());
214217
MethodNode existingMethodNode = removeExistingMethod(targetClass, dstMethodName, dstMethodDescriptor);
215218

216-
transformChanges.throwIfInvalidAccess(Visibility.fromAccess(srcMethodNode.access));
219+
transformChanges.throwIfInvalidAccess(originalTransformData, Visibility.fromAccess(srcMethodNode.access));
217220
// FIXME: transform exceptions
218221
int access = transformChanges.dstMethodVisibility().access | (srcMethodNode.access & ~(ACC_PUBLIC | ACC_PROTECTED | ACC_PRIVATE));
219222
MethodNode dstMethodNode = new MethodNode(access, dstMethodName, dstMethodDescriptor, null, srcMethodNode.exceptions.toArray(new String[0]));
@@ -287,6 +290,7 @@ private void cloneAndApplyLambdaRedirects(ClassNode srcClass, ClassNode targetCl
287290
newName,
288291
redirects,
289292
new MethodTransform.TransformChanges(Collections.emptyList(), Visibility.PRIVATE, Visibility.SAME_AS_TARGET),
293+
new MethodTransform.OriginalTransformData(srcClass.name, method),
290294
debugLogging
291295
);
292296
});
@@ -311,6 +315,7 @@ private void applyLambdaRedirects(ClassNode srcClass, MethodNode method, Transfo
311315
classMethod,
312316
redirects,
313317
new MethodTransform.TransformChanges(Collections.emptyList(), Visibility.PRIVATE, Visibility.SAME_AS_TARGET),
318+
new MethodTransform.OriginalTransformData(srcClass.name, method), // Assume lambas are always private, the passed in method here is therefore irrelevant
314319
debugLogging
315320
));
316321
}

src/main/java/io/github/notstirred/dasm/transformer/data/MethodTransform.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.github.notstirred.dasm.data.ClassMethod;
88
import io.github.notstirred.dasm.exception.DasmTransformException;
99
import lombok.Data;
10+
import org.objectweb.asm.tree.MethodNode;
1011

1112
import java.util.List;
1213

@@ -17,34 +18,44 @@ public class MethodTransform {
1718
private final List<RedirectSetImpl> redirectSets;
1819
private final ApplicationStage stage;
1920
private final boolean inPlace;
21+
2022
private final TransformChanges transformChanges;
2123

24+
private final OriginalTransformData originalTransformData;
25+
2226
@Data
2327
public static class TransformChanges {
2428
private final List<AddedParameter> addedParameters;
2529
private final Visibility dstMethodVisibility;
2630
private final Visibility annotationVisibility;
2731

28-
public void throwIfInvalidAccess(Visibility srcMethodVisibility) throws DasmTransformException {
32+
public void throwIfInvalidAccess(OriginalTransformData originalTransformData, Visibility srcMethodVisibility) throws DasmTransformException {
2933
if (this.annotationVisibility == Visibility.SAME_AS_TARGET) {
3034
// if the annotation is default, the dst must match the src method
3135
if (this.dstMethodVisibility != srcMethodVisibility) {
32-
throw new InvalidVisibility(this.dstMethodVisibility, srcMethodVisibility);
36+
throw new InvalidVisibility(originalTransformData, this.dstMethodVisibility, srcMethodVisibility);
3337
} else {
3438
return;
3539
}
3640
}
3741

3842
// otherwise the dst method must match the annotation
3943
if (this.dstMethodVisibility != this.annotationVisibility) {
40-
throw new InvalidVisibility(this.dstMethodVisibility, this.annotationVisibility);
44+
throw new InvalidVisibility(originalTransformData, this.dstMethodVisibility, this.annotationVisibility);
4145
}
4246
}
4347

4448
public static class InvalidVisibility extends DasmTransformException {
45-
public InvalidVisibility(Visibility has, Visibility expected) {
46-
super("Transform has invalid visibility. Has `" + has + "`, expected `" + expected + "`");
49+
public InvalidVisibility(OriginalTransformData originalTransformData, Visibility has, Visibility expected) {
50+
super("Transform " + originalTransformData.className.substring(originalTransformData.className.lastIndexOf('/') + 1)
51+
+ "#" + originalTransformData.methodNode.name + " has invalid visibility. Has `" + has + "`, expected `" + expected + "`");
4752
}
4853
}
4954
}
55+
56+
@Data
57+
public static class OriginalTransformData {
58+
private final String className;
59+
private final MethodNode methodNode;
60+
}
5061
}

0 commit comments

Comments
 (0)