From 8540c07a0bf2e9c7174da2664c657ef246628fe4 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 14 May 2025 11:02:45 +0200 Subject: [PATCH] [kotlin] k2 unused symbol: process text search for class names faster KTIJ-33981 GitOrigin-RevId: 27808734a7e5aa93520be13f6a16fb70c9474df2 --- ...UnusedSymbolHighlightingTestGenerated.java | 10 ++++++++ .../idea/highlighting/K2UnusedSymbolUtil.kt | 23 ++++++++++++++++++- .../LocalInspectionTestGenerated.java | 10 ++++++++ .../multifile/textUsagesClass.1.txt | 1 + .../unusedSymbol/multifile/textUsagesClass.kt | 2 ++ .../unusedSymbol/textUsages.kt | 8 +++++++ .../unusedSymbol/textUsages.kt.after | 7 ++++++ 7 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.1.txt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt.after diff --git a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java index 6bd1139c0ddf..78256db3dd7d 100644 --- a/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java +++ b/plugins/kotlin/code-insight/inspections-k2/tests/test/org/jetbrains/kotlin/idea/k2/inspections/tests/K2UnusedSymbolHighlightingTestGenerated.java @@ -152,6 +152,11 @@ public abstract class K2UnusedSymbolHighlightingTestGenerated extends AbstractK2 public void testSecondaryConstructorUnused() throws Exception { runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/secondaryConstructorUnused.kt"); } + + @TestMetadata("textUsagesClass.kt") + public void testTextUsagesClass() throws Exception { + runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt"); + } } @RunWith(JUnit3RunnerWithInners.class) @@ -647,6 +652,11 @@ public abstract class K2UnusedSymbolHighlightingTestGenerated extends AbstractK2 runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/suppressedClass.kt"); } + @TestMetadata("textUsages.kt") + public void testTextUsages() throws Exception { + runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt"); + } + @TestMetadata("typeAlias.kt") public void testTypeAlias() throws Exception { runTest("../../../idea/tests/testData/inspectionsLocal/unusedSymbol/typeAlias.kt"); diff --git a/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt b/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt index 4ca565815fb7..e7fa4eac7d5b 100644 --- a/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt +++ b/plugins/kotlin/highlighting/highlighting-k2/src/org/jetbrains/kotlin/idea/highlighting/K2UnusedSymbolUtil.kt @@ -415,10 +415,31 @@ object K2UnusedSymbolUtil { val handler = (FindManager.getInstance(project) as FindManagerImpl).findUsagesManager.getFindUsagesHandler(declaration, true) if (handler != null) { + + fun classOrObjectHasTextUsages(classOrObject: KtClassOrObject): Boolean { + var hasTextUsages = false + + // Finding text usages + if (classOrObject.useScope is GlobalSearchScope) { + handler.processUsagesInText( + classOrObject, + { hasTextUsages = true; false }, + GlobalSearchScope.projectScope(classOrObject.project) + ) + } + + return hasTextUsages + } + + if (declaration is KtClassOrObject && classOrObjectHasTextUsages(declaration)) return true + + val options = handler.findUsagesOptions + // effectively disable search for text occurrences for classes which are processed earlier but faster + options.isSearchForTextOccurrences = false val result = handler.processElementUsages(declaration, Processor { val refElement = it.element refElement == null || checkReference(refElement, declaration, originalDeclaration) - }, handler.findUsagesOptions) + }, options) if (!result) { return true } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index d65cb8d5a620..aaa22ee76a66 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -17720,6 +17720,11 @@ public abstract class LocalInspectionTestGenerated extends AbstractLocalInspecti public void testSecondaryConstructorUnused() throws Exception { runTest("testData/inspectionsLocal/unusedSymbol/multifile/secondaryConstructorUnused.kt"); } + + @TestMetadata("textUsagesClass.kt") + public void testTextUsagesClass() throws Exception { + runTest("testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt"); + } } @RunWith(JUnit3RunnerWithInners.class) @@ -18215,6 +18220,11 @@ public abstract class LocalInspectionTestGenerated extends AbstractLocalInspecti runTest("testData/inspectionsLocal/unusedSymbol/suppressedClass.kt"); } + @TestMetadata("textUsages.kt") + public void testTextUsages() throws Exception { + runTest("testData/inspectionsLocal/unusedSymbol/textUsages.kt"); + } + @TestMetadata("typeAlias.kt") public void testTypeAlias() throws Exception { runTest("testData/inspectionsLocal/unusedSymbol/typeAlias.kt"); diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.1.txt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.1.txt new file mode 100644 index 000000000000..8e2c750df077 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.1.txt @@ -0,0 +1 @@ +use ABC sometimes \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt new file mode 100644 index 000000000000..14ddb1839608 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/multifile/textUsagesClass.kt @@ -0,0 +1,2 @@ +// PROBLEM: none +class ABC \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt new file mode 100644 index 000000000000..95f6d6e976a7 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt @@ -0,0 +1,8 @@ +class ABC { + internal fun foo() {} + // use foo sometimes +} + +fun main() { + ABC() +} diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt.after new file mode 100644 index 000000000000..8690444c62d2 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/unusedSymbol/textUsages.kt.after @@ -0,0 +1,7 @@ +class ABC { + // use foo sometimes +} + +fun main() { + ABC() +}