From 35075941a843d29ff85fb020d84e3e4df7df3191 Mon Sep 17 00:00:00 2001 From: LlamaLad7 Date: Sat, 29 Aug 2026 00:32:52 +0100 Subject: [PATCH] Fix: Support debugging interpolated expression strings. --- .../mixin/expression/gui/FlowDiagram.kt | 4 +-- .../mixin/expression/gui/MEShowFlowAction.kt | 32 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt b/src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt index 57a8228a2..e75a5c139 100644 --- a/src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt +++ b/src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt @@ -29,7 +29,7 @@ import com.intellij.openapi.progress.checkCanceled import com.intellij.openapi.project.Project import com.intellij.openapi.util.text.StringUtil import com.intellij.pom.Navigatable -import com.intellij.psi.PsiLiteralExpression +import com.intellij.psi.PsiElement import com.intellij.psi.PsiModifierList import com.intellij.psi.SmartPointerManager import com.llamalad7.mixinextras.expression.impl.point.ExpressionContext @@ -106,7 +106,7 @@ class FlowDiagram( fun populateMatchStatuses( module: Module, - currentStringLit: PsiLiteralExpression, + currentStringLit: PsiElement, currentModifierList: PsiModifierList ) { val stringRef = SmartPointerManager.getInstance(module.project).createSmartPsiElementPointer(currentStringLit) diff --git a/src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt b/src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt index 17f513f30..d1f5d12a2 100644 --- a/src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt +++ b/src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt @@ -20,11 +20,11 @@ package com.demonwav.mcdev.platform.mixin.expression.gui -import com.demonwav.mcdev.platform.mixin.expression.psi.MEExpressionFile import com.demonwav.mcdev.platform.mixin.handlers.InjectorAnnotationHandler import com.demonwav.mcdev.platform.mixin.handlers.MixinAnnotationHandler import com.demonwav.mcdev.platform.mixin.reference.MethodReference import com.demonwav.mcdev.platform.mixin.util.MethodTargetMember +import com.demonwav.mcdev.platform.mixin.util.MixinConstants import com.demonwav.mcdev.platform.mixin.util.findClassNodeByPsiClass import com.demonwav.mcdev.platform.mixin.util.isMixin import com.demonwav.mcdev.platform.mixin.util.mixinTargets @@ -32,7 +32,6 @@ import com.demonwav.mcdev.platform.mixin.util.shortDescString import com.demonwav.mcdev.platform.mixin.util.shortName import com.demonwav.mcdev.util.descriptor import com.demonwav.mcdev.util.ifEmpty -import com.intellij.lang.injection.InjectedLanguageManager import com.intellij.lang.java.JavaLanguage import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction @@ -43,11 +42,16 @@ import com.intellij.openapi.components.service import com.intellij.openapi.ui.popup.JBPopupFactory import com.intellij.openapi.ui.popup.PopupStep import com.intellij.openapi.ui.popup.util.BaseListPopupStep +import com.intellij.psi.PsiArrayInitializerMemberValue import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement import com.intellij.psi.PsiIdentifier import com.intellij.psi.PsiLiteralExpression import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiNameValuePair +import com.intellij.psi.util.isAncestor import com.intellij.psi.util.parentOfType +import com.intellij.psi.util.parents import org.objectweb.asm.tree.ClassNode import org.objectweb.asm.tree.LineNumberNode import org.objectweb.asm.tree.MethodNode @@ -125,13 +129,8 @@ class MEShowFlowAction : AnAction() { fun resolveExpressionTarget(): Sequence { val module = e.getData(LangDataKeys.MODULE) ?: return emptySequence() - val string = element.parentOfType() ?: return emptySequence() + val string = findExpressionString(element) ?: return emptySequence() val modifierList = string.parentOfType()?.modifierList ?: return emptySequence() - if (InjectedLanguageManager.getInstance(project).getInjectedPsiFiles(string).orEmpty() - .none { it.first is MEExpressionFile } - ) { - return emptySequence() - } val (injectorAnnotation, injector) = modifierList.annotations.firstNotNullOfOrNull { ann -> (MixinAnnotationHandler.forMixinAnnotation(ann, project) as? InjectorAnnotationHandler) @@ -158,6 +157,23 @@ class MEShowFlowAction : AnAction() { } } + private fun findExpressionString(anchor: PsiElement): PsiElement? { + val nameValue = anchor.parentOfType() ?: return null + if (nameValue.name != "value" && nameValue.name != null) { + // Wrong attribute + return null + } + if (anchor.parentOfType()?.modifierList?.hasAnnotation(MixinConstants.MixinExtras.EXPRESSION) != true) { + // Not an Expression + return null + } + return when (val value = nameValue.value) { + null -> null + is PsiArrayInitializerMemberValue -> value.initializers.firstOrNull { it.isAncestor(anchor) } + else -> value.takeIf { it.isAncestor(anchor) } + } + } + private data class Resolved(val clazz: ClassNode, val method: MethodNode, val action: (FlowDiagram) -> Unit = {}) { override fun toString() = "${clazz.shortName}::${method.name}${shortDescString(method.desc)}" }