User: llamalad7 Date: 31 Aug 26 11:38 Revision: 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f Summary: Fix: Support debugging interpolated expression strings. (#2642) TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10613&personal=false Index: src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt =================================================================== --- src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt (revision 52a49b87f8b07751557a78969c07772b6d196119) +++ src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt (revision 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f) @@ -29,7 +29,7 @@ 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 @@ fun populateMatchStatuses( module: Module, - currentStringLit: PsiLiteralExpression, + currentStringLit: PsiElement, currentModifierList: PsiModifierList ) { val stringRef = SmartPointerManager.getInstance(module.project).createSmartPsiElementPointer(currentStringLit) Index: src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt =================================================================== --- src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt (revision 52a49b87f8b07751557a78969c07772b6d196119) +++ src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt (revision 9ba32dcaa0bb2d24f4802c832f6f24ecf4aece1f) @@ -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.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.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 @@ 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 @@ } } + 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)}" }