Skip to content

Commit 9ba32dc

Browse files
authored
Fix: Support debugging interpolated expression strings. (#2642)
1 parent 52a49b8 commit 9ba32dc

2 files changed

Lines changed: 26 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: 24 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,16 @@ 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
52+
import com.intellij.psi.util.isAncestor
5053
import com.intellij.psi.util.parentOfType
54+
import com.intellij.psi.util.parents
5155
import org.objectweb.asm.tree.ClassNode
5256
import org.objectweb.asm.tree.LineNumberNode
5357
import 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

Comments
 (0)