Skip to content

Commit ed8b7ae

Browse files
committed
Add setting to ignore ModifyVariable name inspection for implicit locals
1 parent 4a48113 commit ed8b7ae

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableMayUseNameInspection.kt

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,28 @@ import com.demonwav.mcdev.platform.mixin.util.mixinTargets
3333
import com.demonwav.mcdev.util.findAnnotation
3434
import com.demonwav.mcdev.util.findContainingClass
3535
import com.demonwav.mcdev.util.findModule
36+
import com.intellij.codeInsight.intention.LowPriorityAction
37+
import com.intellij.codeInspection.LocalQuickFix
38+
import com.intellij.codeInspection.ProblemDescriptor
3639
import com.intellij.codeInspection.ProblemsHolder
40+
import com.intellij.codeInspection.options.OptPane
41+
import com.intellij.modcommand.ModCommand
42+
import com.intellij.modcommand.ModCommandQuickFix
43+
import com.intellij.openapi.project.Project
3744
import com.intellij.psi.JavaElementVisitor
3845
import com.intellij.psi.PsiAnnotation
3946
import com.intellij.psi.PsiMethod
4047

4148
class ModifyVariableMayUseNameInspection : MixinInspection() {
49+
@JvmField
50+
var ignoreForImplicitLocals = false
51+
4252
override fun getStaticDescription() = "Reports @ModifyVariable injectors relying on index or ordinal that may use a name instead"
4353

54+
override fun getOptionsPane() = OptPane.pane(
55+
OptPane.checkbox("ignoreForImplicitLocals", "Ignore for implicit locals")
56+
)
57+
4458
override fun buildVisitor(holder: ProblemsHolder) = object : JavaElementVisitor() {
4559
override fun visitMethod(method: PsiMethod) {
4660
val modifyVariable = method.findAnnotation(MODIFY_VARIABLE) ?: return
@@ -51,11 +65,22 @@ class ModifyVariableMayUseNameInspection : MixinInspection() {
5165
MixinAnnotationHandler.forMixinAnnotation(MODIFY_VARIABLE) as? InjectorAnnotationHandler ?: return
5266
val localInfo = LocalInfo.fromAnnotation(localType, modifyVariable)
5367

68+
if (ignoreForImplicitLocals && localInfo.isImplicit) {
69+
return
70+
}
71+
5472
val variableName = getVariableNameToIntroduce(localInfo, injector, modifyVariable) ?: return
73+
74+
val fixes = mutableListOf<LocalQuickFix>(ReplaceWithNameFix(modifyVariable, variableName))
75+
76+
if (localInfo.isImplicit) {
77+
fixes += IgnoreForImplicitLocalsFix()
78+
}
79+
5580
holder.registerProblem(
5681
problemElement,
5782
"@ModifyVariable can use variable name",
58-
ReplaceWithNameFix(modifyVariable, variableName),
83+
*fixes.toTypedArray(),
5984
)
6085
}
6186
}
@@ -68,6 +93,16 @@ class ModifyVariableMayUseNameInspection : MixinInspection() {
6893
override fun getFamilyName() = "Use variable name '$variableName'"
6994
}
7095

96+
private inner class IgnoreForImplicitLocalsFix : ModCommandQuickFix(), LowPriorityAction {
97+
override fun getFamilyName() = "Ignore for implicit locals"
98+
99+
override fun perform(project: Project, descriptor: ProblemDescriptor): ModCommand {
100+
return ModCommand.updateInspectionOption(descriptor.psiElement, this@ModifyVariableMayUseNameInspection) {
101+
it.ignoreForImplicitLocals = true
102+
}
103+
}
104+
}
105+
71106
companion object {
72107
fun getVariableNameToIntroduce(
73108
localInfo: LocalInfo,

src/main/kotlin/platform/mixin/util/LocalInfo.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ class LocalInfo(
4242
val ordinal: Int?,
4343
val names: Set<String>,
4444
) {
45+
val isImplicit: Boolean
46+
get() = index == null && ordinal == null && names.isEmpty()
47+
4548
private fun getLocals(
4649
module: Module,
4750
targetClass: ClassNode,

0 commit comments

Comments
 (0)