From 398f92dc6f3d747be4e4ba090f80e3c67e82036e Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 5 Jul 2017 16:21:19 +0300 Subject: [PATCH] Lift assignment out: do not suggest if other assignments available So #KT-18709 Fixed --- .../BranchedFoldingUtils.kt | 18 ++++++++++++++---- .../ifToAssignment/multipleAssignments.kt | 12 ++++++++++++ .../LocalInspectionTestGenerated.java | 6 ++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt index aa84f5a5e39..0d49047a6a7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/BranchedFoldingUtils.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.intentions.branches import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.lastBlockStatementOrThis import org.jetbrains.kotlin.types.typeUtil.isNothing @@ -51,7 +52,8 @@ object BranchedFoldingUtils { a1.left?.text == a2.left?.text && a1.operationToken == a2.operationToken internal fun getFoldableAssignmentNumber(expression: KtExpression?): Int { - val assignments = mutableListOf() + expression ?: return -1 + val assignments = linkedSetOf() fun collectAssignmentsAndCheck(e: KtExpression?): Boolean = when (e) { is KtWhenExpression -> { val entries = e.entries @@ -79,9 +81,17 @@ object BranchedFoldingUtils { else -> false } if (!collectAssignmentsAndCheck(expression)) return -1 - if (assignments.isEmpty()) return 0 - val firstAssignment = assignments.first() - if (assignments.any { !BranchedFoldingUtils.checkAssignmentsMatch(it, firstAssignment) }) return -1 + val firstAssignment = assignments.firstOrNull() + if (firstAssignment != null && assignments.any { !BranchedFoldingUtils.checkAssignmentsMatch(it, firstAssignment) }) { + return -1 + } + if (expression.anyDescendantOfType( + predicate = { + it.operationToken in KtTokens.ALL_ASSIGNMENTS && it !in assignments + } + )) { + return -1 + } return assignments.size } diff --git a/idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt new file mode 100644 index 00000000000..ea0bef7ee02 --- /dev/null +++ b/idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt @@ -0,0 +1,12 @@ +// PROBLEM: none + +fun foo(x: Boolean): String { + var s = "" + if (x) { + s += "a" + s += "b" + } else { + s += "c" + } + return s +} \ 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 d23148298a5..2761b336c9c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -442,6 +442,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { doTest(fileName); } + @TestMetadata("multipleAssignments.kt") + public void testMultipleAssignments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/liftOut/ifToAssignment/multipleAssignments.kt"); + doTest(fileName); + } + @TestMetadata("simpleIf.kt") public void testSimpleIf() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/liftOut/ifToAssignment/simpleIf.kt");