Skip to content

Commit aac1df5

Browse files
committed
Fix shadow warning on abstract enum constructors. Closes #2640
1 parent 9ba32dc commit aac1df5

3 files changed

Lines changed: 25 additions & 2 deletions

File tree

src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2424
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
2525
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.OVERWRITE
2626
import com.demonwav.mcdev.platform.mixin.util.accessLevel
27+
import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel
2728
import com.demonwav.mcdev.platform.mixin.util.findStubMethod
2829
import com.demonwav.mcdev.platform.mixin.util.hasModifier
2930
import com.demonwav.mcdev.platform.mixin.util.internalNameToShortName
@@ -55,7 +56,7 @@ class OverwriteModifiersInspection : OverwriteInspection() {
5556

5657
// Check access modifiers
5758
val targetAccessLevel = target.method.accessLevel
58-
val currentAccessLevel = PsiUtil.getAccessLevel(modifierList)
59+
val currentAccessLevel = modifierList.bytecodeFriendlyAccessLevel()
5960
if (currentAccessLevel < targetAccessLevel) {
6061
val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel)
6162
val currentModifier = PsiUtil.getAccessModifier(currentAccessLevel)

src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2828
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.FINAL
2929
import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember
3030
import com.demonwav.mcdev.platform.mixin.util.accessLevel
31+
import com.demonwav.mcdev.platform.mixin.util.bytecodeFriendlyAccessLevel
3132
import com.demonwav.mcdev.util.findKeyword
3233
import com.intellij.codeInsight.intention.AddAnnotationModCommandAction
3334
import com.intellij.codeInsight.intention.QuickFixFactory
@@ -88,7 +89,7 @@ class ShadowModifiersInspection : MixinInspection() {
8889

8990
// Check access level
9091
val targetAccessLevel = getTargetAccessLevel(target, shadowModifierList)
91-
val shadowAccessLevel = PsiUtil.getAccessLevel(shadowModifierList)
92+
val shadowAccessLevel = shadowModifierList.bytecodeFriendlyAccessLevel()
9293
if (targetAccessLevel != shadowAccessLevel) {
9394
val targetModifier = PsiUtil.getAccessModifier(targetAccessLevel)
9495
val shadowModifier = PsiUtil.getAccessModifier(shadowAccessLevel)

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ import com.intellij.psi.PsiDisjunctionType
4545
import com.intellij.psi.PsiElement
4646
import com.intellij.psi.PsiIntersectionType
4747
import com.intellij.psi.PsiLiteralExpression
48+
import com.intellij.psi.PsiMethod
49+
import com.intellij.psi.PsiModifier
50+
import com.intellij.psi.PsiModifierList
4851
import com.intellij.psi.PsiParameter
4952
import com.intellij.psi.PsiPrimitiveType
5053
import com.intellij.psi.PsiType
@@ -53,6 +56,7 @@ import com.intellij.psi.search.GlobalSearchScope
5356
import com.intellij.psi.util.InheritanceUtil
5457
import com.intellij.psi.util.PsiModificationTracker
5558
import com.intellij.psi.util.PsiTypesUtil
59+
import com.intellij.psi.util.PsiUtil
5660
import com.intellij.psi.util.TypeConversionUtil
5761
import org.objectweb.asm.Opcodes
5862
import org.objectweb.asm.tree.ClassNode
@@ -319,3 +323,20 @@ fun PsiElement.hasNamedLocalVariables(className: String): Boolean {
319323

320324
return true
321325
}
326+
327+
@PsiUtil.AccessLevel
328+
fun PsiModifierList.bytecodeFriendlyAccessLevel(): Int {
329+
val originalLevel = PsiUtil.getAccessLevel(this)
330+
331+
val parent = this.parent
332+
333+
// Constructors are package-local in abstract enums in the bytecode, but not in source
334+
if (parent is PsiMethod && parent.isConstructor) {
335+
val containingClass = parent.containingClass
336+
if (containingClass?.isEnum == true && containingClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
337+
return PsiUtil.ACCESS_LEVEL_PACKAGE_LOCAL
338+
}
339+
}
340+
341+
return originalLevel
342+
}

0 commit comments

Comments
 (0)