User: joe Date: 06 Nov 25 13:53 Revision: ed8b7ae8b661c3bb1966e92ae801b17044d00b57 Summary: Add setting to ignore ModifyVariable name inspection for implicit locals TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10231&personal=false Index: src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableMayUseNameInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableMayUseNameInspection.kt (revision 4a481131a25e50573ba9e876841ce2310c8a3ed5) +++ src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableMayUseNameInspection.kt (revision ed8b7ae8b661c3bb1966e92ae801b17044d00b57) @@ -33,14 +33,28 @@ import com.demonwav.mcdev.util.findAnnotation import com.demonwav.mcdev.util.findContainingClass import com.demonwav.mcdev.util.findModule +import com.intellij.codeInsight.intention.LowPriorityAction +import com.intellij.codeInspection.LocalQuickFix +import com.intellij.codeInspection.ProblemDescriptor import com.intellij.codeInspection.ProblemsHolder +import com.intellij.codeInspection.options.OptPane +import com.intellij.modcommand.ModCommand +import com.intellij.modcommand.ModCommandQuickFix +import com.intellij.openapi.project.Project import com.intellij.psi.JavaElementVisitor import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiMethod class ModifyVariableMayUseNameInspection : MixinInspection() { + @JvmField + var ignoreForImplicitLocals = false + override fun getStaticDescription() = "Reports @ModifyVariable injectors relying on index or ordinal that may use a name instead" + override fun getOptionsPane() = OptPane.pane( + OptPane.checkbox("ignoreForImplicitLocals", "Ignore for implicit locals") + ) + override fun buildVisitor(holder: ProblemsHolder) = object : JavaElementVisitor() { override fun visitMethod(method: PsiMethod) { val modifyVariable = method.findAnnotation(MODIFY_VARIABLE) ?: return @@ -51,11 +65,22 @@ MixinAnnotationHandler.forMixinAnnotation(MODIFY_VARIABLE) as? InjectorAnnotationHandler ?: return val localInfo = LocalInfo.fromAnnotation(localType, modifyVariable) + if (ignoreForImplicitLocals && localInfo.isImplicit) { + return + } + val variableName = getVariableNameToIntroduce(localInfo, injector, modifyVariable) ?: return + + val fixes = mutableListOf(ReplaceWithNameFix(modifyVariable, variableName)) + + if (localInfo.isImplicit) { + fixes += IgnoreForImplicitLocalsFix() + } + holder.registerProblem( problemElement, "@ModifyVariable can use variable name", - ReplaceWithNameFix(modifyVariable, variableName), + *fixes.toTypedArray(), ) } } @@ -68,6 +93,16 @@ override fun getFamilyName() = "Use variable name '$variableName'" } + private inner class IgnoreForImplicitLocalsFix : ModCommandQuickFix(), LowPriorityAction { + override fun getFamilyName() = "Ignore for implicit locals" + + override fun perform(project: Project, descriptor: ProblemDescriptor): ModCommand { + return ModCommand.updateInspectionOption(descriptor.psiElement, this@ModifyVariableMayUseNameInspection) { + it.ignoreForImplicitLocals = true + } + } + } + companion object { fun getVariableNameToIntroduce( localInfo: LocalInfo, Index: src/main/kotlin/platform/mixin/util/LocalInfo.kt =================================================================== --- src/main/kotlin/platform/mixin/util/LocalInfo.kt (revision 4a481131a25e50573ba9e876841ce2310c8a3ed5) +++ src/main/kotlin/platform/mixin/util/LocalInfo.kt (revision ed8b7ae8b661c3bb1966e92ae801b17044d00b57) @@ -42,6 +42,9 @@ val ordinal: Int?, val names: Set, ) { + val isImplicit: Boolean + get() = index == null && ordinal == null && names.isEmpty() + private fun getLocals( module: Module, targetClass: ClassNode,