User: joe Date: 22 Jun 25 20:11 Revision: 8360b831e95e44630ed3d742ea285e6f1a1f910c Summary: Always discourage shifting in injectors that can't inject anywhere (such as Redirect) TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=10080&personal=false Index: src/main/kotlin/platform/mixin/handlers/InjectAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InjectAnnotationHandler.kt (revision c554289dcc7771bd0d959c80e462714b966fb4f4) +++ src/main/kotlin/platform/mixin/handlers/InjectAnnotationHandler.kt (revision 8360b831e95e44630ed3d742ea285e6f1a1f910c) @@ -138,5 +138,7 @@ override val allowCoerce = true + override val isShiftAlwaysDiscouraged = false + override val mixinExtrasExpressionContextType = ExpressionContext.Type.INJECT } Index: src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision c554289dcc7771bd0d959c80e462714b966fb4f4) +++ src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision 8360b831e95e44630ed3d742ea285e6f1a1f910c) @@ -178,6 +178,8 @@ open val allowCoerce = false + open val isShiftAlwaysDiscouraged = true + override val isEntryPoint = true override val icon = MixinAssets.MIXIN_INJECTOR_ICON Index: src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision c554289dcc7771bd0d959c80e462714b966fb4f4) +++ src/main/kotlin/platform/mixin/handlers/ModifyVariableHandler.kt (revision 8360b831e95e44630ed3d742ea285e6f1a1f910c) @@ -89,5 +89,7 @@ return result } + override val isShiftAlwaysDiscouraged = false + override val mixinExtrasExpressionContextType = ExpressionContext.Type.MODIFY_VARIABLE } Index: src/main/kotlin/platform/mixin/inspection/injector/DiscouragedShiftInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/DiscouragedShiftInspection.kt (revision c554289dcc7771bd0d959c80e462714b966fb4f4) +++ src/main/kotlin/platform/mixin/inspection/injector/DiscouragedShiftInspection.kt (revision 8360b831e95e44630ed3d742ea285e6f1a1f910c) @@ -20,6 +20,8 @@ package com.demonwav.mcdev.platform.mixin.inspection.injector +import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.AtResolver import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.InjectionPoint import com.demonwav.mcdev.platform.mixin.inspection.MixinInspection @@ -38,13 +40,24 @@ if (!annotation.hasQualifiedName(MixinConstants.Annotations.AT)) { return } + val injectorAnnotation = AtResolver.findInjectorAnnotation(annotation) ?: return + val injector = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation, holder.project) as? InjectorAnnotationHandler + ?: return val atValue = annotation.findDeclaredAttributeValue("value") ?: return val atCode = atValue.constantStringValue ?: return val shift = AtResolver.getShift(annotation) - if (InjectionPoint.byAtCode(atCode)?.isShiftDiscouraged(shift) == true) { + if (isShiftDiscouraged(shift, injector, atCode)) { val shiftElement = annotation.findDeclaredAttributeValue("shift") ?: return holder.registerProblem(shiftElement, "Shifting like this is discouraged because it's brittle") } } } + + private fun isShiftDiscouraged(shift: Int, injector: InjectorAnnotationHandler, atCode: String): Boolean { + if (injector.isShiftAlwaysDiscouraged) { + return shift != 0 -} + } + + return InjectionPoint.byAtCode(atCode)?.isShiftDiscouraged(shift) == true + } +}