Skip to content

Commit 4d8758b

Browse files
committed
Add line marker provider for mixin targets
1 parent 260390e commit 4d8758b

File tree

9 files changed

+130
-19
lines changed

9 files changed

+130
-19
lines changed

src/main/kotlin/asset/MixinAssets.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@ object MixinAssets : Assets() {
2828
val MIXIN_CLASS_ICON = loadIcon("/assets/icons/mixin/mixin_class_gutter.svg")
2929
val MIXIN_CLASS_ICON_DARK = loadIcon("/assets/icons/mixin/mixin_class_gutter_dark.svg")
3030

31+
val MIXIN_CLASS_TARGET_ICON = loadIcon("/assets/icons/mixin/mixin_class_target_gutter.svg")
32+
val MIXIN_CLASS_TARGET_ICON_DARK = loadIcon("/assets/icons/mixin/mixin_class_target_gutter_dark.svg")
33+
3134
val MIXIN_MARK = loadIcon("/assets/icons/mixin/mixin_mark.svg")
3235
}

src/main/kotlin/platform/mixin/action/FindMixinsAction.kt

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,14 @@ import com.demonwav.mcdev.platform.mixin.util.mixinTargets
2525
import com.demonwav.mcdev.util.cached
2626
import com.demonwav.mcdev.util.findReferencedClass
2727
import com.demonwav.mcdev.util.fullQualifiedName
28-
import com.demonwav.mcdev.util.gotoTargetElement
2928
import com.demonwav.mcdev.util.invokeLater
3029
import com.intellij.openapi.actionSystem.AnAction
3130
import com.intellij.openapi.actionSystem.AnActionEvent
3231
import com.intellij.openapi.actionSystem.CommonDataKeys.CARET
33-
import com.intellij.openapi.actionSystem.CommonDataKeys.EDITOR
3432
import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT
3533
import com.intellij.openapi.actionSystem.CommonDataKeys.PSI_FILE
3634
import com.intellij.openapi.application.ApplicationManager
3735
import com.intellij.openapi.application.runReadAction
38-
import com.intellij.openapi.editor.Editor
3936
import com.intellij.openapi.progress.ProgressIndicator
4037
import com.intellij.openapi.progress.runBackgroundableTask
4138
import com.intellij.openapi.project.Project
@@ -44,7 +41,6 @@ import com.intellij.openapi.wm.ToolWindowFactory
4441
import com.intellij.openapi.wm.ToolWindowManager
4542
import com.intellij.psi.JavaPsiFacade
4643
import com.intellij.psi.PsiClass
47-
import com.intellij.psi.PsiFile
4844
import com.intellij.psi.search.GlobalSearchScope
4945
import com.intellij.psi.search.searches.AnnotatedElementsSearch
5046
import com.intellij.psi.util.PsiModificationTracker
@@ -91,13 +87,7 @@ class FindMixinsAction : AnAction() {
9187
}
9288
}
9389

