From b09465ca0b08f9004a32663dcae4f9723c7405f5 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 23 Nov 2017 17:09:55 +0300 Subject: [PATCH] Unnecessary variable: do not suggest in case of name duplication So #KT-20300 Fixed --- .../UnnecessaryVariableInspection.kt | 23 ++++++++++++++++--- .../unnecessaryVariable/it.kt | 11 +++++++++ .../parameterWithSameNameBelow.kt | 15 ++++++++++++ .../LocalInspectionTestGenerated.java | 12 ++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 idea/testData/inspectionsLocal/unnecessaryVariable/it.kt create mode 100644 idea/testData/inspectionsLocal/unnecessaryVariable/parameterWithSameNameBelow.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt index 85498ac3bfe..8931d6283e0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnnecessaryVariableInspection.kt @@ -27,12 +27,13 @@ import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator import org.jetbrains.kotlin.idea.refactoring.inline.KotlinInlineValHandler import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments -import org.jetbrains.kotlin.psi.psiUtil.getParentOfType +import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext.DECLARATION_TO_DESCRIPTOR import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils class UnnecessaryVariableInspection : AbstractKotlinInspection() { @@ -73,7 +74,23 @@ class UnnecessaryVariableInspection : AbstractKotlinInspection() { val initializerDescriptor = context[REFERENCE_TARGET, initializer] as? VariableDescriptor ?: return false if (initializerDescriptor.isVar) return false if (initializerDescriptor.containingDeclaration !is FunctionDescriptor) return false - return ReferencesSearch.search(property, LocalSearchScope(enclosingElement)).findFirst() != null + + val copyName = initializerDescriptor.name.asString() + if (ReferencesSearch.search(property, LocalSearchScope(enclosingElement)).findFirst() == null) return false + + val containingDeclaration = property.getStrictParentOfType() + if (containingDeclaration != null) { + val validator = NewDeclarationNameValidator( + container = containingDeclaration, + anchor = property, + target = NewDeclarationNameValidator.Target.VARIABLES, + excludedDeclarations = listOfNotNull( + DescriptorToSourceUtils.descriptorToDeclaration(initializerDescriptor) as? KtDeclaration + ) + ) + if (!validator(copyName)) return false + } + return true } return false } diff --git a/idea/testData/inspectionsLocal/unnecessaryVariable/it.kt b/idea/testData/inspectionsLocal/unnecessaryVariable/it.kt new file mode 100644 index 00000000000..4a224d5a37d --- /dev/null +++ b/idea/testData/inspectionsLocal/unnecessaryVariable/it.kt @@ -0,0 +1,11 @@ +// PROBLEM: none +// WITH_RUNTIME + +fun foo(a: List, b: List) { + a.forEach { + val a2 = it + b.forEach { + println(a2.length) + } + } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/unnecessaryVariable/parameterWithSameNameBelow.kt b/idea/testData/inspectionsLocal/unnecessaryVariable/parameterWithSameNameBelow.kt new file mode 100644 index 00000000000..6214e85533a --- /dev/null +++ b/idea/testData/inspectionsLocal/unnecessaryVariable/parameterWithSameNameBelow.kt @@ -0,0 +1,15 @@ +// PROBLEM: none + +interface Callback { + fun on(id: Int) +} + +fun called(id: Int) { + val calledId = id + object : Callback { + override fun on(id: Int) { + if (id == calledId) { + } + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index e641f7e56a0..d5a0114d5e1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -2510,12 +2510,24 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { doTest(fileName); } + @TestMetadata("it.kt") + public void testIt() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/unnecessaryVariable/it.kt"); + doTest(fileName); + } + @TestMetadata("paramCopy.kt") public void testParamCopy() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/unnecessaryVariable/paramCopy.kt"); doTest(fileName); } + @TestMetadata("parameterWithSameNameBelow.kt") + public void testParameterWithSameNameBelow() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/unnecessaryVariable/parameterWithSameNameBelow.kt"); + doTest(fileName); + } + @TestMetadata("propertyCopy.kt") public void testPropertyCopy() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/unnecessaryVariable/propertyCopy.kt");