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 @@ + + + +