From 9b22fc06c72b53afc675a8f9e023bf038ad8a39d Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 11 Dec 2014 16:12:05 +0300 Subject: [PATCH] Class used in text is not unused. --- .../idea/inspections/UnusedSymbolInspection.kt | 17 ++++++++++++++++- .../class/inspectionData/expected.xml | 8 ++++++++ .../unusedSymbol/class/usedInText.kt | 3 +++ .../unusedSymbol/class/usedInText.txt | 1 + .../unusedSymbol/class/usedInTextByShortName.kt | 3 +++ .../class/usedInTextByShortName.txt | 1 + .../codeInsight/AbstractJetInspectionTest.kt | 8 ++++++-- 7 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 idea/testData/inspections/unusedSymbol/class/usedInText.kt create mode 100644 idea/testData/inspections/unusedSymbol/class/usedInText.txt create mode 100644 idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.kt create mode 100644 idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.txt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index 02d7b543643..a2e3be2c9be 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -31,6 +31,9 @@ import org.jetbrains.kotlin.idea.JetBundle import com.intellij.codeInspection.ProblemHighlightType import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.idea.findUsages.handlers.KotlinFindClassUsagesHandler +import com.intellij.psi.search.GlobalSearchScope +import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory public class UnusedSymbolInspection : AbstractKotlinInspection() { private val javaInspection = UnusedDeclarationInspection() @@ -45,8 +48,10 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { val lightClass = LightClassUtil.getPsiClass(klass) if (lightClass != null && javaInspection.isEntryPoint(lightClass)) return + val classUseScope = klass.getUseScope() + val usagesSearchHelper = KotlinClassFindUsagesOptions(holder.getProject()).toClassHelper() - val request = usagesSearchHelper.newRequest(UsagesSearchTarget(klass, klass.getUseScope())) + val request = usagesSearchHelper.newRequest(UsagesSearchTarget(klass, classUseScope)) val query = UsagesSearch.search(request) var foundNonTrivialUsage = false @@ -61,6 +66,16 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { } }) + // Finding text usages + if (classUseScope is GlobalSearchScope) { + val findClassUsagesHandler = KotlinFindClassUsagesHandler(klass, KotlinFindUsagesHandlerFactory(klass.getProject())) + findClassUsagesHandler.processUsagesInText( + klass, + { foundNonTrivialUsage = true; false }, + classUseScope + ) + } + if (!foundNonTrivialUsage) { holder.registerProblem( klass.getNameIdentifier(), diff --git a/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml b/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml index 327bb5f3ea4..a9f965e3f52 100644 --- a/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml +++ b/idea/testData/inspections/unusedSymbol/class/inspectionData/expected.xml @@ -23,4 +23,12 @@ Unused Symbol Class 'Local' is never used + + usedInTextByShortName.kt + 3 + light_idea_test_case + + Unused Symbol + Class 'UsedInTextByShortName' is never used + diff --git a/idea/testData/inspections/unusedSymbol/class/usedInText.kt b/idea/testData/inspections/unusedSymbol/class/usedInText.kt new file mode 100644 index 00000000000..aab19201893 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/class/usedInText.kt @@ -0,0 +1,3 @@ +package foo + +class UsedInTextOnly diff --git a/idea/testData/inspections/unusedSymbol/class/usedInText.txt b/idea/testData/inspections/unusedSymbol/class/usedInText.txt new file mode 100644 index 00000000000..0a76f6e9bc2 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/class/usedInText.txt @@ -0,0 +1 @@ +foo.UsedInTextOnly \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.kt b/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.kt new file mode 100644 index 00000000000..4884dc491d1 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.kt @@ -0,0 +1,3 @@ +package foo + +class UsedInTextByShortName diff --git a/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.txt b/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.txt new file mode 100644 index 00000000000..026fb14799d --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/class/usedInTextByShortName.txt @@ -0,0 +1 @@ +UsedInTextByShortName \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractJetInspectionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractJetInspectionTest.kt index c7a581e4adb..00e85b87fcb 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractJetInspectionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/AbstractJetInspectionTest.kt @@ -53,11 +53,15 @@ public abstract class AbstractJetInspectionTest: LightCodeInsightFixtureTestCase setTestDataPath("${JetTestUtils.getHomeDirectory()}/$srcDir") val psiFiles = srcDir - .listFiles { it.getName().endsWith(".kt") }!! + .listFiles { it.getName().endsWith(".kt") || it.getName().endsWith(".txt") }!! .map { file -> val text = FileUtil.loadFile(file, true) - val fileText = if (text.startsWith("package")) text else "package ${file.getName().trimTrailing(".kt")};$text" + val fileText = + if (text.startsWith("package") || !file.getName().endsWith(".kt")) + text + else + "package ${file.getName().trimTrailing(".kt")};$text" configureByText(file.getName(), fileText)!! }