From d9d04fc55626d8380a1176115754cd2f42008b50 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 5 Sep 2019 11:58:18 +0900 Subject: [PATCH] "Create enum constant" quick fix: do not add redundant empty line #KT-32981 Fixed --- .../callableBuilder/CallableBuilder.kt | 22 ++++++++++++++----- .../enumEntryAddComma.kt.after | 1 - .../enumEntryHasComma.kt.after | 1 - .../enumEntryHasNoLineBreak.kt | 8 +++++++ .../enumEntryHasNoLineBreak.kt.after | 8 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 5 +++++ 6 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt create mode 100644 idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt index 8744b1c2284..d941bdcfd80 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/createFromUsage/callableBuilder/CallableBuilder.kt @@ -79,6 +79,7 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker import org.jetbrains.kotlin.types.typeUtil.isAnyOrNullableAny import org.jetbrains.kotlin.types.typeUtil.isUnit import org.jetbrains.kotlin.types.typeUtil.makeNullable +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import java.util.* import kotlin.math.max @@ -1145,13 +1146,22 @@ internal fun placeDeclarationInContainer( else -> throw AssertionError("Invalid containing element: ${container.text}") } - if (declaration !is KtPrimaryConstructor) { - val parent = declarationInPlace.parent - calcNecessaryEmptyLines(declarationInPlace, false).let { - if (it > 0) parent.addBefore(psiFactory.createNewLine(it), declarationInPlace) + when (declaration) { + is KtEnumEntry -> { + val prevEnumEntry = declarationInPlace.siblings(forward = false, withItself = false).firstIsInstanceOrNull() + if ((prevEnumEntry?.prevSibling as? PsiWhiteSpace)?.text?.contains('\n') == true) { + val parent = declarationInPlace.parent + parent.addBefore(psiFactory.createNewLine(), declarationInPlace) + } } - calcNecessaryEmptyLines(declarationInPlace, true).let { - if (it > 0) parent.addAfter(psiFactory.createNewLine(it), declarationInPlace) + !is KtPrimaryConstructor -> { + val parent = declarationInPlace.parent + calcNecessaryEmptyLines(declarationInPlace, false).let { + if (it > 0) parent.addBefore(psiFactory.createNewLine(it), declarationInPlace) + } + calcNecessaryEmptyLines(declarationInPlace, true).let { + if (it > 0) parent.addAfter(psiFactory.createNewLine(it), declarationInPlace) + } } } return declarationInPlace diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryAddComma.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryAddComma.kt.after index 91f656b9fbe..fb71f516cfa 100644 --- a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryAddComma.kt.after +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryAddComma.kt.after @@ -1,7 +1,6 @@ // "Create enum constant 'PUBLIC'" "true" enum class TopicState { PRIVATE, - PUBLIC } diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after index 91f656b9fbe..fb71f516cfa 100644 --- a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after @@ -1,7 +1,6 @@ // "Create enum constant 'PUBLIC'" "true" enum class TopicState { PRIVATE, - PUBLIC } diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt new file mode 100644 index 00000000000..6ee530c93ac --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt @@ -0,0 +1,8 @@ +// "Create enum constant 'C'" "true" +enum class E { + A, B +} + +fun foo() { + E.C +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt.after new file mode 100644 index 00000000000..5a21beeab7a --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt.after @@ -0,0 +1,8 @@ +// "Create enum constant 'C'" "true" +enum class E { + A, B, C +} + +fun foo() { + E.C +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index c7f6183c844..4f16e98803a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3290,6 +3290,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt"); } + @TestMetadata("enumEntryHasNoLineBreak.kt") + public void testEnumEntryHasNoLineBreak() throws Exception { + runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt"); + } + @TestMetadata("enumEntryNoReceiver.kt") public void testEnumEntryNoReceiver() throws Exception { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryNoReceiver.kt");