2020
2121package com.demonwav.mcdev.platform.mixin.expression.gui
2222
23- import com.demonwav.mcdev.platform.mixin.expression.psi.MEExpressionFile
2423import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler
2524import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2625import com.demonwav.mcdev.platform.mixin.reference.MethodReference
2726import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
27+ import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2828import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass
2929import com.demonwav.mcdev.platform.mixin.util.isMixin
3030import com.demonwav.mcdev.platform.mixin.util.mixinTargets
3131import com.demonwav.mcdev.platform.mixin.util.shortDescString
3232import com.demonwav.mcdev.platform.mixin.util.shortName
3333import com.demonwav.mcdev.util.descriptor
3434import com.demonwav.mcdev.util.ifEmpty
35- import com.intellij.lang.injection.InjectedLanguageManager
3635import com.intellij.lang.java.JavaLanguage
3736import com.intellij.openapi.actionSystem.ActionUpdateThread
3837import com.intellij.openapi.actionSystem.AnAction
@@ -43,11 +42,16 @@ import com.intellij.openapi.components.service
4342import com.intellij.openapi.ui.popup.JBPopupFactory
4443import com.intellij.openapi.ui.popup.PopupStep
4544import com.intellij.openapi.ui.popup.util.BaseListPopupStep
45+ import com.intellij.psi.PsiArrayInitializerMemberValue
4646import com.intellij.psi.PsiClass
47+ import com.intellij.psi.PsiElement
4748import com.intellij.psi.PsiIdentifier
4849import com.intellij.psi.PsiLiteralExpression
4950import com.intellij.psi.PsiMethod
51+ import com.intellij.psi.PsiNameValuePair
52+ import com.intellij.psi.util.isAncestor
5053import com.intellij.psi.util.parentOfType
54+ import com.intellij.psi.util.parents
5155import org.objectweb.asm.tree.ClassNode
5256import org.objectweb.asm.tree.LineNumberNode
5357import org.objectweb.asm.tree.MethodNode
@@ -125,13 +129,8 @@ class MEShowFlowAction : AnAction() {
125129
126130 fun resolveExpressionTarget (): Sequence <Resolved > {
127131 val module = e.getData(LangDataKeys .MODULE ) ? : return emptySequence()
128- val string = element.parentOfType< PsiLiteralExpression >( ) ? : return emptySequence()
132+ val string = findExpressionString(element ) ? : return emptySequence()
129133 val modifierList = string.parentOfType<PsiMethod >()?.modifierList ? : return emptySequence()
130- if (InjectedLanguageManager .getInstance(project).getInjectedPsiFiles(string).orEmpty()
131- .none { it.first is MEExpressionFile }
132- ) {
133- return emptySequence()
134- }
135134 val (injectorAnnotation, injector) =
136135 modifierList.annotations.firstNotNullOfOrNull { ann ->
137136 (MixinAnnotationHandler .forMixinAnnotation(ann, project) as ? InjectorAnnotationHandler )
@@ -158,6 +157,23 @@ class MEShowFlowAction : AnAction() {
158157 }
159158 }
160159
160+ private fun findExpressionString (anchor : PsiElement ): PsiElement ? {
161+ val nameValue = anchor.parentOfType<PsiNameValuePair >() ? : return null
162+ if (nameValue.name != " value" && nameValue.name != null ) {
163+ // Wrong attribute
164+ return null
165+ }
166+ if (anchor.parentOfType<PsiMethod >()?.modifierList?.hasAnnotation(MixinConstants .MixinExtras .EXPRESSION ) != true ) {
167+ // Not an Expression
168+ return null
169+ }
170+ return when (val value = nameValue.value) {
171+ null -> null
172+ is PsiArrayInitializerMemberValue -> value.initializers.firstOrNull { it.isAncestor(anchor) }
173+ else -> value.takeIf { it.isAncestor(anchor) }
174+ }
175+ }
176+
161177 private data class Resolved (val clazz : ClassNode , val method : MethodNode , val action : (FlowDiagram ) -> Unit = {}) {
162178 override fun toString () = " ${clazz.shortName} ::${method.name}${shortDescString(method.desc)} "
163179 }
0 commit comments