94-
fun openFindMixinsUI(
95-
project: Project,
96-
editor: Editor,
97-
file: PsiFile,
98-
targetClass: PsiClass,
99-
filter: (PsiClass) -> Boolean = { true }
100-
) {
90+
fun openFindMixinsUI(project: Project, targetClass: PsiClass, filter: (PsiClass) -> Boolean = { true }) {
10191
ApplicationManager.getApplication().assertIsDispatchThread()
10292

10393
runBackgroundableTask("Searching for Mixins", project, true) run@{ indicator ->
@@ -122,7 +112,7 @@ class FindMixinsAction : AnAction() {
122112

123113
invokeLater {
124114
if (classes.size == 1) {
125-
gotoTargetElement(classes.single(), editor, file)
115+
classes.single().navigate(true)
126116
} else {
127117
val twManager = ToolWindowManager.getInstance(project)
128118
val window = twManager.getToolWindow(TOOL_WINDOW_ID)!!
@@ -142,13 +132,12 @@ class FindMixinsAction : AnAction() {
142132
val project = e.getData(PROJECT) ?: return
143133
val file = e.getData(PSI_FILE) ?: return
144134
val caret = e.getData(CARET) ?: return
145-
val editor = e.getData(EDITOR) ?: return
146135

147136
val element = file.findElementAt(caret.offset) ?: return
148137
val classOfElement = element.findReferencedClass() ?: return
149138

150139
invokeLater {
151-
openFindMixinsUI(project, editor, file, classOfElement)
140+
openFindMixinsUI(project, classOfElement)
152141
}
153142
}
154143
}

src/main/kotlin/platform/mixin/insight/MixinLineMarkerProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class MixinLineMarkerProvider : LineMarkerProviderDescriptor(), GutterIconNaviga
5757
{ "Go to target class" },
5858
this,
5959
GutterIconRenderer.Alignment.LEFT,
60-
{ "mixin target class indicator" },
60+
{ "mixin class indicator" },
6161
)
6262
}
6363

src/main/kotlin/platform/mixin/insight/target/AccessorTargetCodeVisionProvider.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ class AccessorTargetCodeVisionProvider : AbstractMixinTargetCodeVisionProvider()
5353

5454
override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) {
5555
val project = editor.project ?: return
56-
val file = element.containingFile ?: return
5756
val targetClass = element.findReferencedClass() ?: return
58-
FindMixinsAction.openFindMixinsUI(project, editor, file, targetClass) { it.isAccessorMixin }
57+
FindMixinsAction.openFindMixinsUI(project, targetClass) { it.isAccessorMixin }
5958
}
6059
}

src/main/kotlin/platform/mixin/insight/target/MixinTargetCodeVisionProvider.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ class MixinTargetCodeVisionProvider : AbstractMixinTargetCodeVisionProvider() {
5353

5454
override fun handleClick(editor: Editor, element: PsiElement, event: MouseEvent?) {
5555
val project = editor.project ?: return
56-
val file = element.containingFile ?: return
5756
val targetClass = element.findReferencedClass() ?: return
58-
FindMixinsAction.openFindMixinsUI(project, editor, file, targetClass) { !it.isAccessorMixin }
57+
FindMixinsAction.openFindMixinsUI(project, targetClass) { !it.isAccessorMixin }
5958
}
6059
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
/*
2+
* Minecraft Development for IntelliJ
3+
*
4+
* https://mcdev.io/
5+
*
6+
* Copyright (C) 2025 minecraft-dev
7+
*
8+
* This program is free software: you can redistribute it and/or modify
9+
* it under the terms of the GNU Lesser General Public License as published
10+
* by the Free Software Foundation, version 3.0 only.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Public License for more details.
16+
*
17+
* You should have received a copy of the GNU Lesser General Public License
18+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
19+
*/
20+
21+
package com.demonwav.mcdev.platform.mixin.insight.target
22+
23+
import com.demonwav.mcdev.asset.MixinAssets
24+
import com.demonwav.mcdev.platform.mixin.action.FindMixinsAction
25+
import com.intellij.codeInsight.daemon.GutterIconNavigationHandler
26+
import com.intellij.codeInsight.daemon.LineMarkerInfo
27+
import com.intellij.codeInsight.daemon.LineMarkerProviderDescriptor
28+
import com.intellij.openapi.editor.markup.GutterIconRenderer
29+
import com.intellij.psi.PsiClass
30+
import com.intellij.psi.PsiElement
31+
import com.intellij.psi.PsiIdentifier
32+
import java.awt.event.MouseEvent
33+
34+
class MixinTargetLineMarkerProvider : LineMarkerProviderDescriptor(), GutterIconNavigationHandler<PsiIdentifier> {
35+
override fun getName() = "Mixin target line marker"
36+
override fun getIcon() = MixinAssets.MIXIN_CLASS_TARGET_ICON
37+
38+
override fun getLineMarkerInfo(element: PsiElement) = null
39+
40+
override fun collectSlowLineMarkers(
41+
elements: List<PsiElement>,
42+
result: MutableCollection<in LineMarkerInfo<*>>
43+
) {
44+
for (element in elements) {
45+
if (element !is PsiClass) {
46+
continue
47+
}
48+
49+
val identifier = element.nameIdentifier ?: continue
50+
51+
val mixins = FindMixinsAction.findMixins(element, element.project) ?: continue
52+
if (mixins.isEmpty()) {
53+
continue
54+
}
55+
56+
result += LineMarkerInfo(
57+
identifier,
58+
identifier.textRange,
59+
icon,
60+
{ "Go to mixins" },
61+
this,
62+
GutterIconRenderer.Alignment.LEFT,
63+
{ "mixin target class indicator" },
64+
)
65+
}
66+
}
67+
68+
override fun navigate(e: MouseEvent, elt: PsiIdentifier) {
69+
val targetClass = elt.parent as? PsiClass ?: return
70+
FindMixinsAction.openFindMixinsUI(targetClass.project, targetClass)
71+
}
72+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,10 @@
741741
implementationClass="com.demonwav.mcdev.platform.mixin.insight.MixinLineMarkerProvider"/>
742742
<codeInsight.lineMarkerProvider language="JAVA"
743743
implementationClass="com.demonwav.mcdev.platform.mixin.insight.MixinElementLineMarkerProvider"/>
744+
<codeInsight.lineMarkerProvider language="JAVA"
745+
implementationClass="com.demonwav.mcdev.platform.mixin.insight.target.MixinTargetLineMarkerProvider"/>
744746

747+
<!-- Mixin Code Vision Providers -->
745748
<codeInsight.daemonBoundCodeVisionProvider implementation="com.demonwav.mcdev.platform.mixin.insight.target.MixinTargetCodeVisionProvider"/>
746749
<codeInsight.daemonBoundCodeVisionProvider implementation="com.demonwav.mcdev.platform.mixin.insight.target.AccessorTargetCodeVisionProvider"/>
747750

Lines changed: 23 additions & 0 deletions
Loading
Lines changed: 23 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)