diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt index bbf47c392ca..6eca8f23bb4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt @@ -25,7 +25,6 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.nextSiblingOfSameType -import org.jetbrains.kotlin.psi.psiUtil.prevSiblingOfSameType import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull private class Visitor(var range: TextRange) : KtTreeVisitorVoid() { @@ -49,17 +48,6 @@ private class Visitor(var range: TextRange) : KtTreeVisitorVoid() { declaration.add(comma) delta += comma.textLength } - - val prevEntry = declaration.prevSiblingOfSameType() - if (prevEntry != null && !prevEntry.containsToken(KtTokens.COMMA)) { - val semicolon = prevEntry.allChildren.firstOrNull { it.node?.elementType == KtTokens.SEMICOLON } - if (semicolon != null) { - semicolon.delete() - declaration.add(psiFactory.createSemicolon()) - } - prevEntry.add(comma) - delta += comma.textLength - } } else { val lastEntry = klass.declarations.lastIsInstanceOrNull() if (lastEntry != null && 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 f9108b83a57..66c2a65fabe 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 @@ -1162,9 +1162,24 @@ internal fun placeDeclarationInContainer( 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) + if (prevEnumEntry != null) { + if ((prevEnumEntry.prevSibling as? PsiWhiteSpace)?.text?.contains('\n') == true) { + declarationInPlace.parent.addBefore(psiFactory.createNewLine(), declarationInPlace) + } + val comma = psiFactory.createComma() + if (prevEnumEntry.allChildren.any { it.node.elementType == KtTokens.COMMA }) { + declarationInPlace.add(comma) + } else { + prevEnumEntry.add(comma) + } + val semicolon = prevEnumEntry.allChildren.firstOrNull { it.node?.elementType == KtTokens.SEMICOLON } + if (semicolon != null) { + (semicolon.prevSibling as? PsiWhiteSpace)?.text?.let { + declarationInPlace.add(psiFactory.createWhiteSpace(it)) + } + declarationInPlace.add(psiFactory.createSemicolon()) + semicolon.delete() + } } } !is KtPrimaryConstructor -> { diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after index fb71f516cfa..571f7013a0d 100644 --- a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt.after @@ -1,7 +1,7 @@ // "Create enum constant 'PUBLIC'" "true" enum class TopicState { PRIVATE, - PUBLIC + PUBLIC, } fun foo() { diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt new file mode 100644 index 00000000000..e4689b1d7e7 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt @@ -0,0 +1,10 @@ +// "Create enum constant 'C'" "true" +enum class Bar { + A, + B, + ; +} + +fun main() { + Bar.C +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt.after new file mode 100644 index 00000000000..a6d8e409e63 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt.after @@ -0,0 +1,11 @@ +// "Create enum constant 'C'" "true" +enum class Bar { + A, + B, + C, + ; +} + +fun main() { + Bar.C +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt new file mode 100644 index 00000000000..0829e2f75d0 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt @@ -0,0 +1,9 @@ +// "Create enum constant 'C'" "true" +enum class Baz { + A, + B, ; +} + +fun main() { + Baz.C +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt.after new file mode 100644 index 00000000000..2f02183737c --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt.after @@ -0,0 +1,10 @@ +// "Create enum constant 'C'" "true" +enum class Baz { + A, + B, + C, ; +} + +fun main() { + Baz.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 51195cfbc07..5be93f1062f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3531,6 +3531,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasComma.kt"); } + @TestMetadata("enumEntryHasCommaAndSemicolon.kt") + public void testEnumEntryHasCommaAndSemicolon() throws Exception { + runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon.kt"); + } + + @TestMetadata("enumEntryHasCommaAndSemicolon2.kt") + public void testEnumEntryHasCommaAndSemicolon2() throws Exception { + runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasCommaAndSemicolon2.kt"); + } + @TestMetadata("enumEntryHasNoLineBreak.kt") public void testEnumEntryHasNoLineBreak() throws Exception { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt");