Skip to content

Commit 175d500

Browse files
committed
Switch from using entry points to implicit usage providers for mixin annotations. This allows ME sugars to be reported unused
1 parent 32f7418 commit 175d500

File tree

10 files changed

+46
-41
lines changed

10 files changed

+46
-41
lines changed

src/main/kotlin/platform/mixin/MixinCustomJavaDocTagProvider.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@
2020

2121
package com.demonwav.mcdev.platform.mixin
2222

23-
import com.demonwav.mcdev.platform.mixin.util.isMixinEntryPoint
23+
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2424
import com.intellij.psi.PsiElement
25+
import com.intellij.psi.PsiMember
2526
import com.intellij.psi.PsiReference
2627
import com.intellij.psi.javadoc.CustomJavadocTagProvider
2728
import com.intellij.psi.javadoc.JavadocTagInfo
@@ -35,7 +36,13 @@ class MixinCustomJavaDocTagProvider : CustomJavadocTagProvider {
3536

3637
override fun isInline() = false
3738

38-
override fun isValidInContext(element: PsiElement?) = isMixinEntryPoint(element)
39+
override fun isValidInContext(element: PsiElement?): Boolean {
40+
if (element !is PsiMember) {
41+
return false
42+
}
43+
44+
return element.annotations.any { MixinAnnotationHandler.forMixinAnnotation(it) != null }
45+
}
3946

4047
override fun checkTagValue(value: PsiDocTagValue?): String? = null
4148
override fun getReference(value: PsiDocTagValue?): PsiReference? = null

src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class AccessorHandler : MixinMemberAnnotationHandler {
108108
).createSmartPointer()
109109
}
110110

111-
override val isEntryPoint = false
111+
override val isImplicitlyUsed = false
112112

113113
override val icon = MixinAssets.MIXIN_ACCESSOR_ICON
114114

src/main/kotlin/platform/mixin/handlers/InjectorAnnotationHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ abstract class InjectorAnnotationHandler : MixinAnnotationHandler {
182182

183183
open val isShiftAlwaysDiscouraged = true
184184

185-
override val isEntryPoint = true
185+
override val isImplicitlyUsed = true
186186

187187
override val icon = MixinAssets.MIXIN_INJECTOR_ICON
188188

src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class InvokerHandler : MixinMemberAnnotationHandler {
109109
).createSmartPointer()
110110
}
111111

112-
override val isEntryPoint = false
112+
override val isImplicitlyUsed = false
113113

114114
override val icon = MixinAssets.MIXIN_ACCESSOR_ICON
115115
}

src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,9 @@ interface MixinAnnotationHandler {
7676
val isSoft: Boolean get() = false
7777

7878
/**
79-
* Returns whether elements annotated with this annotation should be considered "entry points",
80-
* i.e. not reported as unused
79+
* Returns whether elements annotated with this annotation should not be reported as unused
8180
*/
82-
val isEntryPoint: Boolean
81+
val isImplicitlyUsed: Boolean
8382

8483
val icon: Icon get() = MixinAssets.MIXIN_ELEMENT_ICON
8584

src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,5 @@ class OverwriteHandler : MixinMemberAnnotationHandler {
4141
return "Unresolved method ${method.name} in target class"
4242
}
4343

44-
override val isEntryPoint = true
44+
override val isImplicitlyUsed = true
4545
}

src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class ShadowHandler : MixinMemberAnnotationHandler {
101101
return (member.name ?: return null).removePrefix(prefix)
102102
}
103103

104-
override val isEntryPoint = false
104+
override val isImplicitlyUsed = false
105105

106106
override val icon = MixinAssets.MIXIN_SHADOW_ICON
107107

src/main/kotlin/platform/mixin/insight/MixinEntryPoint.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ package com.demonwav.mcdev.platform.mixin.insight
2222

