User: joe Date: 25 Feb 25 13:44 Revision: 81686d4628190e6dbf00473e37ac8db7d89d4d3c Summary: Fix capture of MixinAnnotationHandler in cached value TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9851&personal=false Index: src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt =================================================================== --- src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/expression/MEExpressionCompletionUtil.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -246,12 +246,11 @@ val modifierList = expressionAnnotation.findContainingModifierList() ?: return emptyList() - val (handler, handlerAnnotation) = modifierList.annotations.mapFirstNotNull { annotation -> - val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, project) ?: return@mapFirstNotNull null - handler to annotation + val handlerAnnotation = modifierList.annotations.firstOrNull { + MixinAnnotationHandler.forMixinAnnotation(it, project) != null } ?: return emptyList() - return handler.resolveTarget(handlerAnnotation).flatMap { member -> + return MixinAnnotationHandler.resolveTarget(handlerAnnotation).flatMap { member -> (member as? MethodTargetMember)?.classAndMethod ?.let { (clazz, method) -> MEExpressionMatchUtil.getFlowMap(project, clazz, method) } ?.values Index: src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/AccessorHandler.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -98,7 +98,8 @@ fun findAccessorTargetForReference(method: PsiMethod): SmartPsiElementPointer? { val accessor = method.findAnnotation(ACCESSOR) ?: return null - val targetMember = resolveTarget(accessor).firstOrNull() as? FieldTargetMember ?: return null + val targetMember = MixinAnnotationHandler.resolveTarget(accessor).firstOrNull() as? FieldTargetMember + ?: return null return targetMember.classAndField.field.findOrConstructSourceField( targetMember.classAndField.clazz, method.project, Index: src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/InvokerHandler.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -99,7 +99,8 @@ fun findInvokerTargetForReference(member: PsiMember): SmartPsiElementPointer? { val accessor = member.findAnnotation(INVOKER) ?: return null - val invokerTarget = resolveTarget(accessor).firstOrNull() as? MethodTargetMember ?: return null + val invokerTarget = MixinAnnotationHandler.resolveTarget(accessor).firstOrNull() as? MethodTargetMember + ?: return null return invokerTarget.classAndMethod.method.findOrConstructSourceMethod( invokerTarget.classAndMethod.clazz, member.project, Index: src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/MixinAnnotationHandler.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -48,10 +48,6 @@ import org.objectweb.asm.tree.ClassNode interface MixinAnnotationHandler { - fun resolveTarget(annotation: PsiAnnotation) = annotation.cached(PsiModificationTracker.MODIFICATION_COUNT) { - val containingClass = annotation.findContainingClass() ?: return@cached emptyList() - containingClass.mixinTargets.flatMap { resolveTarget(annotation, it) } - } fun resolveTarget(annotation: PsiAnnotation, targetClass: ClassNode): List @@ -131,8 +127,16 @@ return null } + + fun resolveTarget(annotation: PsiAnnotation): List { + return annotation.cached(PsiModificationTracker.MODIFICATION_COUNT) { + val handler = forMixinAnnotation(annotation) ?: return@cached emptyList() + val containingClass = annotation.findContainingClass() ?: return@cached emptyList() + containingClass.mixinTargets.flatMap { handler.resolveTarget(annotation, it) } - } -} + } + } + } +} class MixinAnnotationHandlerInfo : BaseKeyedLazyInstance(), KeyedLazyInstance { Index: src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/OverwriteHandler.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -21,7 +21,6 @@ package com.demonwav.mcdev.platform.mixin.handlers 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.MixinTargetMember import com.demonwav.mcdev.platform.mixin.util.findMethod import com.demonwav.mcdev.util.memberReference @@ -43,10 +42,4 @@ } override val isEntryPoint = true - - companion object { - fun getInstance(): OverwriteHandler? { - return MixinAnnotationHandler.forMixinAnnotation(OVERWRITE) as? OverwriteHandler - } +} - } -} Index: src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/ShadowHandler.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -80,14 +80,14 @@ fun findFirstShadowTargetForNavigation(member: PsiMember): SmartPsiElementPointer? { val shadow = member.findAnnotation(SHADOW) ?: return null - val shadowTarget = resolveTarget(shadow).firstOrNull() ?: return null + val shadowTarget = MixinAnnotationHandler.resolveTarget(shadow).firstOrNull() ?: return null return shadowTarget.findSourceElement(member.project, member.resolveScope, canDecompile = false) ?.createSmartPointer() } fun findFirstShadowTargetForReference(member: PsiMember): SmartPsiElementPointer? { val shadow = member.findAnnotation(SHADOW) ?: return null - val shadowTarget = resolveTarget(shadow).firstOrNull() ?: return null + val shadowTarget = MixinAnnotationHandler.resolveTarget(shadow).firstOrNull() ?: return null return shadowTarget.findOrConstructSourceMember(member.project, member.resolveScope, canDecompile = false) .createSmartPointer() } Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantInjectionPoint.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantInjectionPoint.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -87,12 +87,9 @@ override fun getArgsValues(at: PsiAnnotation, key: String): Array { fun collectTargets(constantToCompletion: (Any) -> Any?): Array { val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation) - ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - val expandConditions = parseExpandConditions(AtResolver.getArgs(at)) - return handler.resolveTarget(injectorAnnotation) + return MixinAnnotationHandler.resolveTarget(injectorAnnotation) .asSequence() .filterIsInstance() .flatMap { target -> Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantStringMethodInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantStringMethodInjectionPoint.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/ConstantStringMethodInjectionPoint.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -99,10 +99,8 @@ } val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation) - ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - return handler.resolveTarget(injectorAnnotation).asSequence() + return MixinAnnotationHandler.resolveTarget(injectorAnnotation).asSequence() .filterIsInstance() .flatMap { target -> val insns = target.classAndMethod.method.instructions ?: return@flatMap emptySequence() Index: src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt =================================================================== --- src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/handlers/injectionPoint/NewInsnInjectionPoint.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -70,10 +70,8 @@ } val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation) - ?: return ArrayUtilRt.EMPTY_OBJECT_ARRAY - return handler.resolveTarget(injectorAnnotation).asSequence() + return MixinAnnotationHandler.resolveTarget(injectorAnnotation).asSequence() .filterIsInstance() .flatMap { target -> target.classAndMethod.method.instructions?.asSequence()?.mapNotNull { insn -> Index: src/main/kotlin/platform/mixin/inspection/MixinAnnotationTargetInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/MixinAnnotationTargetInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/MixinAnnotationTargetInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -51,8 +51,7 @@ if (parentAnnotation == null) { return } - val handler = MixinAnnotationHandler.forMixinAnnotation(parentAnnotation) ?: return - val targets = handler.resolveTarget(parentAnnotation).ifEmpty { return } + val targets = MixinAnnotationHandler.resolveTarget(parentAnnotation).ifEmpty { return } val failure = targets.asSequence() .mapNotNull { (it as? MethodTargetMember)?.classAndMethod Index: src/main/kotlin/platform/mixin/inspection/injector/CancellableBeforeSuperCallInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/CancellableBeforeSuperCallInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/CancellableBeforeSuperCallInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -64,7 +64,7 @@ val handler = MixinAnnotationHandler.forMixinAnnotation(MixinConstants.Annotations.INJECT)!! as InjectorAnnotationHandler - for (target in handler.resolveTarget(annotation)) { + for (target in MixinAnnotationHandler.resolveTarget(annotation)) { if (target !is MethodTargetMember) { continue } Index: src/main/kotlin/platform/mixin/inspection/injector/CtorHeadPostInitInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/CtorHeadPostInitInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/CtorHeadPostInitInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -57,8 +57,8 @@ } val injectorAnnotation = AtResolver.findInjectorAnnotation(annotation) ?: return - val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation, holder.project) ?: return - val targets = handler.resolveTarget(injectorAnnotation).filterIsInstance() + val targets = MixinAnnotationHandler.resolveTarget(injectorAnnotation) + .filterIsInstance() if (targets.any { it.classAndMethod.method.isConstructor && Index: src/main/kotlin/platform/mixin/inspection/injector/CtorHeadUsedForNonConstructorInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/CtorHeadUsedForNonConstructorInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/CtorHeadUsedForNonConstructorInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -41,7 +41,7 @@ if (atValue.constantValue != "CTOR_HEAD") { return } - if (!UnnecessaryUnsafeInspection.mightTargetConstructor(holder.project, annotation)) { + if (!UnnecessaryUnsafeInspection.mightTargetConstructor(annotation)) { holder.registerProblem( atValue, "CTOR_HEAD used without targeting a constructor", Index: src/main/kotlin/platform/mixin/inspection/injector/InjectCouldBeOverwriteInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/InjectCouldBeOverwriteInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/InjectCouldBeOverwriteInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -108,9 +108,9 @@ } // check there is only one target - val injectHandler = MixinAnnotationHandler.forMixinAnnotation(MixinConstants.Annotations.INJECT)!! - val targetMethod = (injectHandler.resolveTarget(injectAnnotation).singleOrNull() as? MethodTargetMember) + val targetMethod = + (MixinAnnotationHandler.resolveTarget(injectAnnotation).singleOrNull() as? MethodTargetMember) - ?.classAndMethod ?: return + ?.classAndMethod ?: return // can't overwrite constructors / static initializers if (targetMethod.method.isConstructor || targetMethod.method.isClinit) { Index: src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/InjectIntoConstructorInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -20,7 +20,6 @@ package com.demonwav.mcdev.platform.mixin.inspection.injector -import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.handlers.injectionPoint.AtResolver import com.demonwav.mcdev.platform.mixin.inspection.MixinInspection @@ -64,8 +63,7 @@ override fun visitMethod(method: PsiMethod) { val injectAnnotation = method.findAnnotation(INJECT) ?: return val problemElement = injectAnnotation.nameReferenceElement ?: return - val handler = MixinAnnotationHandler.forMixinAnnotation(INJECT) as? InjectorAnnotationHandler ?: return - val targets = handler.resolveTarget(injectAnnotation) + val targets = MixinAnnotationHandler.resolveTarget(injectAnnotation) val ats = injectAnnotation.findDeclaredAttributeValue("at") ?.findAnnotations() Index: src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableArgsOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableArgsOnlyInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/ModifyVariableArgsOnlyInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -51,8 +51,7 @@ val wantedType = method.parameterList.getParameter(0)?.type ?: return val problemElement = modifyVariable.nameReferenceElement ?: return - val handler = MixinAnnotationHandler.forMixinAnnotation(MODIFY_VARIABLE) ?: return - val targets = handler.resolveTarget(modifyVariable).ifEmpty { return } + val targets = MixinAnnotationHandler.resolveTarget(modifyVariable).ifEmpty { return } val methodTargets = targets.asSequence() .filterIsInstance() .map { it.classAndMethod } Index: src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/injector/UnnecessaryUnsafeInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -32,7 +32,6 @@ import com.demonwav.mcdev.util.findInspection import com.demonwav.mcdev.util.ifEmpty import com.intellij.codeInspection.ProblemsHolder -import com.intellij.openapi.project.Project import com.intellij.psi.JavaElementVisitor import com.intellij.psi.PsiAnnotation import com.intellij.psi.PsiElementVisitor @@ -81,7 +80,7 @@ return } - if (alwaysUnnecessary || !mightTargetConstructor(holder.project, annotation)) { + if (alwaysUnnecessary || !mightTargetConstructor(annotation)) { holder.registerProblem( unsafeValue, "Unnecessary unsafe = true", @@ -93,11 +92,10 @@ } companion object { - fun mightTargetConstructor(project: Project, at: PsiAnnotation): Boolean { + fun mightTargetConstructor(at: PsiAnnotation): Boolean { val injectorAnnotation = AtResolver.findInjectorAnnotation(at) ?: return true - val handler = MixinAnnotationHandler.forMixinAnnotation(injectorAnnotation, project) ?: return true - val targets = handler.resolveTarget(injectorAnnotation) + val targets = MixinAnnotationHandler.resolveTarget(injectorAnnotation) .filterIsInstance() .ifEmpty { return true } Index: src/main/kotlin/platform/mixin/inspection/mixinextras/LocalArgsOnlyInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/mixinextras/LocalArgsOnlyInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/mixinextras/LocalArgsOnlyInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -53,9 +53,7 @@ val method = parameter.findContainingMethod() ?: return val targets = method.annotations.mapFirstNotNull { annotation -> - val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, holder.project) - ?: return@mapFirstNotNull null - handler.resolveTarget(annotation).asSequence() + MixinAnnotationHandler.resolveTarget(annotation).asSequence() .filterIsInstance() .map { it.classAndMethod } } ?: return Index: src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/overwrite/OverwriteModifiersInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -20,7 +20,7 @@ package com.demonwav.mcdev.platform.mixin.inspection.overwrite -import com.demonwav.mcdev.platform.mixin.handlers.OverwriteHandler +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler 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 @@ -47,8 +47,7 @@ override fun visitOverwrite(holder: ProblemsHolder, method: PsiMethod, overwrite: PsiAnnotation) { val overwriteAnnotation = method.getAnnotation(OVERWRITE) ?: return - val overwriteHandler = OverwriteHandler.getInstance() ?: return - val target = (overwriteHandler.resolveTarget(overwriteAnnotation).firstOrNull() as? MethodTargetMember) + val target = (MixinAnnotationHandler.resolveTarget(overwriteAnnotation).firstOrNull() as? MethodTargetMember) ?.classAndMethod ?: return val nameIdentifier = method.nameIdentifier ?: return val modifierList = method.modifierList Index: src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt =================================================================== --- src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/inspection/shadow/ShadowModifiersInspection.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -20,7 +20,7 @@ package com.demonwav.mcdev.platform.mixin.inspection.shadow -import com.demonwav.mcdev.platform.mixin.handlers.ShadowHandler +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.inspection.MixinInspection import com.demonwav.mcdev.platform.mixin.util.FieldTargetMember import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember @@ -61,7 +61,7 @@ val shadowModifierList = annotation.owner as? PsiModifierList ?: return val member = shadowModifierList.parent as? PsiMember ?: return - val target = ShadowHandler.getInstance()?.resolveTarget(annotation)?.firstOrNull() ?: return + val target = MixinAnnotationHandler.resolveTarget(annotation).firstOrNull() ?: return // Check static modifier val targetStatic = (target.access and Opcodes.ACC_STATIC) != 0 Index: src/main/kotlin/platform/mixin/reference/AccessorReference.kt =================================================================== --- src/main/kotlin/platform/mixin/reference/AccessorReference.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/reference/AccessorReference.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -20,7 +20,7 @@ package com.demonwav.mcdev.platform.mixin.reference -import com.demonwav.mcdev.platform.mixin.handlers.AccessorHandler +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.util.MixinConstants import com.demonwav.mcdev.platform.mixin.util.findFieldByName import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceField @@ -58,9 +58,8 @@ it.findFieldByName(name)?.findSourceField(it, project, context.resolveScope, canDecompile = false) }.toResolveResults() } else { - val handler = AccessorHandler.getInstance() ?: return ResolveResult.EMPTY_ARRAY val annotation = context.parentOfType() ?: return ResolveResult.EMPTY_ARRAY - handler.resolveTarget(annotation).asSequence() + MixinAnnotationHandler.resolveTarget(annotation).asSequence() .mapNotNull { it.findSourceElement(project, context.resolveScope, canDecompile = false) } .toResolveResults() } Index: src/main/kotlin/platform/mixin/reference/InvokerReference.kt =================================================================== --- src/main/kotlin/platform/mixin/reference/InvokerReference.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/reference/InvokerReference.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -20,7 +20,7 @@ package com.demonwav.mcdev.platform.mixin.reference -import com.demonwav.mcdev.platform.mixin.handlers.InvokerHandler +import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.util.MixinConstants import com.demonwav.mcdev.platform.mixin.util.findOrConstructSourceMethod import com.demonwav.mcdev.platform.mixin.util.findSourceElement @@ -64,9 +64,8 @@ } ?: emptyList() }.toResolveResults() } else { - val handler = InvokerHandler.getInstance() ?: return ResolveResult.EMPTY_ARRAY val annotation = context.parentOfType() ?: return ResolveResult.EMPTY_ARRAY - handler.resolveTarget(annotation).asSequence() + MixinAnnotationHandler.resolveTarget(annotation).asSequence() .mapNotNull { it.findSourceElement(project, context.resolveScope, canDecompile = false) } .toResolveResults() } Index: src/main/kotlin/platform/mixin/reference/target/DefinitionReferences.kt =================================================================== --- src/main/kotlin/platform/mixin/reference/target/DefinitionReferences.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/reference/target/DefinitionReferences.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -31,7 +31,6 @@ import com.demonwav.mcdev.util.findField import com.demonwav.mcdev.util.findMethods import com.demonwav.mcdev.util.insideAnnotationAttribute -import com.demonwav.mcdev.util.mapFirstNotNull import com.demonwav.mcdev.util.mapToArray import com.demonwav.mcdev.util.reference.PolyReferenceResolver import com.demonwav.mcdev.util.toTypedArray @@ -96,14 +95,13 @@ private fun resolveInBytecode(context: PsiElement, memberReference: MemberReference): List { val project = context.project val modifierList = context.findContainingModifierList() ?: return emptyList() - val (annotation, handler) = modifierList.annotations.mapFirstNotNull { annotation -> - val handler = MixinAnnotationHandler.forMixinAnnotation(annotation, project) ?: return@mapFirstNotNull null - annotation to handler + val annotation = modifierList.annotations.firstOrNull { + MixinAnnotationHandler.forMixinAnnotation(it, project) != null } ?: return emptyList() val result = mutableListOf() - for (target in handler.resolveTarget(annotation)) { + for (target in MixinAnnotationHandler.resolveTarget(annotation)) { if (target !is MethodTargetMember) { continue } Index: src/main/kotlin/platform/mixin/reference/target/TargetReference.kt =================================================================== --- src/main/kotlin/platform/mixin/reference/target/TargetReference.kt (revision 7969d538cf650138757613461e89ffe941f1d00b) +++ src/main/kotlin/platform/mixin/reference/target/TargetReference.kt (revision 81686d4628190e6dbf00473e37ac8db7d89d4d3c) @@ -80,7 +80,8 @@ if (forUnresolved && handler.isSoft) { return null } - return handler.resolveTarget(annotation).mapNotNull { (it as? MethodTargetMember)?.classAndMethod } + return MixinAnnotationHandler.resolveTarget(annotation) + .mapNotNull { (it as? MethodTargetMember)?.classAndMethod } } override fun isUnresolved(context: PsiElement): Boolean {