User: joe Date: 08 Apr 26 13:16 Revision: 576779062b1789bde62943bcdff41eec9b69f550 Summary: Add inspection for switches on enum mixins TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10499&personal=false Index: src/main/kotlin/platform/mixin/inspection/EnumMixinSwitchStatementInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/EnumMixinSwitchStatementInspection.kt (revision 576779062b1789bde62943bcdff41eec9b69f550) +++ src/main/kotlin/platform/mixin/inspection/EnumMixinSwitchStatementInspection.kt (revision 576779062b1789bde62943bcdff41eec9b69f550) @@ -0,0 +1,84 @@ +/* + * Minecraft Development for IntelliJ + * + * https://mcdev.io/ + * + * Copyright (C) 2026 minecraft-dev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation, version 3.0 only. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.demonwav.mcdev.platform.mixin.inspection + +import com.demonwav.mcdev.platform.mixin.util.isMixin +import com.demonwav.mcdev.platform.mixin.util.mixinTargets +import com.intellij.codeInspection.LocalQuickFix +import com.intellij.codeInspection.LocalQuickFixOnPsiElement +import com.intellij.codeInspection.ProblemsHolder +import com.intellij.openapi.project.Project +import com.intellij.psi.JavaElementVisitor +import com.intellij.psi.JavaPsiFacade +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiExpression +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiSwitchBlock +import com.intellij.psi.PsiSwitchExpression +import com.intellij.psi.PsiSwitchStatement +import com.intellij.psi.PsiTypeCastExpression +import com.intellij.psi.codeStyle.JavaCodeStyleManager +import com.intellij.psi.util.PsiTypesUtil + +class EnumMixinSwitchStatementInspection : MixinInspection() { + override fun getStaticDescription() = "Reports when a switch statement or expression is used on an enum mixin" + + override fun buildVisitor(holder: ProblemsHolder) = object : JavaElementVisitor() { + override fun visitSwitchStatement(statement: PsiSwitchStatement) { + visitSwitchBlock(statement) + } + + override fun visitSwitchExpression(expression: PsiSwitchExpression) { + visitSwitchBlock(expression) + } + + private fun visitSwitchBlock(block: PsiSwitchBlock) { + val expression = block.expression ?: return + val mixinClass = PsiTypesUtil.getPsiClass(expression.type) ?: return + if (!mixinClass.isEnum || !mixinClass.isMixin) { + return + } + + val fixes = mutableListOf() + val targetClass = mixinClass.mixinTargets.singleOrNull() + if (targetClass != null) { + fixes += AddCastFix(expression, targetClass.name) + } + holder.registerProblem(expression, "Switch used on enum mixin", *fixes.toTypedArray()) + } + } + + private class AddCastFix(expression: PsiExpression, private val targetClass: String) : LocalQuickFixOnPsiElement(expression) { + override fun getFamilyName() = "Add double cast to ${targetClass.substringAfterLast('/').replace('$', '.')}" + override fun getText() = "Add cast to target class ${targetClass.substringAfterLast('/').replace('$', '.')}" + + override fun invoke(project: Project, psiFile: PsiFile, startElement: PsiElement, endElement: PsiElement) { + val expression = startElement as? PsiExpression ?: return + val doubleCast = JavaPsiFacade.getElementFactory(project).createExpressionFromText( + "(${targetClass.replace('/', '.').replace('$', '.')}) (java.lang.Object) x", + expression + ) as PsiTypeCastExpression + (doubleCast.operand as PsiTypeCastExpression).operand!!.replace(expression) + val resultingExpression = expression.replace(doubleCast) + JavaCodeStyleManager.getInstance(project).shortenClassReferences(resultingExpression) + } + } +} Index: src/main/resources/META-INF/plugin.xml =================================================================== --- src/main/resources/META-INF/plugin.xml (revision 0a7af7c42d14e0b0d02197344286f6e65f7c778e) +++ src/main/resources/META-INF/plugin.xml (revision 576779062b1789bde62943bcdff41eec9b69f550) @@ -1114,6 +1114,14 @@ level="WARNING" hasStaticDescription="true" implementationClass="com.demonwav.mcdev.platform.mixin.inspection.StaticMemberInspection"/> +