2323
import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler
2424
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
25-
import com.demonwav.mcdev.platform.mixin.util.isMixinEntryPoint
26-
import com.demonwav.mcdev.util.toTypedArray
2725
import com.intellij.codeInspection.reference.RefElement
2826
import com.intellij.codeInspection.visibility.EntryPointWithVisibilityLevel
2927
import com.intellij.psi.PsiElement
@@ -42,17 +40,9 @@ class MixinEntryPoint : EntryPointWithVisibilityLevel() {
4240
override fun getDisplayName() = "Mixin injectors"
4341
override fun getTitle() = "Suggest private visibility level for Mixin injectors"
4442

45-
// TODO: support more handlers than the builtin
46-
// need to find a way to access the project for that
47-
override fun getIgnoreAnnotations() =
48-
MixinAnnotationHandler.getBuiltinHandlers()
49-
.filter { (_, handler) -> handler.isEntryPoint }
50-
.map { (name, _) -> name }
51-
.toTypedArray()
43+
override fun isEntryPoint(element: PsiElement) = false
5244

53-
override fun isEntryPoint(element: PsiElement) = isMixinEntryPoint(element)
54-
55-
override fun isEntryPoint(refElement: RefElement, psiElement: PsiElement) = isEntryPoint(psiElement)
45+
override fun isEntryPoint(refElement: RefElement, psiElement: PsiElement) = false
5646

5747
override fun getMinVisibilityLevel(member: PsiMember): Int {
5848
if (member !is PsiMethod) {

src/main/kotlin/platform/mixin/insight/MixinImplicitUsageProvider.kt

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@
2020

2121
package com.demonwav.mcdev.platform.mixin.insight
2222

23+
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2324
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.SHADOW
25+
import com.demonwav.mcdev.platform.mixin.util.isMixinExtrasSugar
2426
import com.intellij.codeInsight.daemon.ImplicitUsageProvider
2527
import com.intellij.psi.PsiElement
2628
import com.intellij.psi.PsiField
2729
import com.intellij.psi.PsiMethod
30+
import com.intellij.psi.PsiModifierListOwner
2831
import com.intellij.psi.PsiParameter
2932

3033
class MixinImplicitUsageProvider : ImplicitUsageProvider {
@@ -40,7 +43,30 @@ class MixinImplicitUsageProvider : ImplicitUsageProvider {
4043
return method.hasAnnotation(SHADOW)
4144
}
4245

43-
override fun isImplicitUsage(element: PsiElement) = isParameterInShadow(element)
46+
private fun isHandlerImplicitlyUsed(element: PsiElement): Boolean {
47+
if (element is PsiParameter) {
48+
if (element.isMixinExtrasSugar) {
49+
return false
50+
}
51+
52+
val declarationScope = element.declarationScope
53+
return if (declarationScope is PsiMethod) {
54+
isHandlerImplicitlyUsed(declarationScope)
55+
} else {
56+
false
57+
}
58+
}
59+
60+
if (element is PsiModifierListOwner) {
61+
return element.annotations.any {
62+
MixinAnnotationHandler.forMixinAnnotation(it)?.isImplicitlyUsed == true
63+
}
64+
}
65+
66+
return false
67+
}
68+
69+
override fun isImplicitUsage(element: PsiElement) = isParameterInShadow(element) || isHandlerImplicitlyUsed(element)
4470
override fun isImplicitRead(element: PsiElement) = isShadowField(element)
4571
override fun isImplicitWrite(element: PsiElement) = isShadowField(element)
4672
}

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

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
package com.demonwav.mcdev.platform.mixin.util
2222

2323
import com.demonwav.mcdev.platform.mixin.action.FindMixinsAction
24-
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2524
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.ACCESSOR
2625
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.INVOKER
2726
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.MIXIN
@@ -36,7 +35,6 @@ import com.demonwav.mcdev.util.findModule
3635
import com.demonwav.mcdev.util.resolveClassArray
3736
import com.intellij.openapi.module.Module
3837
import com.intellij.openapi.project.Project
39-
import com.intellij.platform.ide.progress.ModalTaskOwner.project
4038
import com.intellij.psi.JavaPsiFacade
4139
import com.intellij.psi.PsiAnnotation
4240
import com.intellij.psi.PsiArrayType
@@ -46,7 +44,6 @@ import com.intellij.psi.PsiDisjunctionType
4644
import com.intellij.psi.PsiElement
4745
import com.intellij.psi.PsiIntersectionType
4846
import com.intellij.psi.PsiLiteralExpression
49-
import com.intellij.psi.PsiMethod
5047
import com.intellij.psi.PsiParameter
5148
import com.intellij.psi.PsiPrimitiveType
5249
import com.intellij.psi.PsiType
@@ -149,7 +146,7 @@ val PsiParameter.isMixinExtrasSugar: Boolean
149146

150147
val PsiType.isLocalRef: Boolean
151148
get() {
152-
return PsiTypesUtil.getPsiClass(this)?.qualifiedName?.startsWith(MixinConstants.MixinExtras.LOCAL_REF_PACKAGE) == true
149+
return PsiTypesUtil.getPsiClass(this)?.qualifiedName?.startsWith(LOCAL_REF_PACKAGE) == true
153150
}
154151

155152
fun PsiType.unwrapLocalRef(): PsiType {
@@ -290,20 +287,6 @@ private fun isClassAssignable(leftClass: PsiClass, rightClass: PsiClass): Boolea
290287
return result
291288
}
292289

293-
fun isMixinEntryPoint(element: PsiElement?): Boolean {
294-
if (element !is PsiMethod) {
295-
return false
296-
}
297-
val project = element.project
298-
for (annotation in element.annotations) {
299-
val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, project)
300-
if (handler != null && handler.isEntryPoint) {
301-
return true
302-
}
303-
}
304-
return false
305-
}
306-
307290
val PsiElement.isFabricMixin: Boolean get() =
308291
JavaPsiFacade.getInstance(project).findClass(MixinConstants.Classes.FABRIC_UTIL, resolveScope) != null
309292

0 commit comments

Comments
 (0)