Skip to content

Commit 81686d4

Browse files
committed
Fix capture of MixinAnnotationHandler in cached value
1 parent 7969d53 commit 81686d4

24 files changed

+47
-68
lines changed

src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,11 @@ object MEExpressionCompletionUtil {
246246

247247
val modifierList = expressionAnnotation.findContainingModifierList() ?: return emptyList()
248248

249-
val (handler, handlerAnnotation) = modifierList.annotations.mapFirstNotNull { annotation ->
250-
val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, project) ?: return@mapFirstNotNull null
251-
handler to annotation
249+
val handlerAnnotation = modifierList.annotations.firstOrNull {
250+
MixinAnnotationHandler.forMixinAnnotation(it, project) != null
252251
} ?: return emptyList()
253252

254-
return handler.resolveTarget(handlerAnnotation).flatMap { member ->
253+
return MixinAnnotationHandler.resolveTarget(handlerAnnotation).flatMap { member ->
255254
(member as? MethodTargetMember)?.classAndMethod
256255
?.let { (clazz, method) -> MEExpressionMatchUtil.getFlowMap(project, clazz, method) }
257256
?.values

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ class AccessorHandler : MixinMemberAnnotationHandler {
9898

9999
fun findAccessorTargetForReference(method: PsiMethod): SmartPsiElementPointer<PsiField>? {
100100
val accessor = method.findAnnotation(ACCESSOR) ?: return null
101-
val targetMember = resolveTarget(accessor).firstOrNull() as? FieldTargetMember ?: return null
101+
val targetMember = MixinAnnotationHandler.resolveTarget(accessor).firstOrNull() as? FieldTargetMember
102+
?: return null
102103
return targetMember.classAndField.field.findOrConstructSourceField(
103104
targetMember.classAndField.clazz,
104105
method.project,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@ class InvokerHandler : MixinMemberAnnotationHandler {
9999

100100
fun findInvokerTargetForReference(member: PsiMember): SmartPsiElementPointer<PsiMethod>? {
101101
val accessor = member.findAnnotation(INVOKER) ?: return null
102-
val invokerTarget = resolveTarget(accessor).firstOrNull() as? MethodTargetMember ?: return null
102+
val invokerTarget = MixinAnnotationHandler.resolveTarget(accessor).firstOrNull() as? MethodTargetMember
103+
?: return null
103104
return invokerTarget.classAndMethod.method.findOrConstructSourceMethod(
104105
invokerTarget.classAndMethod.clazz,
105106
member.project,

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ import javax.swing.Icon
4848
import org.objectweb.asm.tree.ClassNode
4949

5050
interface MixinAnnotationHandler {
51-
fun resolveTarget(annotation: PsiAnnotation) = annotation.cached(PsiModificationTracker.MODIFICATION_COUNT) {
52-
val containingClass = annotation.findContainingClass() ?: return@cached emptyList()
53-
containingClass.mixinTargets.flatMap { resolveTarget(annotation, it) }
54-
}
5551

5652
fun resolveTarget(annotation: PsiAnnotation, targetClass: ClassNode): List<MixinTargetMember>
5753

@@ -131,6 +127,14 @@ interface MixinAnnotationHandler {
131127

132128
return null
133129
}
130+
131+
fun resolveTarget(annotation: PsiAnnotation): List<MixinTargetMember> {
132+
return annotation.cached(PsiModificationTracker.MODIFICATION_COUNT) {
133+
val handler = forMixinAnnotation(annotation) ?: return@cached emptyList()
134+
val containingClass = annotation.findContainingClass() ?: return@cached emptyList()
135+
containingClass.mixinTargets.flatMap { handler.resolveTarget(annotation, it) }
136+
}
137+
}
134138
}
135139
}
136140

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
package com.demonwav.mcdev.platform.mixin.handlers
2222

2323
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
24-
import com.demonwav.mcdev.platform.mixin.util.MixinConstants.Annotations.OVERWRITE
2524
import com.demonwav.mcdev.platform.mixin.util.MixinTargetMember
2625
import com.demonwav.mcdev.platform.mixin.util.findMethod
2726
import com.demonwav.mcdev.util.memberReference
@@ -43,10 +42,4 @@ class OverwriteHandler : MixinMemberAnnotationHandler {
4342
}
4443

4544
override val isEntryPoint = true
46-
47-
companion object {
48-
fun getInstance(): OverwriteHandler? {
49-
return MixinAnnotationHandler.forMixinAnnotation(OVERWRITE) as? OverwriteHandler
50-
}
51-
}
5245
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,14 @@ class ShadowHandler : MixinMemberAnnotationHandler {
8080

8181
fun findFirstShadowTargetForNavigation(member: PsiMember): SmartPsiElementPointer<PsiElement>? {
8282
val shadow = member.findAnnotation(SHADOW) ?: return null
83-
val shadowTarget = resolveTarget(shadow).firstOrNull() ?: return null
83+
val shadowTarget = MixinAnnotationHandler.resolveTarget(shadow).firstOrNull() ?: return null
8484
return shadowTarget.findSourceElement(member.project, member.resolveScope, canDecompile = false)
8585
?.createSmartPointer()
8686
}
8787

8888
fun findFirstShadowTargetForReference(member: PsiMember): SmartPsiElementPointer<PsiMember>? {
8989
val shadow = member.findAnnotation(SHADOW) ?: return null
90-
val shadowTarget = resolveTarget(shadow).firstOrNull() ?: return null
90+
val shadowTarget = MixinAnnotationHandler.resolveTarget(shadow).firstOrNull() ?: return null
9191
return shadowTarget.findOrConstructSourceMember(member.project, member.resolveScope, canDecompile = false)
9292
.createSmartPointer()
9393
}

src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantInjectionPoint.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,9 @@ class ConstantInjectionPoint : InjectionPoint<PsiElement>() {
8787
override fun getArgsValues(at: PsiAnnotation, key: String): Array<Any> {
8888
fun collectTargets(constantToCompletion: (Any) -> Any?): Array<Any> {
8989
val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
90-
val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation)
91-
?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
92-
9390
val expandConditions = parseExpandConditions(AtResolver.getArgs(at))
9491

95-
return handler.resolveTarget(injectorAnnotation)
92+
return MixinAnnotationHandler.resolveTarget(injectorAnnotation)
9693
.asSequence()
9794
.filterIsInstance<MethodTargetMember>()
9895
.flatMap { target ->

src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantStringMethodInjectionPoint.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,8 @@ class ConstantStringMethodInjectionPoint : AbstractMethodInjectionPoint() {
9999
}
100100

101101
val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
102-
val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation)
103-
?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
104102

105-
return handler.resolveTarget(injectorAnnotation).asSequence()
103+
return MixinAnnotationHandler.resolveTarget(injectorAnnotation).asSequence()
106104
.filterIsInstance<MethodTargetMember>()
107105
.flatMap { target ->
108106
val insns = target.classAndMethod.method.instructions ?: return@flatMap emptySequence()

src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,8 @@ class NewInsnInjectionPoint : InjectionPoint<PsiMember>() {
7070
}
7171

7272
val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
73-
val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation)
74-
?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY
7573

76-
return handler.resolveTarget(injectorAnnotation).asSequence()
74+
return MixinAnnotationHandler.resolveTarget(injectorAnnotation).asSequence()
7775
.filterIsInstance<MethodTargetMember>()
7876
.flatMap { target ->
7977
target.classAndMethod.method.instructions?.asSequence()?.mapNotNull { insn ->

src/main/kotlin/platform/mixin/inspection/MixinAnnotationTargetInspection.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ class MixinAnnotationTargetInspection : MixinInspection() {
5151
if (parentAnnotation == null) {
5252
return
5353
}
54-
val handler = MixinAnnotationHandler.forMixinAnnotation(parentAnnotation) ?: return
55-
val targets = handler.resolveTarget(parentAnnotation).ifEmpty { return }
54+
val targets = MixinAnnotationHandler.resolveTarget(parentAnnotation).ifEmpty { return }
5655
val failure = targets.asSequence()
5756
.mapNotNull {
5857
(it as? MethodTargetMember)?.classAndMethod

0 commit comments

Comments
 (0)