[java-console] IDEA-344708 JVM Log navigation doesn't support nested classes

GitOrigin-RevId: 80c2c932b4630df848b7ff897a1ac50c988b8bcc
This commit is contained in:
Mikhail Pyltsin
2024-01-31 16:46:25 +01:00
committed by intellij-monorepo-bot
parent d5da0ada2b
commit 199e367dbd
3 changed files with 63 additions and 3 deletions

View File

@@ -13,6 +13,14 @@ import com.intellij.psi.search.PsiShortNamesCache
class ClassInfoResolver(val project: Project, private val mySearchScope: GlobalSearchScope) {
companion object {
internal fun findSubclassName(className: String): String? {
val probablySubclassIndex = className.lastIndexOf('$')
if (probablySubclassIndex != -1 && probablySubclassIndex != 0 && className.length > probablySubclassIndex + 1) {
return className.substring(probablySubclassIndex + 1)
}
return null
}
private fun findClasses(project: Project,
scope: GlobalSearchScope,
shortClassName: String,
@@ -28,6 +36,13 @@ class ClassInfoResolver(val project: Project, private val mySearchScope: GlobalS
result.add(clazz)
}
}
if (result.isEmpty()) {
val newShortClassName = findSubclassName(shortClassName)
if (newShortClassName != null) {
val newTargetPackageName = targetPackageName + "." + shortClassName.substring(0, newShortClassName.length + 1)
return findClasses(project, scope, newShortClassName, newTargetPackageName)
}
}
return result.toList()
}

View File

@@ -96,7 +96,8 @@ internal class LogFinderHyperlinkHandler(private val probableClassName: Probable
val document = PsiDocumentManager.getInstance(element.getProject()).getDocument(element.containingFile) ?: return text
val lineNumber = document.getLineNumber(element.textRange.endOffset)
val textRange = element.textRange
.intersection(TextRange(document.getLineStartOffset(lineNumber), document.getLineEndOffset(lineNumber))) ?: element.textRange
.intersection(TextRange(document.getLineStartOffset(lineNumber), document.getLineEndOffset(lineNumber)))
?: element.textRange
val trimmedText = document.getText(textRange).trim()
return StringUtil.shortenTextWithEllipsis(trimmedText, 30, 0)
}
@@ -105,11 +106,20 @@ internal class LogFinderHyperlinkHandler(private val probableClassName: Probable
internal class LogVisitor(private val probableClassName: ProbableClassName) : PsiRecursiveElementVisitor() {
val similarClasses = mutableSetOf<UClass>()
val similarCalls = mutableSetOf<UCallExpression>()
private val shortClassNames = mutableSetOf<String>()
init {
val shortClassName = probableClassName.fullClassName.substringAfterLast('.')
shortClassNames.add(shortClassName)
val subclassName = ClassInfoResolver.findSubclassName(shortClassName)
if (subclassName != null) {
shortClassNames.add(subclassName)
}
}
override fun visitElement(element: PsiElement) {
val uClass = element.toUElementOfType<UClass>()
if (uClass != null && shortClassName == uClass.javaPsi.name) {
if (uClass != null && shortClassNames.contains(uClass.javaPsi.name)) {
similarClasses.add(uClass)
}
val uCall = element.toUElementOfType<UCallExpression>()

View File

@@ -285,4 +285,39 @@ public final class EmptySpringApplication {
)
)
}
fun testNestedClasses() {
LoggingTestUtils.addSlf4J(myFixture)
checkColumnFinderJava(
fileName = "UpperClass",
classText = """
package com.example;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class UpperClass {
public static class Inner{
private static final Logger log = org.slf4j.LoggerFactory.getLogger(Inner.class);
}
public static void main(String[] args) {
request1("1");
}
private static void request1(String number) {
System.out.println("com.example.UpperClass${"\$Inner"} test");
Inner.log.info("new request1 {}", number);
}
}
""".trimIndent(),
logItems = listOf(
LogItem("java.exe", null),
LogItem("1", null),
LogItem("com.example.UpperClass${"\$Inner"} test", LogicalPosition(6, 24)),
LogItem("[main] INFO com.example.UpperClass${"\$Inner"} -- new request1 1", LogicalPosition(17, 8)),
)
)
}
}