User: joe Date: 21 Jul 24 22:42 Revision: 3d0a2ca85b757ee723535bc8a12e0b3d5694f221 Summary: Apply offset of STORE in the collect visitor TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=9500&personal=false Index: src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision 3a055f849c1cacf62cf10a90e8b0298ded082cfe) +++ src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision 3d0a2ca85b757ee723535bc8a12e0b3d5694f221) @@ -23,7 +23,6 @@ import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.AbstractLoadInjectionPoint import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.CollectVisitor import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPoint -import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.StoreInjectionPoint import com.demonwav.mcdev.platform.mixin.inspection.injector.MethodSignature import com.demonwav.mcdev.platform.mixin.inspection.injector.ParameterGroup import com.demonwav.mcdev.platform.mixin.util.LocalInfo @@ -48,9 +47,7 @@ val at = annotation.findAttributeValue("at") as? PsiAnnotation val atCode = at?.findAttributeValue("value")?.constantStringValue - val injectionPoint = atCode?.let { InjectionPoint.byAtCode(atCode) } - val isLoadStore = injectionPoint is AbstractLoadInjectionPoint - val isStore = injectionPoint is StoreInjectionPoint + val isLoadStore = atCode != null && InjectionPoint.byAtCode(atCode) is AbstractLoadInjectionPoint val mode = if (isLoadStore) CollectVisitor.Mode.COMPLETION else CollectVisitor.Mode.MATCH_ALL val targets = resolveInstructions(annotation, targetClass, targetMethod, mode) @@ -66,8 +63,7 @@ val possibleTypes = mutableSetOf() for (insn in targets) { - val actualInsn = if (isStore) insn.insn.next ?: insn.insn else insn.insn - val locals = info.getLocals(module, targetClass, targetMethod, actualInsn) ?: continue + val locals = info.getLocals(module, targetClass, targetMethod, insn.insn) ?: continue val matchedLocals = info.matchLocals(locals, CollectVisitor.Mode.COMPLETION, matchType = false) for (local in matchedLocals) { possibleTypes += local.desc!! Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/LoadInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/LoadInjectionPoint.kt (revision 3a055f849c1cacf62cf10a90e8b0298ded082cfe) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/LoadInjectionPoint.kt (revision 3d0a2ca85b757ee723535bc8a12e0b3d5694f221) @@ -121,15 +121,15 @@ val project = at.project val ordinals = mutableMapOf() collectVisitor.addResultFilter("ordinal") { result, method -> - result.originalInsn as? VarInsnNode - ?: throw IllegalStateException("AbstractLoadInjectionPoint returned non-var insn") - val localInsn = if (store) { result.originalInsn.next } else { result.originalInsn } + // store returns the instruction after the variable + val varInsn = (if (store) result.originalInsn.previous ?: result.originalInsn else result.originalInsn) + as? VarInsnNode ?: throw IllegalStateException("AbstractLoadInjectionPoint returned non-var insn") val localType = AsmDfaUtil.getLocalVariableType( project, targetClass, method, - localInsn, - result.originalInsn.`var`, + result.originalInsn, + varInsn.`var`, ) ?: return@addResultFilter true val desc = localType.descriptor val ord = ordinals[desc] ?: 0 @@ -303,13 +303,13 @@ } } - val localLocation = if (store) insn.next ?: insn else insn - val locals = info.getLocals(module, targetClass, methodNode, localLocation) ?: continue + val shiftedInsn = if (store) insn.next ?: insn else insn + val locals = info.getLocals(module, targetClass, methodNode, shiftedInsn) ?: continue val elementFactory = JavaPsiFacade.getElementFactory(module.project) for (result in info.matchLocals(locals, mode)) { - addResult(insn, elementFactory.createExpressionFromText(result.name, null)) + addResult(shiftedInsn, elementFactory.createExpressionFromText(result.name, null)) } } }