User: joe Date: 08 Nov 25 23:57 Revision: df97f78630a5f3da8711818534bd6d3e86f3557b Summary: Allow CopyAtAction and CopyCoremodTargetAction to work without mappings TeamCity URL: http://ci.mcdev.io:80/viewModification.html?tab=vcsModificationFiles&modId=10248&personal=false Index: src/main/kotlin/platform/mcp/actions/CopyAtAction.kt =================================================================== --- src/main/kotlin/platform/mcp/actions/CopyAtAction.kt (revision 099a4e90489ce3ea30e91ade784d0ac6a05a8c4c) +++ src/main/kotlin/platform/mcp/actions/CopyAtAction.kt (revision df97f78630a5f3da8711818534bd6d3e86f3557b) @@ -22,6 +22,8 @@ import com.demonwav.mcdev.platform.mcp.mappings.Mappings import com.demonwav.mcdev.util.ActionData +import com.demonwav.mcdev.util.descriptor +import com.demonwav.mcdev.util.fullQualifiedName import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiClass @@ -32,35 +34,68 @@ import java.awt.datatransfer.StringSelection class CopyAtAction : SrgActionBase() { - override fun withSrgTarget(parent: PsiElement, srgMap: Mappings, e: AnActionEvent, data: ActionData) { + override fun withSrgTarget(parent: PsiElement, srgMap: Mappings?, e: AnActionEvent, data: ActionData) { + if (srgMap == null) { - when (parent) { - is PsiField -> { + when (parent) { + is PsiField -> { + val className = parent.containingClass?.fullQualifiedName ?: return showBalloon("No containing class found", e) + copyToClipboard( + data.editor, + data.element, + className + " " + parent.name, + ) + } + is PsiMethod -> { + val className = parent.containingClass?.fullQualifiedName ?: return showBalloon("No containing class found", e) + copyToClipboard( + data.editor, + data.element, + className + " " + parent.name + parent.descriptor, + ) + } + is PsiClass -> { + val className = parent.fullQualifiedName ?: return showBalloon("Could not get FQN", e) + copyToClipboard( + data.editor, + data.element, + className, + ) + } + } + } else { + when (parent) { + is PsiField -> { - val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) - val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) - val srg = srgMap.getIntermediaryField(parent) ?: return showBalloon("No SRG name found", e) - copyToClipboard( - data.editor, - data.element, - classSrg + " " + srg.name + " # " + parent.name, - ) - } + val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) + val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) + val srg = srgMap.getIntermediaryField(parent) ?: return showBalloon("No SRG name found", e) + copyToClipboard( + data.editor, + data.element, + classSrg + " " + srg.name + " # " + parent.name, + ) + } + - is PsiMethod -> { - val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) - val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) - val srg = srgMap.getIntermediaryMethod(parent) ?: return showBalloon("No SRG name found", e) - copyToClipboard( - data.editor, - data.element, - classSrg + " " + srg.name + srg.descriptor + " # " + parent.name, - ) - } + is PsiMethod -> { + val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) + val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) + val srg = srgMap.getIntermediaryMethod(parent) ?: return showBalloon("No SRG name found", e) + copyToClipboard( + data.editor, + data.element, + classSrg + " " + srg.name + srg.descriptor + " # " + parent.name, + ) + } + - is PsiClass -> { + is PsiClass -> { - val classMcpToSrg = srgMap.getIntermediaryClass(parent) ?: return showBalloon("No SRG name found", e) + val classMcpToSrg = + srgMap.getIntermediaryClass(parent) ?: return showBalloon("No SRG name found", e) - copyToClipboard(data.editor, data.element, classMcpToSrg) - } + copyToClipboard(data.editor, data.element, classMcpToSrg) + } + - else -> showBalloon("Not a valid element", e) - } - } + else -> showBalloon("Not a valid element", e) + } + } + } private fun copyToClipboard(editor: Editor, element: PsiElement, text: String) { val stringSelection = StringSelection(text) Index: src/main/kotlin/platform/mcp/actions/CopyCoremodTargetAction.kt =================================================================== --- src/main/kotlin/platform/mcp/actions/CopyCoremodTargetAction.kt (revision 099a4e90489ce3ea30e91ade784d0ac6a05a8c4c) +++ src/main/kotlin/platform/mcp/actions/CopyCoremodTargetAction.kt (revision df97f78630a5f3da8711818534bd6d3e86f3557b) @@ -22,6 +22,8 @@ import com.demonwav.mcdev.platform.mcp.mappings.Mappings import com.demonwav.mcdev.util.ActionData +import com.demonwav.mcdev.util.descriptor +import com.demonwav.mcdev.util.fullQualifiedName import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiClass @@ -34,36 +36,40 @@ import kotlinx.serialization.json.JsonPrimitive class CopyCoremodTargetAction : SrgActionBase() { - override fun withSrgTarget(parent: PsiElement, srgMap: Mappings, e: AnActionEvent, data: ActionData) { + override fun withSrgTarget(parent: PsiElement, srgMap: Mappings?, e: AnActionEvent, data: ActionData) { when (parent) { is PsiField -> { - val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) - val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) - val srg = srgMap.getIntermediaryField(parent) ?: return showBalloon("No SRG name found", e) + val containing = parent.containingClass ?: return showBalloon("No containing class", e) + val classSrg = srgMap?.getIntermediaryClass(containing) ?: containing.fullQualifiedName ?: return showBalloon("No containing class found", e) + val srg = srgMap?.getIntermediaryField(parent)?.name ?: parent.name copyToClipboard( data.editor, data.element, Pair("target", "FIELD"), Pair("class", classSrg), - Pair("fieldName", srg.name), + Pair("fieldName", srg), ) } is PsiMethod -> { - val containing = parent.containingClass ?: return showBalloon("No SRG name found", e) - val classSrg = srgMap.getIntermediaryClass(containing) ?: return showBalloon("No SRG name found", e) - val srg = srgMap.getIntermediaryMethod(parent) ?: return showBalloon("No SRG name found", e) - val srgDescriptor = srg.descriptor ?: return showBalloon("No SRG name found", e) + val containing = parent.containingClass ?: return showBalloon("No containing class", e) + val classSrg = srgMap?.getIntermediaryClass(containing) ?: containing.fullQualifiedName ?: return showBalloon("No containing class found", e) + val (srgName, srgDescriptor) = srgMap?.getIntermediaryMethod(parent)?.let { + it.name to it.descriptor + } ?: (parent.name to parent.descriptor) + if (srgDescriptor == null) { + return showBalloon("No method descriptor found", e) + } copyToClipboard( data.editor, data.element, Pair("target", "METHOD"), Pair("class", classSrg), - Pair("methodName", srg.name), + Pair("methodName", srgName), Pair("methodDesc", srgDescriptor), ) } is PsiClass -> { - val classSrg = srgMap.getIntermediaryClass(parent) ?: return showBalloon("No SRG name found", e) + val classSrg = srgMap?.getIntermediaryClass(parent) ?: parent.fullQualifiedName ?: return showBalloon("No FQN found", e) copyToClipboard( data.editor, data.element, Index: src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt =================================================================== --- src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt (revision 099a4e90489ce3ea30e91ade784d0ac6a05a8c4c) +++ src/main/kotlin/platform/mcp/actions/FindSrgMappingAction.kt (revision df97f78630a5f3da8711818534bd6d3e86f3557b) @@ -30,7 +30,11 @@ class FindSrgMappingAction : SrgActionBase() { - override fun withSrgTarget(parent: PsiElement, srgMap: Mappings, e: AnActionEvent, data: ActionData) { + override fun withSrgTarget(parent: PsiElement, srgMap: Mappings?, e: AnActionEvent, data: ActionData) { + if (srgMap == null) { + return showBalloon("No mappings found", e) + } + when (parent) { is PsiField -> { val srg = srgMap.getIntermediaryField(parent) ?: return showBalloon("No SRG name found", e) Index: src/main/kotlin/platform/mcp/actions/SrgActionBase.kt =================================================================== --- src/main/kotlin/platform/mcp/actions/SrgActionBase.kt (revision 099a4e90489ce3ea30e91ade784d0ac6a05a8c4c) +++ src/main/kotlin/platform/mcp/actions/SrgActionBase.kt (revision df97f78630a5f3da8711818534bd6d3e86f3557b) @@ -53,29 +53,39 @@ return } - val mcpModule = data.instance.getModuleOfType(McpModuleType) ?: return showBalloon("No mappings found", e) + val mcpModule = data.instance.getModuleOfType(McpModuleType) - mcpModule.mappingsManager?.mappings?.onSuccess { srgMap -> - var parent = data.element.parent ?: return@onSuccess showBalloon("Not a valid element", e) + val mappingsManager = mcpModule?.mappingsManager ?: return performWithMappings(e, data, data.element, null) + mappingsManager.mappings.onSuccess { srgMap -> + performWithMappings(e, data, data.element, srgMap) + }.onError { + showBalloon(it.message ?: "No MCP data available", e) + } + } + private fun performWithMappings( + e: AnActionEvent, + data: ActionData, + element: PsiIdentifier, + srgMap: Mappings?, + ) { + var parent = element.parent ?: return showBalloon("Not a valid element", e) + - if (parent is PsiMember) { - val shadowTarget = ShadowHandler.getInstance()?.findFirstShadowTargetForReference(parent)?.element - if (shadowTarget != null) { - parent = shadowTarget - } - } + if (parent is PsiMember) { + val shadowTarget = ShadowHandler.getInstance()?.findFirstShadowTargetForReference(parent)?.element + if (shadowTarget != null) { + parent = shadowTarget + } + } - if (parent is PsiReference) { + if (parent is PsiReference) { - parent = parent.resolve() ?: return@onSuccess showBalloon("Not a valid element", e) + parent = parent.resolve() ?: return showBalloon("Not a valid element", e) - } + } - withSrgTarget(parent, srgMap, e, data) + withSrgTarget(parent, srgMap, e, data) - }?.onError { - showBalloon(it.message ?: "No MCP data available", e) - } ?: showBalloon("No mappings found", e) } - abstract fun withSrgTarget(parent: PsiElement, srgMap: Mappings, e: AnActionEvent, data: ActionData) + abstract fun withSrgTarget(parent: PsiElement, srgMap: Mappings?, e: AnActionEvent, data: ActionData) companion object { fun showBalloon(message: String, e: AnActionEvent) {