From d9e1e82948f31aec15bcddbc74cf07ebdaf4fa89 Mon Sep 17 00:00:00 2001 From: mglukhikh Date: Fri, 31 Mar 2017 15:14:21 +0300 Subject: [PATCH] Destructure is available even without usages #KT-14435 Fixed --- .../kotlin/idea/intentions/DestructureIntention.kt | 14 ++++++++++++-- .../intentions/iterationOverMap/DataClassUnused.kt | 1 - .../iterationOverMap/DataClassUnused.kt.after | 6 ++++++ .../intentions/iterationOverMap/NoKeyOrValue.kt | 6 ++++++ .../iterationOverMap/NoKeyOrValue.kt.after | 6 ++++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 6 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 idea/testData/intentions/iterationOverMap/DataClassUnused.kt.after create mode 100644 idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt create mode 100644 idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt index 8bdf150e53a..63767f0c513 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/DestructureIntention.kt @@ -74,9 +74,14 @@ class DestructureIntention : SelfTargetingRangeIntention( ) val names = ArrayList() val underscoreSupported = element.languageVersionSettings.supportsFeature(LanguageFeature.SingleUnderscoreForParameterName) + // For all unused we generate normal names, not underscores + val allUnused = usagesToRemove.all { (_, usagesToReplace, variableToDrop) -> + usagesToReplace.isEmpty() && variableToDrop == null + } + usagesToRemove.forEach { (descriptor, usagesToReplace, variableToDrop, name) -> val suggestedName = - if (usagesToReplace.isEmpty() && variableToDrop == null && underscoreSupported) { + if (usagesToReplace.isEmpty() && variableToDrop == null && underscoreSupported && !allUnused) { "_" } else { @@ -233,7 +238,12 @@ class DestructureIntention : SelfTargetingRangeIntention( if (!noBadUsages) return null val droppedLastUnused = usagesToRemove.dropLastWhile { it.usagesToReplace.isEmpty() && it.declarationToDrop == null } - return UsagesToRemove(droppedLastUnused, removeSelectorInLoopRange) + return if (droppedLastUnused.isEmpty()) { + UsagesToRemove(usagesToRemove, removeSelectorInLoopRange) + } + else { + UsagesToRemove(droppedLastUnused, removeSelectorInLoopRange) + } } private fun Query.iterateOverMapEntryPropertiesUsages( diff --git a/idea/testData/intentions/iterationOverMap/DataClassUnused.kt b/idea/testData/intentions/iterationOverMap/DataClassUnused.kt index f3ea00fbd46..6e97564a498 100644 --- a/idea/testData/intentions/iterationOverMap/DataClassUnused.kt +++ b/idea/testData/intentions/iterationOverMap/DataClassUnused.kt @@ -1,4 +1,3 @@ -// IS_APPLICABLE: false // WITH_RUNTIME data class XY(val x: String, val y: String) diff --git a/idea/testData/intentions/iterationOverMap/DataClassUnused.kt.after b/idea/testData/intentions/iterationOverMap/DataClassUnused.kt.after new file mode 100644 index 00000000000..169cc3093d6 --- /dev/null +++ b/idea/testData/intentions/iterationOverMap/DataClassUnused.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME + +data class XY(val x: String, val y: String) +fun test(xys: Array) { + for ((x, y) in xys) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt b/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt new file mode 100644 index 00000000000..0d0b584dd92 --- /dev/null +++ b/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME + +fun main(args: Array) { + val map = hashMapOf(1 to 1) + for (entry in map) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt.after b/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt.after new file mode 100644 index 00000000000..8ab8213d812 --- /dev/null +++ b/idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME + +fun main(args: Array) { + val map = hashMapOf(1 to 1) + for ((key, value) in map) {} +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 05930664ba0..9c1f6c969f8 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -9170,6 +9170,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("NoKeyOrValue.kt") + public void testNoKeyOrValue() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/iterationOverMap/NoKeyOrValue.kt"); + doTest(fileName); + } + @TestMetadata("OnlyKeyUsed.kt") public void testOnlyKeyUsed() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/iterationOverMap/OnlyKeyUsed.kt");