5757import org .objectweb .asm .ClassVisitor ;
5858import org .objectweb .asm .ClassWriter ;
5959import org .objectweb .asm .FieldVisitor ;
60+ import org .objectweb .asm .Label ;
6061import org .objectweb .asm .MethodVisitor ;
6162import org .objectweb .asm .Opcodes ;
6263import org .objectweb .asm .RecordComponentVisitor ;
6768import net .fabricmc .tinyremapper .IMappingProvider .Member ;
6869import net .fabricmc .tinyremapper .api .TrClass ;
6970import net .fabricmc .tinyremapper .api .TrEnvironment ;
71+ import net .fabricmc .tinyremapper .api .TrLocal ;
7072import net .fabricmc .tinyremapper .api .TrLogger ;
7173import net .fabricmc .tinyremapper .api .TrMember ;
7274import net .fabricmc .tinyremapper .api .TrMember .MemberType ;
75+ import net .fabricmc .tinyremapper .extension .mixin .common .data .Constant ;
7376
7477public class TinyRemapper {
7578 public static class Builder {
@@ -183,6 +186,14 @@ public Builder inferNameFromSameLvIndex(boolean value) {
183186 return this ;
184187 }
185188
189+ /**
190+ * Whether to disable the tracking of local variable names, used in ModifyVariable local name remapping.
191+ */
192+ public Builder disableLocalVariableTracking (boolean value ) {
193+ this .disableLocalVariableTracking = value ;
194+ return this ;
195+ }
196+
186197 @ Deprecated
187198 public Builder extraAnalyzeVisitor (ClassVisitor visitor ) {
188199 return extraAnalyzeVisitor ((mrjVersion , className , next ) -> {
@@ -233,7 +244,7 @@ public TinyRemapper build() {
233244 propagateBridges , propagateRecordComponents ,
234245 removeFrames , ignoreConflicts , resolveMissing , checkPackageAccess || fixPackageAccess , fixPackageAccess ,
235246 rebuildSourceFilenames , skipLocalMapping , renameInvalidLocals , invalidLvNamePattern , inferNameFromSameLvIndex ,
236- analyzeVisitors , stateProcessors , preApplyVisitors , postApplyVisitors ,
247+ disableLocalVariableTracking || skipLocalMapping , analyzeVisitors , stateProcessors , preApplyVisitors , postApplyVisitors ,
237248 extraRemapper , logger );
238249
239250 return remapper ;
@@ -258,6 +269,7 @@ public TinyRemapper build() {
258269 private boolean renameInvalidLocals = false ;
259270 private Pattern invalidLvNamePattern ;
260271 private boolean inferNameFromSameLvIndex ;
272+ private boolean disableLocalVariableTracking = false ;
261273 private final List <AnalyzeVisitorProvider > analyzeVisitors = new ArrayList <>();
262274 private final List <StateProcessor > stateProcessors = new ArrayList <>();
263275 private final List <ApplyVisitorProvider > preApplyVisitors = new ArrayList <>();
@@ -321,6 +333,7 @@ private TinyRemapper(Collection<IMappingProvider> mappingProviders, boolean igno
321333 boolean rebuildSourceFilenames ,
322334 boolean skipLocalMapping ,
323335 boolean renameInvalidLocals , Pattern invalidLvNamePattern , boolean inferNameFromSameLvIndex ,
336+ boolean disableLocalVariableTracking ,
324337 List <AnalyzeVisitorProvider > analyzeVisitors , List <StateProcessor > stateProcessors ,
325338 List <ApplyVisitorProvider > preApplyVisitors , List <ApplyVisitorProvider > postApplyVisitors ,
326339 Remapper extraRemapper , TrLogger logger ) {
@@ -345,6 +358,7 @@ private TinyRemapper(Collection<IMappingProvider> mappingProviders, boolean igno
345358 this .renameInvalidLocals = renameInvalidLocals ;
346359 this .invalidLvNamePattern = invalidLvNamePattern ;
347360 this .inferNameFromSameLvIndex = inferNameFromSameLvIndex ;
361+ this .disableLocalVariableTracking = disableLocalVariableTracking ;
348362 this .analyzeVisitors = analyzeVisitors ;
349363 this .stateProcessors = stateProcessors ;
350364 this .preApplyVisitors = preApplyVisitors ;
@@ -643,10 +657,29 @@ public void visit(int version, int access, String name, String signature, String
643657
644658 @ Override
645659 public MethodVisitor visitMethod (int access , String name , String desc , String signature , String [] exceptions ) {
646- MemberInstance prev = ret .addMember (new MemberInstance (TrMember .MemberType .METHOD , ret , name , desc , access , ret .getMembers ().size ()));
660+ MemberInstance member = new MemberInstance (MemberType .METHOD , ret , name , desc , access , ret .getMembers ().size ());
661+ MemberInstance prev = ret .addMember (member );
647662 if (prev != null ) throw new RuntimeException (String .format ("duplicate method %s/%s%s in inputs" , ret .getName (), name , desc ));
648663
649- return super .visitMethod (access , name , desc , signature , exceptions );
664+ if (TinyRemapper .this .disableLocalVariableTracking ) {
665+ return super .visitMethod (access , name , desc , signature , exceptions );
666+ } else {
667+ return new MethodVisitor (Constant .ASM_VERSION , super .visitMethod (access , name , desc , signature , exceptions )) {
668+ final List <TrLocal > locals = new ArrayList <>();
669+
670+ @ Override
671+ public void visitLocalVariable (String name , String descriptor , String signature , Label start , Label end , int index ) {
672+ this .locals .add (new LocalInstance (member , name , descriptor , index ));
673+ super .visitLocalVariable (name , descriptor , signature , start , end , index );
674+ }
675+
676+ @ Override
677+ public void visitEnd () {
678+ member .setLocals (locals .toArray (new TrLocal [0 ]));
679+ super .visitEnd ();
680+ }
681+ };
682+ }
650683 }
651684
652685 @ Override
@@ -662,7 +695,11 @@ public FieldVisitor visitField(int access, String name, String desc, String sign
662695 cv = analyzeVisitors .get (i ).insertAnalyzeVisitor (isInput , mrjVersion , name , cv , tags );
663696 }
664697
665- reader .accept (cv , ClassReader .SKIP_DEBUG | ClassReader .SKIP_FRAMES | ClassReader .SKIP_CODE );
698+ if (this .disableLocalVariableTracking ) {
699+ reader .accept (cv , ClassReader .SKIP_DEBUG | ClassReader .SKIP_FRAMES | ClassReader .SKIP_CODE );
700+ } else {
701+ reader .accept (cv , ClassReader .SKIP_FRAMES );
702+ }
666703
667704 return ret ;
668705 }
@@ -1454,6 +1491,7 @@ public void propagate(TrMember m, String newName) {
14541491 private final boolean renameInvalidLocals ;
14551492 private final Pattern invalidLvNamePattern ;
14561493 private final boolean inferNameFromSameLvIndex ;
1494+ private final boolean disableLocalVariableTracking ;
14571495 private final List <AnalyzeVisitorProvider > analyzeVisitors ;
14581496 private final List <StateProcessor > stateProcessors ;
14591497 private final List <ApplyVisitorProvider > preApplyVisitors ;
0 commit comments