From abd9954ed3250f99a77f770fcdf9d41c75fd90a4 Mon Sep 17 00:00:00 2001 From: zaaarf Date: Wed, 12 Apr 2023 00:53:36 +0200 Subject: feat: throw exception if bridge is not found correctly --- .../java/ftbsc/lll/processor/tools/ASTUtils.java | 25 ++++++++++++++++++++++ .../tools/containers/MethodContainer.java | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/main/java') diff --git a/src/main/java/ftbsc/lll/processor/tools/ASTUtils.java b/src/main/java/ftbsc/lll/processor/tools/ASTUtils.java index f8b05b5..6bd5864 100644 --- a/src/main/java/ftbsc/lll/processor/tools/ASTUtils.java +++ b/src/main/java/ftbsc/lll/processor/tools/ASTUtils.java @@ -330,6 +330,31 @@ public class ASTUtils { ); } + /** + * Tries to find the "synthetic bridge" generated by the compiler for a certain overridden + * method. A "bridge" only exists in cases where type erasure is involved (i.e. when the + * method being overridden uses a generic parameter that is not preserved in the overriding + * method). + * @param context the {@link TypeElement} representing the parent class + * @param method an {@link ExecutableElement} stub representing the overloading method + * @param env the {@link ProcessingEnvironment} to perform the operation in + * @return the "bridge" + * @throws TargetNotFoundException if the method in question was not overriding anything, or + * if the method it was overriding does not require a bridge + * @since 0.5.2 + */ + public static ExecutableElement findSyntheticBridge( + TypeElement context, ExecutableElement method, ProcessingEnvironment env) throws TargetNotFoundException { + ExecutableElement overridding = findOverloadedMethod(context, method, env); + if(descriptorFromExecutableElement(overridding, env).equals(descriptorFromExecutableElement(method, env))) + throw new TargetNotFoundException( + "bridge method for", + overridding.getSimpleName().toString(), + context.getQualifiedName().toString() + ); + else return overridding; + } + /** * Utility method for finding out what type of proxy a field is. * It will fail if the return type is not a known type of proxy. diff --git a/src/main/java/ftbsc/lll/processor/tools/containers/MethodContainer.java b/src/main/java/ftbsc/lll/processor/tools/containers/MethodContainer.java index 6889129..5315ee8 100644 --- a/src/main/java/ftbsc/lll/processor/tools/containers/MethodContainer.java +++ b/src/main/java/ftbsc/lll/processor/tools/containers/MethodContainer.java @@ -78,7 +78,7 @@ public class MethodContainer { ExecutableElement tmp = (ExecutableElement) findMember( parent, name, descriptor, descriptor != null && strict,false, env ); - this.elem = bridge ? findOverloadedMethod((TypeElement) this.parent.elem, tmp, env) : tmp; + this.elem = bridge ? findSyntheticBridge((TypeElement) this.parent.elem, tmp, env) : tmp; this.name = this.elem.getSimpleName().toString(); this.descriptor = descriptorFromExecutableElement(this.elem, env); } -- cgit v1.2.3-56-ga3b1