"Create enum constant" quick fix: handle trailing comman correctly

#KT-36461 Fixed
#KT-36462 Fixed
This commit is contained in:
Toshiaki Kameyama
2020-02-27 16:31:46 +09:00
committed by Yan Zhulanow
parent 0bd2643788
commit 4973d3c359
8 changed files with 69 additions and 16 deletions
@@ -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<KtEnumEntry>()
if (lastEntry != null &&
@@ -1162,9 +1162,24 @@ internal fun <D : KtNamedDeclaration> placeDeclarationInContainer(
when (declaration) {
is KtEnumEntry -> {
val prevEnumEntry = declarationInPlace.siblings(forward = false, withItself = false).firstIsInstanceOrNull<KtEnumEntry>()
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 -> {
@@ -1,7 +1,7 @@
// "Create enum constant 'PUBLIC'" "true"
enum class TopicState {
PRIVATE,
<caret>PUBLIC
<caret>PUBLIC,
}
fun foo() {
@@ -0,0 +1,10 @@
// "Create enum constant 'C'" "true"
enum class Bar {
A,
B,
;
}
fun main() {
Bar.C<caret>
}
@@ -0,0 +1,11 @@
// "Create enum constant 'C'" "true"
enum class Bar {
A,
B,
<caret>C,
;
}
fun main() {
Bar.C
}
@@ -0,0 +1,9 @@
// "Create enum constant 'C'" "true"
enum class Baz {
A,
B, ;
}
fun main() {
Baz.C<caret>
}
@@ -0,0 +1,10 @@
// "Create enum constant 'C'" "true"
enum class Baz {
A,
B,
<caret>C, ;
}
fun main() {
Baz.C
}
@@ -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");