Skip to content

Commit 7a01d2e

Browse files
committed
Fix: Support debugging interpolated expression strings.
1 parent 52a49b8 commit 7a01d2e

2 files changed

Lines changed: 24 additions & 10 deletions

File tree

src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import com.intellij.openapi.progress.checkCanceled
2929
import com.intellij.openapi.project.Project
3030
import com.intellij.openapi.util.text.StringUtil
3131
import com.intellij.pom.Navigatable
32-
import com.intellij.psi.PsiLiteralExpression
32+
import com.intellij.psi.PsiElement
3333
import com.intellij.psi.PsiModifierList
3434
import com.intellij.psi.SmartPointerManager
3535
import com.llamalad7.mixinextras.expression.impl.point.ExpressionContext
@@ -106,7 +106,7 @@ class FlowDiagram(
106106

107107
fun populateMatchStatuses(
108108
module: Module,
109-
currentStringLit: PsiLiteralExpression,
109+
currentStringLit: PsiElement,
110110
currentModifierList: PsiModifierList
111111
) {
112112
val stringRef = SmartPointerManager.getInstance(module.project).createSmartPsiElementPointer(currentStringLit)

src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,18 @@
2020

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

23-
import com.demonwav.mcdev.platform.mixin.expression.psi.MEExpressionFile
2423
import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler
2524
import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler
2625
import com.demonwav.mcdev.platform.mixin.reference.MethodReference
2726
import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember
27+
import com.demonwav.mcdev.platform.mixin.util.MixinConstants
2828
import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass
2929
import com.demonwav.mcdev.platform.mixin.util.isMixin
3030
import com.demonwav.mcdev.platform.mixin.util.mixinTargets
3131
import com.demonwav.mcdev.platform.mixin.util.shortDescString
3232
import com.demonwav.mcdev.platform.mixin.util.shortName
3333
import com.demonwav.mcdev.util.descriptor
3434
import com.demonwav.mcdev.util.ifEmpty
35-
import com.intellij.lang.injection.InjectedLanguageManager
3635
import com.intellij.lang.java.JavaLanguage
3736
import com.intellij.openapi.actionSystem.ActionUpdateThread
3837
import com.intellij.openapi.actionSystem.AnAction
@@ -43,11 +42,15 @@ import com.intellij.openapi.components.service
4342
import com.intellij.openapi.ui.popup.JBPopupFactory
4443
import com.intellij.openapi.ui.popup.PopupStep
4544
import com.intellij.openapi.ui.popup.util.BaseListPopupStep
45+
import com.intellij.psi.PsiArrayInitializerMemberValue
4646
import com.intellij.psi.PsiClass
47+
import com.intellij.psi.PsiElement
4748
import com.intellij.psi.PsiIdentifier
4849
import com.intellij.psi.PsiLiteralExpression
4950
import com.intellij.psi.PsiMethod
51+
import com.intellij.psi.PsiNameValuePair
5052
import com.intellij.psi.util.parentOfType
53+
import com.intellij.psi.util.parents
5154
import org.objectweb.asm.tree.ClassNode
5255
import org.objectweb.asm.tree.LineNumberNode
5356
import org.objectweb.asm.tree.MethodNode
@@ -125,13 +128,8 @@ class MEShowFlowAction : AnAction() {
125128

126129
fun resolveExpressionTarget(): Sequence<Resolved> {
127130
val module = e.getData(LangDataKeys.MODULE) ?: return emptySequence()
128-
val string = element.parentOfType<PsiLiteralExpression>() ?: return emptySequence()
131+
val string = findExpressionString(element) ?: return emptySequence()
129132
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-
}
135133
val (injectorAnnotation, injector) =
136134
modifierList.annotations.firstNotNullOfOrNull { ann ->
137135
(MixinAnnotationHandler.forMixinAnnotation(ann, project) as? InjectorAnnotationHandler)
@@ -158,6 +156,22 @@ class MEShowFlowAction : AnAction() {
158156
}
159157
}
160158

159+
private fun findExpressionString(anchor: PsiElement): PsiElement? {
160+
val nameValue = anchor.parentOfType<PsiNameValuePair>() ?: return null
161+
if (anchor === nameValue.nameIdentifier) {
162+
return null
163+
}
164+
if (nameValue.name != "value" && nameValue.name != null) {
165+
// Wrong attribute
166+
return null
167+
}
168+
if (anchor.parentOfType<PsiMethod>()?.modifierList?.hasAnnotation(MixinConstants.MixinExtras.EXPRESSION) != true) {
169+
return null
170+
}
171+
return anchor.parents(withSelf = false)
172+
.first { it.parent is PsiNameValuePair || it.parent is PsiArrayInitializerMemberValue }
173+
}
174+
161175
private data class Resolved(val clazz: ClassNode, val method: MethodNode, val action: (FlowDiagram) -> Unit = {}) {
162176
override fun toString() = "${clazz.shortName}::${method.name}${shortDescString(method.desc)}"
163177
}

0 commit comments

Comments
 (0)