mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-04 17:20:55 +07:00
[java-console] IDEA-344708 JVM Log navigation doesn't support nested classes
GitOrigin-RevId: 80c2c932b4630df848b7ff897a1ac50c988b8bcc
This commit is contained in:
committed by
intellij-monorepo-bot
parent
d5da0ada2b
commit
199e367dbd
@@ -13,6 +13,14 @@ import com.intellij.psi.search.PsiShortNamesCache
|
|||||||
class ClassInfoResolver(val project: Project, private val mySearchScope: GlobalSearchScope) {
|
class ClassInfoResolver(val project: Project, private val mySearchScope: GlobalSearchScope) {
|
||||||
|
|
||||||
companion object {
|
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,
|
private fun findClasses(project: Project,
|
||||||
scope: GlobalSearchScope,
|
scope: GlobalSearchScope,
|
||||||
shortClassName: String,
|
shortClassName: String,
|
||||||
@@ -28,6 +36,13 @@ class ClassInfoResolver(val project: Project, private val mySearchScope: GlobalS
|
|||||||
result.add(clazz)
|
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()
|
return result.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -96,7 +96,8 @@ internal class LogFinderHyperlinkHandler(private val probableClassName: Probable
|
|||||||
val document = PsiDocumentManager.getInstance(element.getProject()).getDocument(element.containingFile) ?: return text
|
val document = PsiDocumentManager.getInstance(element.getProject()).getDocument(element.containingFile) ?: return text
|
||||||
val lineNumber = document.getLineNumber(element.textRange.endOffset)
|
val lineNumber = document.getLineNumber(element.textRange.endOffset)
|
||||||
val textRange = element.textRange
|
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()
|
val trimmedText = document.getText(textRange).trim()
|
||||||
return StringUtil.shortenTextWithEllipsis(trimmedText, 30, 0)
|
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() {
|
internal class LogVisitor(private val probableClassName: ProbableClassName) : PsiRecursiveElementVisitor() {
|
||||||
val similarClasses = mutableSetOf<UClass>()
|
val similarClasses = mutableSetOf<UClass>()
|
||||||
val similarCalls = mutableSetOf<UCallExpression>()
|
val similarCalls = mutableSetOf<UCallExpression>()
|
||||||
val shortClassName = probableClassName.fullClassName.substringAfterLast('.')
|
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) {
|
override fun visitElement(element: PsiElement) {
|
||||||
val uClass = element.toUElementOfType<UClass>()
|
val uClass = element.toUElementOfType<UClass>()
|
||||||
if (uClass != null && shortClassName == uClass.javaPsi.name) {
|
if (uClass != null && shortClassNames.contains(uClass.javaPsi.name)) {
|
||||||
similarClasses.add(uClass)
|
similarClasses.add(uClass)
|
||||||
}
|
}
|
||||||
val uCall = element.toUElementOfType<UCallExpression>()
|
val uCall = element.toUElementOfType<UCallExpression>()
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user