diff --git a/core/src/main/java/com/facebook/ktfmt/format/TrailingCommas.kt b/core/src/main/java/com/facebook/ktfmt/format/TrailingCommas.kt index 4f9abbec..d4255856 100644 --- a/core/src/main/java/com/facebook/ktfmt/format/TrailingCommas.kt +++ b/core/src/main/java/com/facebook/ktfmt/format/TrailingCommas.kt @@ -3,8 +3,10 @@ package com.facebook.ktfmt.format import org.jetbrains.kotlin.com.intellij.psi.PsiComment import org.jetbrains.kotlin.com.intellij.psi.PsiElement import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace +import org.jetbrains.kotlin.psi.KtClassBody import org.jetbrains.kotlin.psi.KtCollectionLiteralExpression import org.jetbrains.kotlin.psi.KtElement +import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtFunctionLiteral import org.jetbrains.kotlin.psi.KtLambdaExpression import org.jetbrains.kotlin.psi.KtParameterList @@ -70,6 +72,13 @@ object TrailingCommas { return // Never add trailing commas to lambda param lists } } + is KtClassBody -> { + EnumEntryList.extractChildList(element)?.also { + if (it.terminatingSemicolon != null) { + return // Never add a trailing comma after there is already a terminating semicolon + } + } + } } val list = extractManagedList(element) ?: return @@ -96,6 +105,16 @@ object TrailingCommas { ManagedList(element.getInnerExpressions(), element.trailingComma) } is KtWhenEntry -> ManagedList(element.conditions.toList(), element.trailingComma) + is KtEnumEntry -> { + EnumEntryList.extractParentList(element).let { + ManagedList(it.enumEntries, it.trailingComma) + } + } + is KtClassBody -> { + EnumEntryList.extractChildList(element)?.let { + ManagedList(it.enumEntries, it.trailingComma) + } + } else -> null } } diff --git a/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt b/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt index 7b6c6321..cdb087b3 100644 --- a/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/format/GoogleStyleFormatterKtTest.kt @@ -1694,6 +1694,105 @@ class GoogleStyleFormatterKtTest { formattingOptions = Formatter.GOOGLE_FORMAT, deduceMaxWidth = true) + @Test + fun `trailing commas in enums`() { + val code = + """ + |enum class A {} + | + |enum class B { + | Z // Comment + |} + | + |enum class C { + | Z, // Comment + |} + | + |enum class D { + | Z, + | Y // Comment + |} + | + |enum class E { + | Z, + | Y, // Comment + |} + | + |enum class F { + | Z, + | Y; // Comment + | + | val x = 0 + |} + | + |enum class G { + | Z, + | Y,; // Comment + | + | val x = 0 + |} + | + |enum class H { + | Z, + | Y() {} // Comment + |} + | + |enum class I { + | Z, + | Y() {}, // Comment + |} + |""" + .trimMargin() + val expected = + """ + |enum class A {} + | + |enum class B { + | Z // Comment + |} + | + |enum class C { + | Z // Comment + |} + | + |enum class D { + | Z, + | Y, // Comment + |} + | + |enum class E { + | Z, + | Y, // Comment + |} + | + |enum class F { + | Z, + | Y; // Comment + | + | val x = 0 + |} + | + |enum class G { + | Z, + | Y; // Comment + | + | val x = 0 + |} + | + |enum class H { + | Z, + | Y() {}, // Comment + |} + | + |enum class I { + | Z, + | Y() {}, // Comment + |} + |""" + .trimMargin() + assertThatFormatting(code).withOptions(Formatter.GOOGLE_FORMAT).isEqualTo(expected) + } + companion object { /** Triple quotes, useful to use within triple-quoted strings. */ private const val TQ = "\"\"\""