User: joe Date: 31 Aug 26 12:54 Revision: 13bd343f67298d6907ed6143f788b9197f96817d Summary: Don't perform shadow access checks on constructors at all TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10622&personal=false Index: src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision c36632dde62a39ce377baa5367a3fdbae54f4b6c) +++ src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision 13bd343f67298d6907ed6143f788b9197f96817d) @@ -24,10 +24,10 @@ 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 +import com.demonwav.mcdev.platform.mixin.util.shouldDoMixinAccessChecks import com.demonwav.mcdev.util.findAnnotation import com.demonwav.mcdev.util.findKeyword import com.demonwav.mcdev.util.isAccessModifier @@ -55,18 +55,20 @@ val modifierList = method.modifierList // Check access modifiers + if (method.shouldDoMixinAccessChecks()) { - val targetAccessLevel = target.method.accessLevel + val targetAccessLevel = target.method.accessLevel - val currentAccessLevel = modifierList.bytecodeFriendlyAccessLevel() + val currentAccessLevel = PsiUtil.getAccessLevel(modifierList) - if (currentAccessLevel < targetAccessLevel) { - val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) - val currentModifier = PsiUtil.getAccessModifier(currentAccessLevel) - holder.registerProblem( - modifierList.findKeyword(currentModifier) ?: nameIdentifier, - "$currentModifier @Overwrite cannot reduce visibility of " + - "${PsiUtil.getAccessModifier(targetAccessLevel)} target method", - QuickFixFactory.getInstance().createModifierListFix(modifierList, targetModifier, true, false), - ) - } + if (currentAccessLevel < targetAccessLevel) { + val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) + val currentModifier = PsiUtil.getAccessModifier(currentAccessLevel) + holder.registerProblem( + modifierList.findKeyword(currentModifier) ?: nameIdentifier, + "$currentModifier @Overwrite cannot reduce visibility of " + + "${PsiUtil.getAccessModifier(targetAccessLevel)} target method", + QuickFixFactory.getInstance().createModifierListFix(modifierList, targetModifier, true, false), + ) + } + } for (modifier in PsiModifier.MODIFIERS) { if (isAccessModifier(modifier)) { Index: src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision c36632dde62a39ce377baa5367a3fdbae54f4b6c) +++ src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision 13bd343f67298d6907ed6143f788b9197f96817d) @@ -28,7 +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.platform.mixin.util.shouldDoMixinAccessChecks import com.demonwav.mcdev.util.findKeyword import com.intellij.codeInsight.intention.AddAnnotationModCommandAction import com.intellij.codeInsight.intention.QuickFixFactory @@ -88,19 +88,21 @@ } // Check access level + if (member.shouldDoMixinAccessChecks()) { - val targetAccessLevel = getTargetAccessLevel(target, shadowModifierList) + val targetAccessLevel = getTargetAccessLevel(target, shadowModifierList) - val shadowAccessLevel = shadowModifierList.bytecodeFriendlyAccessLevel() + val shadowAccessLevel = PsiUtil.getAccessLevel(shadowModifierList) - if (targetAccessLevel != shadowAccessLevel) { - val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) - val shadowModifier = PsiUtil.getAccessModifier(shadowAccessLevel) - holder.registerProblem( - shadowModifierList.findKeyword(shadowModifier) ?: annotation, - "Invalid access modifiers, has: $shadowModifier, but target member has: " + - PsiUtil.getAccessModifier(targetAccessLevel), - QuickFixFactory.getInstance() - .createModifierListFix(shadowModifierList, targetModifier, true, false) - ) - } + if (targetAccessLevel != shadowAccessLevel) { + val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel) + val shadowModifier = PsiUtil.getAccessModifier(shadowAccessLevel) + holder.registerProblem( + shadowModifierList.findKeyword(shadowModifier) ?: annotation, + "Invalid access modifiers, has: $shadowModifier, but target member has: " + + PsiUtil.getAccessModifier(targetAccessLevel), + QuickFixFactory.getInstance() + .createModifierListFix(shadowModifierList, targetModifier, true, false) + ) + } + } // TODO: Would it make sense to apply the @Final check to methods? if (member !is PsiField) { Index: src/main/kotlin/platform/mixin/util/Mixin.kt =================================================================== --- src/main/kotlin/platform/mixin/util/Mixin.kt (revision c36632dde62a39ce377baa5367a3fdbae54f4b6c) +++ src/main/kotlin/platform/mixin/util/Mixin.kt (revision 13bd343f67298d6907ed6143f788b9197f96817d) @@ -46,8 +46,7 @@ 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.PsiModifierListOwner import com.intellij.psi.PsiParameter import com.intellij.psi.PsiPrimitiveType import com.intellij.psi.PsiType @@ -56,7 +55,6 @@ 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 @@ -324,19 +322,10 @@ 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 +fun PsiModifierListOwner.shouldDoMixinAccessChecks(): Boolean { + if (this is PsiMethod && isConstructor) { + return false - } + } - } - return originalLevel + return true }