User: joe
Date: 18 Feb 25 23:58
Revision: 4d8758ba2531500554cae1f6a9900a4ff457cee9
Summary:
Add line marker provider for mixin targets
TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9826&personal=false
Index: src/main/kotlin/asset/MixinAssets.kt
===================================================================
--- src/main/kotlin/asset/MixinAssets.kt (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/kotlin/asset/MixinAssets.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -28,5 +28,8 @@
val MIXIN_CLASS_ICON = loadIcon("/assets/icons/mixin/mixin_class_gutter.svg")
val MIXIN_CLASS_ICON_DARK = loadIcon("/assets/icons/mixin/mixin_class_gutter_dark.svg")
+ val MIXIN_CLASS_TARGET_ICON = loadIcon("/assets/icons/mixin/mixin_class_target_gutter.svg")
+ val MIXIN_CLASS_TARGET_ICON_DARK = loadIcon("/assets/icons/mixin/mixin_class_target_gutter_dark.svg")
+
val MIXIN_MARK = loadIcon("/assets/icons/mixin/mixin_mark.svg")
}
Index: src/main/kotlin/platform/mixin/action/FindMixinsAction.kt
===================================================================
--- src/main/kotlin/platform/mixin/action/FindMixinsAction.kt (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/kotlin/platform/mixin/action/FindMixinsAction.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -25,17 +25,14 @@
import com.demonwav.mcdev.util.cached
import com.demonwav.mcdev.util.findReferencedClass
import com.demonwav.mcdev.util.fullQualifiedName
-import com.demonwav.mcdev.util.gotoTargetElement
import com.demonwav.mcdev.util.invokeLater
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys.CARET
-import com.intellij.openapi.actionSystem.CommonDataKeys.EDITOR
import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT
import com.intellij.openapi.actionSystem.CommonDataKeys.PSI_FILE
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.application.runReadAction
-import com.intellij.openapi.editor.Editor
import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.runBackgroundableTask
import com.intellij.openapi.project.Project
@@ -44,7 +41,6 @@
import com.intellij.openapi.wm.ToolWindowManager
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
-import com.intellij.psi.PsiFile
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.AnnotatedElementsSearch
import com.intellij.psi.util.PsiModificationTracker
@@ -91,13 +87,7 @@
}
}
- fun openFindMixinsUI(
- project: Project,
- editor: Editor,
- file: PsiFile,
- targetClass: PsiClass,
- filter: (PsiClass) -> Boolean = { true }
- ) {
+ fun openFindMixinsUI(project: Project, targetClass: PsiClass, filter: (PsiClass) -> Boolean = { true }) {
ApplicationManager.getApplication().assertIsDispatchThread()
runBackgroundableTask("Searching for Mixins", project, true) run@{ indicator ->
@@ -122,7 +112,7 @@
invokeLater {
if (classes.size == 1) {
- gotoTargetElement(classes.single(), editor, file)
+ classes.single().navigate(true)
} else {
val twManager = ToolWindowManager.getInstance(project)
val window = twManager.getToolWindow(TOOL_WINDOW_ID)!!
@@ -142,13 +132,12 @@
val project = e.getData(PROJECT) ?: return
val file = e.getData(PSI_FILE) ?: return
val caret = e.getData(CARET) ?: return
- val editor = e.getData(EDITOR) ?: return
val element = file.findElementAt(caret.offset) ?: return
val classOfElement = element.findReferencedClass() ?: return
invokeLater {
- openFindMixinsUI(project, editor, file, classOfElement)
+ openFindMixinsUI(project, classOfElement)
}
}
}
Index: src/main/kotlin/platform/mixin/insight/MixinLineMarkerProvider.kt
===================================================================
--- src/main/kotlin/platform/mixin/insight/MixinLineMarkerProvider.kt (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/kotlin/platform/mixin/insight/MixinLineMarkerProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -57,7 +57,7 @@
{ "Go to target class" },
this,
GutterIconRenderer.Alignment.LEFT,
- { "mixin target class indicator" },
+ { "mixin class indicator" },
)
}
Index: src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt
===================================================================
--- src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -53,8 +53,7 @@
override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) {
val project = editor.project ?: return
- val file = element.containingFile ?: return
val targetClass = element.findReferencedClass() ?: return
- FindMixinsAction.openFindMixinsUI(project, editor, file, targetClass) { it.isAccessorMixin }
+ FindMixinsAction.openFindMixinsUI(project, targetClass) { it.isAccessorMixin }
}
}
Index: src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt
===================================================================
--- src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -53,8 +53,7 @@
override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) {
val project = editor.project ?: return
- val file = element.containingFile ?: return
val targetClass = element.findReferencedClass() ?: return
- FindMixinsAction.openFindMixinsUI(project, editor, file, targetClass) { !it.isAccessorMixin }
+ FindMixinsAction.openFindMixinsUI(project, targetClass) { !it.isAccessorMixin }
}
}
Index: src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt
===================================================================
--- src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
+++ src/main/kotlin/platform/mixin/insight/target/MixinTargetLineMarkerProvider.kt (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -0,0 +1,72 @@
+/*
+ * Minecraft Development for IntelliJ
+ *
+ * https://mcdev.io/
+ *
+ * Copyright (C) 2025 minecraft-dev
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation, version 3.0 only.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ */
+
+package com.demonwav.mcdev.platform.mixin.insight.target
+
+import com.demonwav.mcdev.asset.MixinAssets
+import com.demonwav.mcdev.platform.mixin.action.FindMixinsAction
+import com.intellij.codeInsight.daemon.GutterIconNavigationHandler
+import com.intellij.codeInsight.daemon.LineMarkerInfo
+import com.intellij.codeInsight.daemon.LineMarkerProviderDescriptor
+import com.intellij.openapi.editor.markup.GutterIconRenderer
+import com.intellij.psi.PsiClass
+import com.intellij.psi.PsiElement
+import com.intellij.psi.PsiIdentifier
+import java.awt.event.MouseEvent
+
+class MixinTargetLineMarkerProvider : LineMarkerProviderDescriptor(), GutterIconNavigationHandler {
+ override fun getName() = "Mixin target line marker"
+ override fun getIcon() = MixinAssets.MIXIN_CLASS_TARGET_ICON
+
+ override fun getLineMarkerInfo(element: PsiElement) = null
+
+ override fun collectSlowLineMarkers(
+ elements: List,
+ result: MutableCollection>
+ ) {
+ for (element in elements) {
+ if (element !is PsiClass) {
+ continue
+ }
+
+ val identifier = element.nameIdentifier ?: continue
+
+ val mixins = FindMixinsAction.findMixins(element, element.project) ?: continue
+ if (mixins.isEmpty()) {
+ continue
+ }
+
+ result += LineMarkerInfo(
+ identifier,
+ identifier.textRange,
+ icon,
+ { "Go to mixins" },
+ this,
+ GutterIconRenderer.Alignment.LEFT,
+ { "mixin target class indicator" },
+ )
+ }
+ }
+
+ override fun navigate(e: MouseEvent, elt: PsiIdentifier) {
+ val targetClass = elt.parent as? PsiClass ?: return
+ FindMixinsAction.openFindMixinsUI(targetClass.project, targetClass)
+ }
+}
Index: src/main/resources/META-INF/plugin.xml
===================================================================
--- src/main/resources/META-INF/plugin.xml (revision 260390eee9f1f7d87486d1d9781f5a90e3213014)
+++ src/main/resources/META-INF/plugin.xml (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -741,7 +741,10 @@
implementationClass="com.demonwav.mcdev.platform.mixin.insight.MixinLineMarkerProvider"/>
+
+
Index: src/main/resources/assets/icons/mixin/mixin_class_target_gutter.svg
===================================================================
--- src/main/resources/assets/icons/mixin/mixin_class_target_gutter.svg (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
+++ src/main/resources/assets/icons/mixin/mixin_class_target_gutter.svg (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -0,0 +1,23 @@
+
+
+
+
Index: src/main/resources/assets/icons/mixin/mixin_class_target_gutter_dark.svg
===================================================================
--- src/main/resources/assets/icons/mixin/mixin_class_target_gutter_dark.svg (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
+++ src/main/resources/assets/icons/mixin/mixin_class_target_gutter_dark.svg (revision 4d8758ba2531500554cae1f6a9900a4ff457cee9)
@@ -0,0 +1,23 @@
+
+
+
+