From aff2547ff806098340560396832d8b0b79806f43 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Mon, 19 Jan 2015 23:07:29 +0300 Subject: [PATCH] Searching for properties declared in class constructor signature. --- .../inspections/UnusedSymbolInspection.kt | 22 ++++++++++++++++++- .../parameter/inspectionData/expected.xml | 10 +++++++++ .../parameter/inspectionData/inspections.test | 1 + .../parameter/paramPropertyDataClass.kt | 6 +++++ .../parameter/paramPropertyOverriddenUsed.kt | 9 ++++++++ .../parameter/paramPropertyOverride.kt | 10 +++++++++ .../parameter/paramPropertyUnused.kt | 5 +++++ .../parameter/paramPropertyUsed.kt | 5 +++++ .../unusedSymbol/parameter/usedInJava.java | 10 +++++++++ .../unusedSymbol/parameter/usedInJava.kt | 3 +++ .../JetInspectionTestGenerated.java | 6 +++++ 11 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 idea/testData/inspections/unusedSymbol/parameter/inspectionData/expected.xml create mode 100644 idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test create mode 100644 idea/testData/inspections/unusedSymbol/parameter/paramPropertyDataClass.kt create mode 100644 idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverriddenUsed.kt create mode 100644 idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverride.kt create mode 100644 idea/testData/inspections/unusedSymbol/parameter/paramPropertyUnused.kt create mode 100644 idea/testData/inspections/unusedSymbol/parameter/paramPropertyUsed.kt create mode 100644 idea/testData/inspections/unusedSymbol/parameter/usedInJava.java create mode 100644 idea/testData/inspections/unusedSymbol/parameter/usedInJava.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt index a3ae212e20e..fb8dece0143 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedSymbolInspection.kt @@ -47,6 +47,8 @@ import org.jetbrains.kotlin.psi.JetEnumEntry import org.jetbrains.kotlin.psi.JetProperty import org.jetbrains.kotlin.idea.search.usagesSearch.PropertyUsagesSearchHelper import org.jetbrains.kotlin.idea.search.usagesSearch.getAccessorNames +import org.jetbrains.kotlin.psi.JetParameter +import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunctionName public class UnusedSymbolInspection : AbstractKotlinInspection() { private val javaInspection = UnusedDeclarationInspection() @@ -100,6 +102,24 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { ProblemHighlightType.LIKE_UNUSED_SYMBOL ) // TODO add quick fix to delete it } + + override fun visitParameter(parameter: JetParameter) { + if (parameter.getName() == null) return + + if (parameter.getParent()?.getParent() !is JetClass || !parameter.hasValOrVarNode()) return + + // properties can be referred by component1/component2, which is too expensive to search, don't mark them as unused + if (parameter.dataClassComponentFunctionName() != null) return + + if (parameter.hasModifier(JetTokens.OVERRIDE_KEYWORD)) return + if (hasNonTrivialUsages(parameter)) return + + holder.registerProblem( + parameter.getNameIdentifier(), + JetBundle.message("unused.property", parameter.getName()), + ProblemHighlightType.LIKE_UNUSED_SYMBOL + ) // TODO add quick fix to delete it + } } } @@ -156,7 +176,7 @@ public class UnusedSymbolInspection : AbstractKotlinInspection() { val searchHelper: UsagesSearchHelper = when (declaration) { is JetClass -> ClassUsagesSearchHelper(constructorUsages = true, nonConstructorUsages = true, skipImports = true) is JetNamedFunction -> FunctionUsagesSearchHelper(skipImports = true) - is JetProperty -> PropertyUsagesSearchHelper(skipImports = true) + is JetProperty, is JetParameter -> PropertyUsagesSearchHelper(skipImports = true) else -> return false } diff --git a/idea/testData/inspections/unusedSymbol/parameter/inspectionData/expected.xml b/idea/testData/inspections/unusedSymbol/parameter/inspectionData/expected.xml new file mode 100644 index 00000000000..e7dcf602308 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/inspectionData/expected.xml @@ -0,0 +1,10 @@ + + + paramPropertyUnused.kt + 1 + light_idea_test_case + + Unused Symbol + Property 'param' is never used + + diff --git a/idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test b/idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test new file mode 100644 index 00000000000..02aea1c357e --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.inspections.UnusedSymbolInspection diff --git a/idea/testData/inspections/unusedSymbol/parameter/paramPropertyDataClass.kt b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyDataClass.kt new file mode 100644 index 00000000000..3d1deee63a0 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyDataClass.kt @@ -0,0 +1,6 @@ +// properties can be referred by component1/component2, which is too expensive to search, don't mark them as unused +data class MyClass(val param1: String, var param2: String) + +fun main(args: Array) { + MyClass() +} diff --git a/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverriddenUsed.kt b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverriddenUsed.kt new file mode 100644 index 00000000000..95a36dfafc7 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverriddenUsed.kt @@ -0,0 +1,9 @@ +open class Klass { + open val used = ":)" +} + +class Subklass: Klass(override val used: String) + +fun main(args: Array) { + Subklass().used +} \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverride.kt b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverride.kt new file mode 100644 index 00000000000..bf3cc11e1da --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyOverride.kt @@ -0,0 +1,10 @@ +trait Trait { + val member: String +} + +class Klass(override val member: String) + +fun main(args: Array) { + val t: Trait = Klass() + println(t.member) +} diff --git a/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUnused.kt b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUnused.kt new file mode 100644 index 00000000000..0e2e878aeed --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUnused.kt @@ -0,0 +1,5 @@ +class MyClass(val param: String) + +fun main(args: Array) { + MyClass() +} diff --git a/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUsed.kt b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUsed.kt new file mode 100644 index 00000000000..caf08d692e1 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/paramPropertyUsed.kt @@ -0,0 +1,5 @@ +class MyClass(val param: String) + +fun main(args: Array) { + MyClass().param +} diff --git a/idea/testData/inspections/unusedSymbol/parameter/usedInJava.java b/idea/testData/inspections/unusedSymbol/parameter/usedInJava.java new file mode 100644 index 00000000000..899df6c9dfb --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/usedInJava.java @@ -0,0 +1,10 @@ +package test; + +import foo.UsedInJava; + +class usedInJava { + public static void main(String[] args) { + new UsedInJava("a", "b").getUsedByGetter(); + new UsedInJava("a", "b").setUsedBySetter(":|"); + } +} \ No newline at end of file diff --git a/idea/testData/inspections/unusedSymbol/parameter/usedInJava.kt b/idea/testData/inspections/unusedSymbol/parameter/usedInJava.kt new file mode 100644 index 00000000000..94d1ad7d666 --- /dev/null +++ b/idea/testData/inspections/unusedSymbol/parameter/usedInJava.kt @@ -0,0 +1,3 @@ +package foo + +class UsedInJava(val usedByGetter: String, var usedBySetter: String) diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/JetInspectionTestGenerated.java index c07748ac99c..dc4e6f4454b 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/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"); + doTest(fileName); + } + @TestMetadata("unusedSymbol/property/inspectionData/inspections.test") public void testUnusedSymbol_property_inspectionData_Inspections_test() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/inspections/unusedSymbol/property/inspectionData/inspections.test");