From 9ff7539ff0ab94274278e00210b0173ba69fee95 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 12 Nov 2019 12:22:52 +0900 Subject: [PATCH] "Merge 'if's" intention: do not remove nested comments #KT-33258 Fixed #KT-39552 Fixed --- .../kotlin/idea/intentions/MergeIfsIntention.kt | 16 ++++++++++++++++ .../intentions/mergeIfs/comments.kt.after | 4 +++- idea/testData/intentions/mergeIfs/comments2.kt | 11 +++++++++++ .../intentions/mergeIfs/comments2.kt.after | 11 +++++++++++ idea/testData/intentions/mergeIfs/comments3.kt | 8 ++++++++ .../intentions/mergeIfs/comments3.kt.after | 7 +++++++ .../idea/intentions/IntentionTestGenerated.java | 10 ++++++++++ 7 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/mergeIfs/comments2.kt create mode 100644 idea/testData/intentions/mergeIfs/comments2.kt.after create mode 100644 idea/testData/intentions/mergeIfs/comments3.kt create mode 100644 idea/testData/intentions/mergeIfs/comments3.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MergeIfsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MergeIfsIntention.kt index 97ecd7e2d46..0acdce71807 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MergeIfsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MergeIfsIntention.kt @@ -6,8 +6,12 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiComment import org.jetbrains.kotlin.idea.KotlinBundle +import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.allChildren +import org.jetbrains.kotlin.psi.psiUtil.startOffset class MergeIfsIntention : SelfTargetingIntention(KtIfExpression::class.java, KotlinBundle.lazyMessage("merge.if.s")) { override fun isApplicableTo(element: KtIfExpression, caretOffset: Int): Boolean { @@ -33,6 +37,18 @@ class MergeIfsIntention : SelfTargetingIntention(KtIfExpression: val factory = KtPsiFactory(element) + val comments = element.allChildren.filter { it is PsiComment }.toList() + + (element.then as? KtBlockExpression)?.allChildren?.filter { it is PsiComment }?.toList().orEmpty() + if (comments.isNotEmpty()) { + val parent = element.parent + comments.forEach { comment -> + parent.addBefore(comment, element) + parent.addBefore(factory.createNewLine(), element) + comment.delete() + } + element.findExistingEditor()?.caretModel?.moveToOffset(element.startOffset) + } + condition.replace(factory.createExpressionByPattern("$0 && $1", condition, secondCondition)) val newBody = element.then!!.replace(nestedBody) diff --git a/idea/testData/intentions/mergeIfs/comments.kt.after b/idea/testData/intentions/mergeIfs/comments.kt.after index ad30a82ba14..04a2b6484da 100644 --- a/idea/testData/intentions/mergeIfs/comments.kt.after +++ b/idea/testData/intentions/mergeIfs/comments.kt.after @@ -1,6 +1,8 @@ fun foo() { // comment 1 - if (/* comment 2 */ true && false /* comment 3 */) { + /* comment 2 */ + /* comment 3 */ + if (true && false) { // comment 4 foo() } diff --git a/idea/testData/intentions/mergeIfs/comments2.kt b/idea/testData/intentions/mergeIfs/comments2.kt new file mode 100644 index 00000000000..43e75d61aeb --- /dev/null +++ b/idea/testData/intentions/mergeIfs/comments2.kt @@ -0,0 +1,11 @@ +fun foo() { + // comment1 + if (true) /* comment2 */ /* comment3 */ { + // comment4 + // comment5 + if (false) { + } + // comment6 + // comment7 + } +} \ No newline at end of file diff --git a/idea/testData/intentions/mergeIfs/comments2.kt.after b/idea/testData/intentions/mergeIfs/comments2.kt.after new file mode 100644 index 00000000000..4728cf348a3 --- /dev/null +++ b/idea/testData/intentions/mergeIfs/comments2.kt.after @@ -0,0 +1,11 @@ +fun foo() { + // comment1 + /* comment2 */ + /* comment3 */ + // comment4 + // comment5 + // comment6 + // comment7 + if (true && false) { + } +} \ No newline at end of file diff --git a/idea/testData/intentions/mergeIfs/comments3.kt b/idea/testData/intentions/mergeIfs/comments3.kt new file mode 100644 index 00000000000..9b637525e98 --- /dev/null +++ b/idea/testData/intentions/mergeIfs/comments3.kt @@ -0,0 +1,8 @@ +fun foo() { + // comment1 + if (true) + // comment2 + // comment3 + if (false) { + } +} \ No newline at end of file diff --git a/idea/testData/intentions/mergeIfs/comments3.kt.after b/idea/testData/intentions/mergeIfs/comments3.kt.after new file mode 100644 index 00000000000..af2ff82231a --- /dev/null +++ b/idea/testData/intentions/mergeIfs/comments3.kt.after @@ -0,0 +1,7 @@ +fun foo() { + // comment1 + // comment2 + // comment3 + if (true && false) { + } +} \ 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 01f736f99a9..4f8fb14ada1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -12225,6 +12225,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/mergeIfs/comments.kt"); } + @TestMetadata("comments2.kt") + public void testComments2() throws Exception { + runTest("idea/testData/intentions/mergeIfs/comments2.kt"); + } + + @TestMetadata("comments3.kt") + public void testComments3() throws Exception { + runTest("idea/testData/intentions/mergeIfs/comments3.kt"); + } + @TestMetadata("else1.kt") public void testElse1() throws Exception { runTest("idea/testData/intentions/mergeIfs/else1.kt");