feat: type erasure is now handled correctly

This commit is contained in:
zaaarf 2023-04-11 23:25:38 +02:00
parent 5579df7c39
commit a5576ac5e7
No known key found for this signature in database
GPG key ID: 82240E075E31FA4C
2 changed files with 38 additions and 3 deletions

View file

@ -12,10 +12,8 @@ import ftbsc.lll.proxies.ProxyType;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.*;
import javax.lang.model.type.*;
import javax.tools.Diagnostic;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -302,6 +300,36 @@ public class ASTUtils {
}
}
/**
* Tries to find the method being overloaded by the given {@link ExecutableElement}.
* In case of multiple layers of overloading, it finds the original one. In case of
* no overloading, it returns the given method.
* @param context the {@link TypeElement} representing the parent class
* @param method an {@link ExecutableElement} representing the overloading method
* @param env the {@link ProcessingEnvironment} to perform the operation in
* @return the original overloaded method, or the given method if it was not found
* @since 0.5.2
*/
public static ExecutableElement findOverloadedMethod(
TypeElement context, ExecutableElement method, ProcessingEnvironment env) {
if (context.getSuperclass().getKind() == TypeKind.NONE)
return method;
for (Element elem : context.getEnclosedElements()) {
if (elem.getKind() != ElementKind.METHOD)
continue;
if (env.getElementUtils().overrides(method, (ExecutableElement) elem, context)) {
method = (ExecutableElement) elem;
break; //found
}
}
return findOverloadedMethod(
(TypeElement) env.getTypeUtils().asElement(context.getSuperclass()),
method, env
);
}
/**
* 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.

View file

@ -9,6 +9,7 @@ import ftbsc.lll.processor.tools.obfuscation.ObfuscationMapper;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import static ftbsc.lll.processor.tools.ASTUtils.*;
@ -72,7 +73,13 @@ public class MethodContainer {
this.name = name;
this.descriptor = descriptor;
} else {
this.elem = (ExecutableElement) findMember(parent, name, descriptor, descriptor != null && strict, false, env);
this.elem = findOverloadedMethod( //to prevent type erasure from messing it all up
(TypeElement) this.parent.elem,
(ExecutableElement) findMember(
parent, name, descriptor, descriptor != null && strict,false, env
), env
);
this.name = this.elem.getSimpleName().toString();
this.descriptor = descriptorFromExecutableElement(this.elem, env);
}