77import net .minecraftforge .fart .internal .RenamingTransformer ;
88import net .minecraftforge .srgutils .IMappingFile ;
99import org .jetbrains .annotations .Nullable ;
10- import org .objectweb .asm .AnnotationVisitor ;
11- import org .objectweb .asm .ClassReader ;
12- import org .objectweb .asm .ClassVisitor ;
13- import org .objectweb .asm .ClassWriter ;
14- import org .objectweb .asm .Handle ;
15- import org .objectweb .asm .Opcodes ;
16- import org .objectweb .asm .Type ;
10+ import org .objectweb .asm .*;
1711import org .objectweb .asm .commons .ClassRemapper ;
1812import org .objectweb .asm .commons .Remapper ;
19- import org .objectweb .asm .tree .AbstractInsnNode ;
20- import org .objectweb .asm .tree .AnnotationNode ;
21- import org .objectweb .asm .tree .ClassNode ;
22- import org .objectweb .asm .tree .FieldNode ;
23- import org .objectweb .asm .tree .InvokeDynamicInsnNode ;
24- import org .objectweb .asm .tree .LdcInsnNode ;
25- import org .objectweb .asm .tree .MethodInsnNode ;
26- import org .objectweb .asm .tree .MethodNode ;
27- import org .objectweb .asm .tree .VarInsnNode ;
13+ import org .objectweb .asm .tree .*;
2814import org .sinytra .adapter .patch .analysis .MethodCallAnalyzer ;
2915import org .sinytra .adapter .patch .analysis .selector .AnnotationHandle ;
3016import org .sinytra .adapter .patch .analysis .selector .AnnotationValueHandle ;
3319import org .spongepowered .asm .mixin .gen .AccessorInfo ;
3420
3521import java .io .IOException ;
36- import java .util .Collection ;
37- import java .util .HashSet ;
38- import java .util .List ;
39- import java .util .Map ;
40- import java .util .Optional ;
41- import java .util .Set ;
22+ import java .util .*;
4223import java .util .concurrent .ConcurrentHashMap ;
4324import java .util .function .Consumer ;
4425import java .util .regex .Matcher ;
@@ -107,7 +88,8 @@ protected void postProcess(ClassNode node) {
10788 }
10889
10990 private void avoidAmbigousMappingRecursion (ClassNode classNode , MethodNode method ) {
110- if (isAmbigousOverridenMethod (classNode , method )) {
91+ int parentMethods = countAmbigousOverridenMethods (classNode , method );
92+ if (parentMethods > 1 ) {
11193 for (AbstractInsnNode insn : method .instructions ) {
11294 if (insn instanceof MethodInsnNode minsn && minsn .getOpcode () == Opcodes .INVOKEVIRTUAL && minsn .owner .equals (classNode .name ) && minsn .name .equals (method .name ) && minsn .desc .equals (method .desc )) {
11395 List <AbstractInsnNode > insns = MethodCallAnalyzer .findMethodCallParamInsns (method , minsn );
@@ -117,16 +99,25 @@ private void avoidAmbigousMappingRecursion(ClassNode classNode, MethodNode metho
11799 }
118100 }
119101 }
102+ // Look for ambigous methods in our own class
103+ if (parentMethods > 0 ) {
104+ int i = 1 ;
105+ for (MethodNode m : classNode .methods ) {
106+ if (m != method && m .name .equals (method .name ) && m .desc .equals (method .desc )) {
107+ m .name += "$connector_disabled$" + i ;
108+ }
109+ }
110+ }
120111 }
121112
122- private boolean isAmbigousOverridenMethod (ClassNode classNode , MethodNode method ) {
123- return classNode .superName != null && this .remapper .getClass (classNode .name )
124- .map (c -> c .getMethods ().stream ()
113+ private int countAmbigousOverridenMethods (ClassNode classNode , MethodNode method ) {
114+ return classNode .superName != null ? this .remapper .getClass (classNode .name )
115+ .map (c -> ( int ) c .getMethods ().stream ()
125116 .flatMap (Optional ::stream )
126117 .filter (m -> !m .getName ().equals (m .getMapped ()) && m .getMapped ().equals (method .name ) && method .desc .equals (this .remapper .mapMethodDesc (m .getDescriptor ()))
127118 && (m .getAccess () & (ACC_PRIVATE | ACC_STATIC )) == 0 )
128- .count () > 1 )
129- .orElse (false ) ;
119+ .count ())
120+ .orElse (0 ) : 0 ;
130121 }
131122
132123 private void processMixinAnnotation (AnnotationNode annotation , PostProcessRemapper postProcessRemapper ) {
@@ -282,10 +273,6 @@ public MixinAwareEnhancedRemapper(ClassProvider classProvider, IMappingFile map,
282273 this .flatMappings = flatMappings ;
283274 }
284275
285- public ClassProvider getUpstreamProvider () {
286- return ((IntermediaryClassProvider ) this .classProvider ).upstream ;
287- }
288-
289276 @ Override
290277 public String map (final String key ) {
291278 String fastMapped = this .flatMappings .map (key );
0 commit comments