From 58fa8d88199e67d466a9c454305295cd02ad8070 Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Thu, 2 Oct 2025 14:47:38 +0100 Subject: [PATCH] refactor: improve quick link navigation for psi elements --- .../toolwindow/chat/ResponseNodeRenderer.java | 5 ++- .../codegpt/util/PsiLinkNavigator.kt | 35 +++++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java index d3c1eaf3..3d060b11 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ResponseNodeRenderer.java @@ -6,6 +6,7 @@ import com.vladsch.flexmark.ast.BulletListItem; import com.vladsch.flexmark.ast.Code; import com.vladsch.flexmark.ast.CodeBlock; import com.vladsch.flexmark.ast.Heading; +import com.vladsch.flexmark.ast.Link; import com.vladsch.flexmark.ast.OrderedListItem; import com.vladsch.flexmark.ast.Paragraph; import com.vladsch.flexmark.html.HtmlWriter; @@ -51,7 +52,9 @@ public class ResponseNodeRenderer implements NodeRenderer { } private void renderCode(Code node, NodeRendererContext context, HtmlWriter html) { - html.attr("style", "color: " + ColorUtil.toHex(new JBColor(0x00627A, 0xCC7832))); + if (!(node.getParent() instanceof Link)) { + html.attr("style", "color: " + ColorUtil.toHex(new JBColor(0x00627A, 0xCC7832))); + } context.delegateRender(); } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/util/PsiLinkNavigator.kt b/src/main/kotlin/ee/carlrobert/codegpt/util/PsiLinkNavigator.kt index f61424ff..f1c75891 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/util/PsiLinkNavigator.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/util/PsiLinkNavigator.kt @@ -8,14 +8,12 @@ import com.intellij.openapi.application.ReadAction import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.project.Project import com.intellij.pom.Navigatable -import com.intellij.psi.JavaPsiFacade -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiManager -import com.intellij.psi.PsiNamedElement +import com.intellij.psi.* import com.intellij.psi.search.FilenameIndex import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.concurrency.AppExecutorUtil +import org.jetbrains.kotlin.psi.KtClass import java.net.URLDecoder import java.nio.charset.StandardCharsets @@ -99,9 +97,7 @@ class PsiElementResolver : NavigationResolver() { findByJavaFQN(project, target)?.let { return it } - findByMemberSeparation(project, target)?.let { return it } - - return searchInModels(project, target) + return findByMemberSeparation(project, target) } private fun findByJavaFQN(project: Project, target: String): Navigatable? { @@ -151,15 +147,20 @@ class PsiElementResolver : NavigationResolver() { private fun findByMemberSeparation(project: Project, target: String): Navigatable? { val memberSeparatorIndex = target.indexOf('#') - if (memberSeparatorIndex <= 0) return null - - val owner = target.substring(0, memberSeparatorIndex) - val member = target.substring(memberSeparatorIndex + 1) + val owner = + if (memberSeparatorIndex > 0) target.substring(0, memberSeparatorIndex) else target searchInModels(project, owner)?.let { ownerElement -> - if (ownerElement is PsiClass) { - findMemberInClass(ownerElement, member)?.let { return it } + val member = target.substring(memberSeparatorIndex + 1) + if (memberSeparatorIndex > 0) { + if (ownerElement is PsiClass) { + findMemberInClass(ownerElement, member)?.let { return it } + } + if (ownerElement is PsiElement) { + findNavigatableElement(ownerElement, member)?.let { return it } + } } + return ownerElement } return null @@ -169,7 +170,13 @@ class PsiElementResolver : NavigationResolver() { psiClass.findMethodsByName(memberName, false).firstOrNull()?.let { return it } psiClass.findFieldByName(memberName, false)?.let { return it } psiClass.findInnerClassByName(memberName, false)?.let { return it } - return null + + return findNavigatableElement(psiClass, memberName) + } + + private fun findNavigatableElement(psiElement: PsiElement, memberName: String): Navigatable? { + return PsiTreeUtil.findChildrenOfType(psiElement, PsiNamedElement::class.java) + .firstOrNull { it.name == memberName } as? Navigatable } private fun searchInModels(project: Project, searchTerm: String): Navigatable? {