From 386854d73fd0049c28c85532e258337822cfed6a Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 21 Jan 2015 21:36:57 +0300 Subject: [PATCH] Unused object. unusedButEntryPointMain for class was actually a wrong test: it didn't check anything, because objects are were not checked for unusedness before. --- .../kotlin/idea/JetBundle.properties | 1 + .../inspections/UnusedSymbolInspection.kt | 17 ++++++---- .../class/unusedButEntryPointMain.kt | 5 --- .../object/inspectionData/expected.xml | 34 +++++++++++++++++++ .../object/inspectionData/inspections.test | 1 + .../inspections/unusedSymbol/object/unused.kt | 1 + .../object/unusedButEntryPointMain.kt | 11 ++++++ .../inspections/unusedSymbol/object/used.kt | 5 +++ .../unusedSymbol/object/usedInJava.java | 5 +++ .../unusedSymbol/object/usedInJava.kt | 6 ++++ .../unusedSymbol/object/usedInText.kt | 3 ++ .../unusedSymbol/object/usedInText.txt | 1 + .../object/usedInTextByShortName.kt | 3 ++ .../object/usedInTextByShortName.txt | 1 + .../unusedSymbol/object/usedInXml.kt | 3 ++ .../unusedSymbol/object/usedInXml.xml | 1 + .../unusedSymbol/object/usedOnlyInImport.kt | 4 +++ .../unusedSymbol/object/usedOnlyInside.kt | 9 +++++ .../JetInspectionTestGenerated.java | 6 ++++ 19 files changed, 105 insertions(+), 12 deletions(-) delete mode 100644 idea/testData/inspections/unusedSymbol/class/unusedButEntryPointMain.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/inspectionData/expected.xml create mode 100644 idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test create mode 100644 idea/testData/inspections/unusedSymbol/object/unused.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/unusedButEntryPointMain.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/used.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInJava.java create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInJava.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInText.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInText.txt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.txt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInXml.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedInXml.xml create mode 100644 idea/testData/inspections/unusedSymbol/object/usedOnlyInImport.kt create mode 100644 idea/testData/inspections/unusedSymbol/object/usedOnlyInside.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties index aeb07ab1125..e4f0cee0681 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/JetBundle.properties @@ -118,6 +118,7 @@ goto.super.property.chooser.title=Choose super property goto.super.class.chooser.title=Choose super class or interface unused.class=Class ''{0}'' is never used +unused.object=Object ''{0}'' is never used unused.function=Function ''{0}'' is never used unused.property=Property ''{0}'' is never used unused.type.parameter=Type parameter ''{0}'' is never used diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index 34943c20fcd..5bdfaca7b0f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -59,6 +59,8 @@ import com.intellij.codeInsight.daemon.QuickFixBundle import com.intellij.codeInsight.FileModificationService import com.intellij.refactoring.safeDelete.SafeDeleteHandler import org.jetbrains.kotlin.psi.JetPsiUtil +import org.jetbrains.kotlin.psi.JetObjectDeclaration +import org.jetbrains.kotlin.psi.JetClassOrObject public class UnusedSymbolInspection : AbstractKotlinInspection() { private val javaInspection = UnusedDeclarationInspection() @@ -83,6 +85,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { override fun visitNamedDeclaration(declaration: JetNamedDeclaration) { val messageKey = when (declaration) { is JetClass -> "unused.class" + is JetObjectDeclaration -> "unused.object" is JetNamedFunction -> "unused.function" is JetProperty, is JetParameter -> "unused.property" is JetTypeParameter -> "unused.type.parameter" @@ -104,7 +107,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { // Main checks: finding reference usages && text usages if (hasNonTrivialUsages(declaration)) return - if (declaration is JetClass && classHasTextUsages(declaration)) return + if (declaration is JetClassOrObject && classOrObjectHasTextUsages(declaration)) return holder.registerProblem( declaration.getNameIdentifier(), @@ -118,23 +121,23 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { private fun isEntryPoint(declaration: JetNamedDeclaration): Boolean { val lightElement: PsiElement? = when (declaration) { - is JetClass -> declaration.toLightClass() + is JetClassOrObject -> declaration.toLightClass() is JetNamedFunction -> LightClassUtil.getLightClassMethod(declaration) else -> return false } return lightElement != null && javaInspection.isEntryPoint(lightElement) } - private fun classHasTextUsages(klass: JetClass): Boolean { + private fun classOrObjectHasTextUsages(classOrObject: JetClassOrObject): Boolean { var hasTextUsages = false // Finding text usages - if (klass.getUseScope() is GlobalSearchScope) { - val findClassUsagesHandler = KotlinFindClassUsagesHandler(klass, KotlinFindUsagesHandlerFactory(klass.getProject())) + if (classOrObject.getUseScope() is GlobalSearchScope) { + val findClassUsagesHandler = KotlinFindClassUsagesHandler(classOrObject, KotlinFindUsagesHandlerFactory(classOrObject.getProject())) findClassUsagesHandler.processUsagesInText( - klass, + classOrObject, { hasTextUsages = true; false }, - GlobalSearchScope.projectScope(klass.getProject()) + GlobalSearchScope.projectScope(classOrObject.getProject()) ) } diff --git a/idea/testData/inspections/unusedSymbol/class/unusedButEntryPointMain.kt b/idea/testData/inspections/unusedSymbol/class/unusedButEntryPointMain.kt deleted file mode 100644 index a3734222f7a..00000000000 --- a/idea/testData/inspections/unusedSymbol/class/unusedButEntryPointMain.kt +++ /dev/null @@ -1,5 +0,0 @@ -object EntryPoint { - fun main(args: Array) { - - } -} diff --git a/idea/testData/inspections/unusedSymbol/object/inspectionData/expected.xml b/idea/testData/inspections/unusedSymbol/object/inspectionData/expected.xml new file mode 100644 index 00000000000..83fca7a2830 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/inspectionData/expected.xml @@ -0,0 +1,34 @@ + + + unused.kt + 1 + light_idea_test_case + + Unused Symbol + Object 'A' is never used + + + usedOnlyInside.kt + 1 + light_idea_test_case + + Unused Symbol + Object 'A' is never used + + + usedInTextByShortName.kt + 3 + light_idea_test_case + + Unused Symbol + Object 'UsedInTextByShortName' is never used + + + usedOnlyInImport.kt + 3 + light_idea_test_case + + Unused Symbol + Object 'A' is never used + + diff --git a/idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test b/idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test new file mode 100644 index 00000000000..02aea1c357e --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.UnusedSymbolInspection diff --git a/idea/testData/inspections/unusedSymbol/object/unused.kt b/idea/testData/inspections/unusedSymbol/object/unused.kt new file mode 100644 index 00000000000..528ffce71c5 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/unused.kt @@ -0,0 +1 @@ +object A \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/unusedButEntryPointMain.kt b/idea/testData/inspections/unusedSymbol/object/unusedButEntryPointMain.kt new file mode 100644 index 00000000000..dc1e35e255c --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/unusedButEntryPointMain.kt @@ -0,0 +1,11 @@ +package entryPoint + +// WITH_RUNTIME + +import kotlin.platform.platformStatic + +object EntryPoint { + platformStatic public fun main(args: Array) { + + } +} diff --git a/idea/testData/inspections/unusedSymbol/object/used.kt b/idea/testData/inspections/unusedSymbol/object/used.kt new file mode 100644 index 00000000000..a013c3892f5 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/used.kt @@ -0,0 +1,5 @@ +object A + +fun main(args: Array) { + val x = A +} \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/usedInJava.java b/idea/testData/inspections/unusedSymbol/object/usedInJava.java new file mode 100644 index 00000000000..4882d16fb20 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInJava.java @@ -0,0 +1,5 @@ +class RandomJavaClass { + void f() { + foo.UsedInJava.INSTANCE$.bar(); + } +} \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/usedInJava.kt b/idea/testData/inspections/unusedSymbol/object/usedInJava.kt new file mode 100644 index 00000000000..42e14269c99 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInJava.kt @@ -0,0 +1,6 @@ +package foo + +object UsedInJava { + fun bar() { + } +} diff --git a/idea/testData/inspections/unusedSymbol/object/usedInText.kt b/idea/testData/inspections/unusedSymbol/object/usedInText.kt new file mode 100644 index 00000000000..a640f158289 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInText.kt @@ -0,0 +1,3 @@ +package foo + +object UsedInTextOnly diff --git a/idea/testData/inspections/unusedSymbol/object/usedInText.txt b/idea/testData/inspections/unusedSymbol/object/usedInText.txt new file mode 100644 index 00000000000..0a76f6e9bc2 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInText.txt @@ -0,0 +1 @@ +foo.UsedInTextOnly \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.kt b/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.kt new file mode 100644 index 00000000000..832eaf1402e --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.kt @@ -0,0 +1,3 @@ +package foo + +object UsedInTextByShortName diff --git a/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.txt b/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.txt new file mode 100644 index 00000000000..026fb14799d --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInTextByShortName.txt @@ -0,0 +1 @@ +UsedInTextByShortName \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/usedInXml.kt b/idea/testData/inspections/unusedSymbol/object/usedInXml.kt new file mode 100644 index 00000000000..2d663b797b9 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInXml.kt @@ -0,0 +1,3 @@ +package foo + +object UsedInXmlOnly diff --git a/idea/testData/inspections/unusedSymbol/object/usedInXml.xml b/idea/testData/inspections/unusedSymbol/object/usedInXml.xml new file mode 100644 index 00000000000..6eb9f715663 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedInXml.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/object/usedOnlyInImport.kt b/idea/testData/inspections/unusedSymbol/object/usedOnlyInImport.kt new file mode 100644 index 00000000000..70f6029f7ce --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedOnlyInImport.kt @@ -0,0 +1,4 @@ +import A + +object A { +} diff --git a/idea/testData/inspections/unusedSymbol/object/usedOnlyInside.kt b/idea/testData/inspections/unusedSymbol/object/usedOnlyInside.kt new file mode 100644 index 00000000000..afe5f68c25e --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/object/usedOnlyInside.kt @@ -0,0 +1,9 @@ +object A { + fun foo() { + A.bar() + } + + fun bar() { + A.foo() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java index e55bf071ee2..f4e7b705d0f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java @@ -90,6 +90,12 @@ public class JetInspectionTestGenerated extends AbstractJetInspectionTest { doTest(fileName); } + @TestMetadata("unusedSymbol/object/inspectionData/inspections.test") + public void testUnusedSymbol_object_inspectionData_Inspections_test() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/object/inspectionData/inspections.test"); + doTest(fileName); + } + @TestMetadata("unusedSymbol/parameter/inspectionData/inspections.test") public void testUnusedSymbol_parameter_inspectionData_Inspections_test() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test");