7
7
import net .minecraftforge .fart .internal .RenamingTransformer ;
8
8
import net .minecraftforge .srgutils .IMappingFile ;
9
9
import 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 .*;
17
11
import org .objectweb .asm .commons .ClassRemapper ;
18
12
import 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 .*;
28
14
import org .sinytra .adapter .patch .analysis .MethodCallAnalyzer ;
29
15
import org .sinytra .adapter .patch .analysis .selector .AnnotationHandle ;
30
16
import org .sinytra .adapter .patch .analysis .selector .AnnotationValueHandle ;
33
19
import org .spongepowered .asm .mixin .gen .AccessorInfo ;
34
20
35
21
import 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 .*;
42
23
import java .util .concurrent .ConcurrentHashMap ;
43
24
import java .util .function .Consumer ;
44
25
import java .util .regex .Matcher ;
@@ -107,7 +88,8 @@ protected void postProcess(ClassNode node) {
107
88
}
108
89
109
90
private void avoidAmbigousMappingRecursion (ClassNode classNode , MethodNode method ) {
110
- if (isAmbigousOverridenMethod (classNode , method )) {
91
+ int parentMethods = countAmbigousOverridenMethods (classNode , method );
92
+ if (parentMethods > 1 ) {
111
93
for (AbstractInsnNode insn : method .instructions ) {
112
94
if (insn instanceof MethodInsnNode minsn && minsn .getOpcode () == Opcodes .INVOKEVIRTUAL && minsn .owner .equals (classNode .name ) && minsn .name .equals (method .name ) && minsn .desc .equals (method .desc )) {
113
95
List <AbstractInsnNode > insns = MethodCallAnalyzer .findMethodCallParamInsns (method , minsn );
@@ -117,16 +99,25 @@ private void avoidAmbigousMappingRecursion(ClassNode classNode, MethodNode metho
117
99
}
118
100
}
119
101
}
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
+ }
120
111
}
121
112
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 ()
125
116
.flatMap (Optional ::stream )
126
117
.filter (m -> !m .getName ().equals (m .getMapped ()) && m .getMapped ().equals (method .name ) && method .desc .equals (this .remapper .mapMethodDesc (m .getDescriptor ()))
127
118
&& (m .getAccess () & (ACC_PRIVATE | ACC_STATIC )) == 0 )
128
- .count () > 1 )
129
- .orElse (false ) ;
119
+ .count ())
120
+ .orElse (0 ) : 0 ;
130
121
}
131
122
132
123
private void processMixinAnnotation (AnnotationNode annotation , PostProcessRemapper postProcessRemapper ) {
@@ -282,10 +273,6 @@ public MixinAwareEnhancedRemapper(ClassProvider classProvider, IMappingFile map,
282
273
this .flatMappings = flatMappings ;
283
274
}
284
275
285
- public ClassProvider getUpstreamProvider () {
286
- return ((IntermediaryClassProvider ) this .classProvider ).upstream ;
287
- }
288
-
289
276
@ Override
290
277
public String map (final String key ) {
291
278
String fastMapped = this .flatMappings .map (key );
0 commit comments