From f93c7b9e169eedeaf6caaa860cbc45cd8f2ffb2a Mon Sep 17 00:00:00 2001 From: zaaarf Date: Sun, 2 Jun 2024 21:30:10 +0200 Subject: fix: map overridden methods using top-level's name --- .../lll/processor/containers/MethodContainer.java | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) (limited to 'src/main/java/ftbsc/lll/processor/containers/MethodContainer.java') diff --git a/src/main/java/ftbsc/lll/processor/containers/MethodContainer.java b/src/main/java/ftbsc/lll/processor/containers/MethodContainer.java index 78c5a5a..e8b0892 100644 --- a/src/main/java/ftbsc/lll/processor/containers/MethodContainer.java +++ b/src/main/java/ftbsc/lll/processor/containers/MethodContainer.java @@ -2,6 +2,7 @@ package ftbsc.lll.processor.containers; import ftbsc.lll.exceptions.AmbiguousDefinitionException; import ftbsc.lll.exceptions.TargetNotFoundException; +import ftbsc.lll.mapper.data.ClassData; import ftbsc.lll.mapper.utils.MappingUtils; import ftbsc.lll.mapper.data.MethodData; import ftbsc.lll.processor.annotations.Find; @@ -56,7 +57,7 @@ public class MethodContainer { */ private MethodContainer(ClassContainer parent, String name, String descriptor, boolean strict, boolean bridge, ProcessorOptions options) { this.parent = parent; - if(parent.elem == null) { //unverified + if(parent.elem == null) { // unverified if(descriptor == null) throw new AmbiguousDefinitionException("Cannot use name-based lookups for methods of unverifiable classes!"); this.elem = null; @@ -68,7 +69,25 @@ public class MethodContainer { name = this.elem.getSimpleName().toString(); descriptor = descriptorFromExecutableElement(this.elem, options.env); } - this.data = getMethodData(parent.data.name, name, descriptor, options.mapper); + + // some mapping formats omit methods if they are overriding a parent's method + // since there is no drawback but efficiency, let's use the top parent's name for that (when possible) + String mappedName = null; + if(this.parent.elem != null) { + ExecutableElement top = findOverloadedMethod(this.parent.elem, this.elem, options.env); + ClassData topParentData = getClassData( + internalNameFromType(top.getEnclosingElement().asType(), options.env), + options.mapper + ); + MethodData topData = getMethodData(topParentData.name, name, descriptor, options.mapper); + this.data = new MethodData( + parent.data, + topData.signature.name, + topData.signature.descriptor, + topData.nameMapped + ); + } else this.data = getMethodData(parent.data.name, name, descriptor, options.mapper); + this.descriptorObf = options.mapper == null ? this.data.signature.descriptor : MappingUtils.mapMethodDescriptor(this.data.signature.descriptor, options.mapper, false); } -- cgit v1.2.3-56-ga3b1