User: joe Date: 05 Nov 25 22:44 Revision: 175d500d634bd6bb193109fe43bcdcec0ccf0733 Summary: Switch from using entry points to implicit usage providers for mixin annotations. This allows ME sugars to be reported unused TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10224&personal=false Index: src/main/kotlin/platform/mixin/MixinCustomJavaDocTagProvider.kt =================================================================== --- src/main/kotlin/platform/mixin/MixinCustomJavaDocTagProvider.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/MixinCustomJavaDocTagProvider.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -20,8 +20,9 @@ package com.demonwav.mcdev.platform.mixin -import com.demonwav.mcdev.platform.mixin.util.isMixinEntryPoint +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMember import com.intellij.psi.PsiReference import com.intellij.psi.javadoc.CustomJavadocTagProvider import com.intellij.psi.javadoc.JavadocTagInfo @@ -35,8 +36,14 @@ override fun isInline() = false - override fun isValidInContext(element: PsiElement?) = isMixinEntryPoint(element) + override fun isValidInContext(element: PsiElement?): Boolean { + if (element !is PsiMember) { + return false + } + return element.annotations.any { MixinAnnotationHandler.forMixinAnnotation(it) != null } + } + override fun checkTagValue(value: PsiDocTagValue?): String? = null override fun getReference(value: PsiDocTagValue?): PsiReference? = null Index: src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -108,7 +108,7 @@ ).createSmartPointer() } - override val isEntryPoint = false + override val isImplicitlyUsed = false override val icon = MixinAssets.MIXIN_ACCESSOR_ICON Index: src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -182,7 +182,7 @@ open val isShiftAlwaysDiscouraged = true - override val isEntryPoint = true + override val isImplicitlyUsed = true override val icon = MixinAssets.MIXIN_INJECTOR_ICON Index: src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -109,7 +109,7 @@ ).createSmartPointer() } - override val isEntryPoint = false + override val isImplicitlyUsed = false override val icon = MixinAssets.MIXIN_ACCESSOR_ICON } Index: src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -76,10 +76,9 @@ val isSoft: Boolean get() = false /** - * Returns whether elements annotated with this annotation should be considered "entry points", - * i.e. not reported as unused + * Returns whether elements annotated with this annotation should not be reported as unused */ - val isEntryPoint: Boolean + val isImplicitlyUsed: Boolean val icon: Icon get() = MixinAssets.MIXIN_ELEMENT_ICON Index: src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -41,5 +41,5 @@ return "Unresolved method ${method.name} in target class" } - override val isEntryPoint = true + override val isImplicitlyUsed = true } Index: src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -101,7 +101,7 @@ return (member.name ?: return null).removePrefix(prefix) } - override val isEntryPoint = false + override val isImplicitlyUsed = false override val icon = MixinAssets.MIXIN_SHADOW_ICON Index: src/main/kotlin/platform/mixin/insight/MixinEntryPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/insight/MixinEntryPoint.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/insight/MixinEntryPoint.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -22,8 +22,6 @@ import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler -import com.demonwav.mcdev.platform.mixin.util.isMixinEntryPoint -import com.demonwav.mcdev.util.toTypedArray import com.intellij.codeInspection.reference.RefElement import com.intellij.codeInspection.visibility.EntryPointWithVisibilityLevel import com.intellij.psi.PsiElement @@ -42,18 +40,10 @@ override fun getDisplayName() = "Mixin injectors" override fun getTitle() = "Suggest private visibility level for Mixin injectors" - // TODO: support more handlers than the builtin - // need to find a way to access the project for that - override fun getIgnoreAnnotations() = - MixinAnnotationHandler.getBuiltinHandlers() - .filter { (_, handler) -> handler.isEntryPoint } - .map { (name, _) -> name } - .toTypedArray() + override fun isEntryPoint(element: PsiElement) = false - override fun isEntryPoint(element: PsiElement) = isMixinEntryPoint(element) + override fun isEntryPoint(refElement: RefElement, psiElement: PsiElement) = false - override fun isEntryPoint(refElement: RefElement, psiElement: PsiElement) = isEntryPoint(psiElement) - override fun getMinVisibilityLevel(member: PsiMember): Int { if (member !is PsiMethod) { return -1 Index: src/main/kotlin/platform/mixin/insight/MixinImplicitUsageProvider.kt =================================================================== --- src/main/kotlin/platform/mixin/insight/MixinImplicitUsageProvider.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/insight/MixinImplicitUsageProvider.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -20,11 +20,14 @@ package com.demonwav.mcdev.platform.mixin.insight +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.SHADOW +import com.demonwav.mcdev.platform.mixin.util.isMixinExtrasSugar import com.intellij.codeInsight.daemon.ImplicitUsageProvider import com.intellij.psi.PsiElement import com.intellij.psi.PsiField import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiModifierListOwner import com.intellij.psi.PsiParameter class MixinImplicitUsageProvider : ImplicitUsageProvider { @@ -40,7 +43,30 @@ return method.hasAnnotation(SHADOW) } - override fun isImplicitUsage(element: PsiElement) = isParameterInShadow(element) + private fun isHandlerImplicitlyUsed(element: PsiElement): Boolean { + if (element is PsiParameter) { + if (element.isMixinExtrasSugar) { + return false + } + + val declarationScope = element.declarationScope + return if (declarationScope is PsiMethod) { + isHandlerImplicitlyUsed(declarationScope) + } else { + false + } + } + + if (element is PsiModifierListOwner) { + return element.annotations.any { + MixinAnnotationHandler.forMixinAnnotation(it)?.isImplicitlyUsed == true + } + } + + return false + } + + override fun isImplicitUsage(element: PsiElement) = isParameterInShadow(element) || isHandlerImplicitlyUsed(element) override fun isImplicitRead(element: PsiElement) = isShadowField(element) override fun isImplicitWrite(element: PsiElement) = isShadowField(element) } Index: src/main/kotlin/platform/mixin/util/Mixin.kt =================================================================== --- src/main/kotlin/platform/mixin/util/Mixin.kt (revision 32f74189c747727e589a603ea889b8531e8f0591) +++ src/main/kotlin/platform/mixin/util/Mixin.kt (revision 175d500d634bd6bb193109fe43bcdcec0ccf0733) @@ -21,7 +21,6 @@ package com.demonwav.mcdev.platform.mixin.util import com.demonwav.mcdev.platform.mixin.action.FindMixinsAction -import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.ACCESSOR import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.INVOKER import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.MIXIN @@ -36,7 +35,6 @@ import com.demonwav.mcdev.util.resolveClassArray import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project -import com.intellij.platform.ide.progress.ModalTaskOwner.project import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiArrayType @@ -46,7 +44,6 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiIntersectionType import com.intellij.psi.PsiLiteralExpression -import com.intellij.psi.PsiMethod import com.intellij.psi.PsiParameter import com.intellij.psi.PsiPrimitiveType import com.intellij.psi.PsiType @@ -149,7 +146,7 @@ val PsiType.isLocalRef: Boolean get() { - return PsiTypesUtil.getPsiClass(this)?.qualifiedName?.startsWith(MixinConstants.MixinExtras.LOCAL_REF_PACKAGE) == true + return PsiTypesUtil.getPsiClass(this)?.qualifiedName?.startsWith(LOCAL_REF_PACKAGE) == true } fun PsiType.unwrapLocalRef(): PsiType { @@ -290,20 +287,6 @@ return result } -fun isMixinEntryPoint(element: PsiElement?): Boolean { - if (element !is PsiMethod) { - return false - } - val project = element.project - for (annotation in element.annotations) { - val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, project) - if (handler != null && handler.isEntryPoint) { - return true - } - } - return false -} - val PsiElement.isFabricMixin: Boolean get() = JavaPsiFacade.getInstance(project).findClass(MixinConstants.Classes.FABRIC_UTIL, resolveScope) != null