diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt index a54cd0c08f8..d974dfc03bd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinPreFormatProcessor.kt @@ -40,8 +40,9 @@ private class Visitor(var range: TextRange) : KtTreeVisitorVoid() { var delta = 0 + val psiFactory = KtPsiFactory(klass) if (declaration is KtEnumEntry) { - val comma = KtPsiFactory(klass).createComma() + val comma = psiFactory.createComma() val nextEntry = declaration.nextSiblingOfSameType() if (nextEntry != null && !declaration.containsToken(KtTokens.COMMA)) { @@ -51,6 +52,11 @@ private class Visitor(var range: TextRange) : KtTreeVisitorVoid() { 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 } @@ -60,7 +66,7 @@ private class Visitor(var range: TextRange) : KtTreeVisitorVoid() { if (lastEntry != null && lastEntry.containsToken(KtTokens.SEMICOLON)) return if (lastEntry == null && classBody.containsToken(KtTokens.SEMICOLON)) return - val semicolon = KtPsiFactory(klass).createSemicolon() + val semicolon = psiFactory.createSemicolon() classBody.addAfter(semicolon, lastEntry) delta += semicolon.textLength } diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt new file mode 100644 index 00000000000..d0fefe086c3 --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt @@ -0,0 +1,13 @@ +// "Create enum constant 'D'" "true" +enum class Test { + A, + B, + C; + + fun test() { + } +} + +fun main() { + Test.D +} \ No newline at end of file diff --git a/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt.after b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt.after new file mode 100644 index 00000000000..0177f08a86b --- /dev/null +++ b/idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt.after @@ -0,0 +1,14 @@ +// "Create enum constant 'D'" "true" +enum class Test { + A, + B, + C, + D; + + fun test() { + } +} + +fun main() { + Test.D +} \ 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 3c82f765b27..62b7e414b5e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -3295,6 +3295,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasNoLineBreak.kt"); } + @TestMetadata("enumEntryHasSemicolon.kt") + public void testEnumEntryHasSemicolon() throws Exception { + runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryHasSemicolon.kt"); + } + @TestMetadata("enumEntryNoReceiver.kt") public void testEnumEntryNoReceiver() throws Exception { runTest("idea/testData/quickfix/createFromUsage/createClass/referenceExpression/enumEntryNoReceiver.kt");