User: joe Date: 21 Jul 24 21:46 Revision: 91d44de7eceeb275ca9a6e1ee2099e3788d245f3 Summary: Fix `@ModifyVariable` method signature checking with `STORE`. Closes #2163 TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=9496&personal=false Index: src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision faef71f90ea7e46e0f0f483b0ce7ae834ca5059d) +++ src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision 91d44de7eceeb275ca9a6e1ee2099e3788d245f3) @@ -23,6 +23,7 @@ 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 @@ -47,7 +48,9 @@ val at = annotation.findAttributeValue("at") as? PsiAnnotation val atCode = at?.findAttributeValue("value")?.constantStringValue - val isLoadStore = atCode != null && InjectionPoint.byAtCode(atCode) is AbstractLoadInjectionPoint + val injectionPoint = atCode?.let { InjectionPoint.byAtCode(atCode) } + val isLoadStore = injectionPoint is AbstractLoadInjectionPoint + val isStore = injectionPoint is StoreInjectionPoint val mode = if (isLoadStore) CollectVisitor.Mode.COMPLETION else CollectVisitor.Mode.MATCH_ALL val targets = resolveInstructions(annotation, targetClass, targetMethod, mode) @@ -63,7 +66,8 @@ val possibleTypes = mutableSetOf() for (insn in targets) { - val locals = info.getLocals(module, targetClass, targetMethod, insn.insn) ?: continue + val actualInsn = if (isStore) insn.insn.next ?: insn.insn else insn.insn + val locals = info.getLocals(module, targetClass, targetMethod, actualInsn) ?: continue val matchedLocals = info.matchLocals(locals, CollectVisitor.Mode.COMPLETION, matchType = false) for (local in matchedLocals) { possibleTypes += local.desc!!