Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/main/kotlin/platform/mixin/expression/gui/FlowDiagram.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -106,7 +106,7 @@ class FlowDiagram(

fun populateMatchStatuses(
module: Module,
currentStringLit: PsiLiteralExpression,
currentStringLit: PsiElement,
currentModifierList: PsiModifierList
) {
val stringRef = SmartPointerManager.getInstance(module.project).createSmartPsiElementPointer(currentStringLit)
Expand Down
32 changes: 24 additions & 8 deletions src/main/kotlin/platform/mixin/expression/gui/MEShowFlowAction.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,18 @@

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
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
Expand All @@ -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
Expand Down Expand Up @@ -125,13 +129,8 @@ class MEShowFlowAction : AnAction() {

fun resolveExpressionTarget(): Sequence<Resolved> {
val module = e.getData(LangDataKeys.MODULE) ?: return emptySequence()
val string = element.parentOfType<PsiLiteralExpression>() ?: return emptySequence()
val string = findExpressionString(element) ?: return emptySequence()
val modifierList = string.parentOfType<PsiMethod>()?.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)
Expand All @@ -158,6 +157,23 @@ class MEShowFlowAction : AnAction() {
}
}

private fun findExpressionString(anchor: PsiElement): PsiElement? {
val nameValue = anchor.parentOfType<PsiNameValuePair>() ?: return null
if (nameValue.name != "value" && nameValue.name != null) {
// Wrong attribute
return null
}
if (anchor.parentOfType<PsiMethod>()?.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)}"
}
Expand Down
Loading