User: joe Date: 31 Aug 26 12:12 Revision: aac1df5ecfa7f55ba8555515be780f03543dacff Summary: Fix shadow warning on abstract enum constructors. Closes #2640 TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10615&personal=false Index: src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f) +++ src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision aac1df5ecfa7f55ba8555515be780f03543dacff) @@ -24,6 +24,7 @@ import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.OVERWRITE import com.demonwav.mcdev.platform.mixin.util.accessLevel +import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel import com.demonwav.mcdev.platform.mixin.util.findStubMethod import com.demonwav.mcdev.platform.mixin.util.hasModifier import com.demonwav.mcdev.platform.mixin.util.internalNameToShortName @@ -55,7 +56,7 @@ // Check access modifiers val targetAccessLevel = target.method.accessLevel - val currentAccessLevel = PsiUtil.getAccessLevel(modifierList) + val currentAccessLevel = modifierList.bytecodeFriendlyAccessLevel() if (currentAccessLevel < targetAccessLevel) { val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) val currentModifier = PsiUtil.getAccessModifier(currentAccessLevel) Index: src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f) +++ src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision aac1df5ecfa7f55ba8555515be780f03543dacff) @@ -28,6 +28,7 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.FINAL import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember import com.demonwav.mcdev.platform.mixin.util.accessLevel +import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel import com.demonwav.mcdev.util.findKeyword import com.intellij.codeInsight.intention.AddAnnotationModCommandAction import com.intellij.codeInsight.intention.QuickFixFactory @@ -88,7 +89,7 @@ // Check access level val targetAccessLevel = getTargetAccessLevel(target, shadowModifierList) - val shadowAccessLevel = PsiUtil.getAccessLevel(shadowModifierList) + val shadowAccessLevel = shadowModifierList.bytecodeFriendlyAccessLevel() if (targetAccessLevel != shadowAccessLevel) { val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) val shadowModifier = PsiUtil.getAccessModifier(shadowAccessLevel) Index: src/main/kotlin/platform/mixin/util/Mixin.kt =================================================================== --- src/main/kotlin/platform/mixin/util/Mixin.kt (revision 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f) +++ src/main/kotlin/platform/mixin/util/Mixin.kt (revision aac1df5ecfa7f55ba8555515be780f03543dacff) @@ -45,6 +45,9 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiIntersectionType import com.intellij.psi.PsiLiteralExpression +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiModifier +import com.intellij.psi.PsiModifierList import com.intellij.psi.PsiParameter import com.intellij.psi.PsiPrimitiveType import com.intellij.psi.PsiType @@ -53,6 +56,7 @@ import com.intellij.psi.util.InheritanceUtil import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.PsiTypesUtil +import com.intellij.psi.util.PsiUtil import com.intellij.psi.util.TypeConversionUtil import org.objectweb.asm.Opcodes import org.objectweb.asm.tree.ClassNode @@ -319,3 +323,20 @@ return true } + +@PsiUtil.AccessLevel +fun PsiModifierList.bytecodeFriendlyAccessLevel(): Int { + val originalLevel = PsiUtil.getAccessLevel(this) + + val parent = this.parent + + // Constructors are package-local in abstract enums in the bytecode, but not in source + if (parent is PsiMethod && parent.isConstructor) { + val containingClass = parent.containingClass + if (containingClass?.isEnum == true && containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + return PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL + } + } + + return originalLevel +}