diff --git a/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/ClassInfoResolver.kt b/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/ClassInfoResolver.kt index 9e18695a6fbf..8278b2c8848f 100644 --- a/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/ClassInfoResolver.kt +++ b/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/ClassInfoResolver.kt @@ -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() } diff --git a/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/LogFinderHyperlinkHandler.kt b/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/LogFinderHyperlinkHandler.kt index beb8e3dabbe7..d9d9fbc84ef7 100644 --- a/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/LogFinderHyperlinkHandler.kt +++ b/jvm/jvm-analysis-impl/src/com/intellij/analysis/customization/console/LogFinderHyperlinkHandler.kt @@ -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() val similarCalls = mutableSetOf() - val shortClassName = probableClassName.fullClassName.substringAfterLast('.') + private val shortClassNames = mutableSetOf() + + 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() - if (uClass != null && shortClassName == uClass.javaPsi.name) { + if (uClass != null && shortClassNames.contains(uClass.javaPsi.name)) { similarClasses.add(uClass) } val uCall = element.toUElementOfType() diff --git a/jvm/jvm-analysis-java-tests/testSrc/com/intellij/customization/console/console/JavaLogFinderHyperlinkTest.kt b/jvm/jvm-analysis-java-tests/testSrc/com/intellij/customization/console/console/JavaLogFinderHyperlinkTest.kt index 9a45a9e702b6..fc8ccea8af2f 100644 --- a/jvm/jvm-analysis-java-tests/testSrc/com/intellij/customization/console/console/JavaLogFinderHyperlinkTest.kt +++ b/jvm/jvm-analysis-java-tests/testSrc/com/intellij/customization/console/console/JavaLogFinderHyperlinkTest.kt @@ -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)), + ) + ) + } } \ No newline at end of file