From e62ef21dbdcab3e99a2cdd1d88f568b5404bd695 Mon Sep 17 00:00:00 2001 From: Beth Cutler Date: Sun, 6 Jun 2021 00:08:03 -0700 Subject: [PATCH] Fix explicit ctor formatting; and KDoc's ``` followed by more text (#238) Summary: Fix for https://github.com/facebookincubator/ktfmt/issues/235 and https://github.com/facebookincubator/ktfmt/issues/221 Pull Request resolved: https://github.com/facebookincubator/ktfmt/pull/238 Test Plan: ktfmt-diff: D28778163 Differential Revision: D28778136 Pulled By: cgrushko fbshipit-source-id: 67ab94fd876a0030cff8f9969c819882da590bf2 --- .../ktfmt/KotlinInputAstVisitorBase.kt | 3 +- .../com/facebook/ktfmt/kdoc/KDocFormatter.kt | 2 +- .../com/facebook/ktfmt/FormatterKtTest.kt | 31 ++++++++++++++++++- .../ktfmt/GoogleStyleFormatterKtTest.kt | 16 ++++++++++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitorBase.kt b/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitorBase.kt index 8ae03ea6..733c23da 100644 --- a/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitorBase.kt +++ b/core/src/main/java/com/facebook/ktfmt/KotlinInputAstVisitorBase.kt @@ -330,10 +330,11 @@ open class KotlinInputAstVisitorBase( builder.token(":") if (parameterList?.parameters.isNullOrEmpty()) { builder.breakOp(Doc.FillMode.INDEPENDENT, " ", expressionBreakIndent) + builder.block(expressionBreakIndent) { typeOrDelegationCall.accept(this) } } else { builder.space() + builder.block(expressionBreakNegativeIndent) { typeOrDelegationCall.accept(this) } } - builder.block(expressionBreakNegativeIndent) { typeOrDelegationCall.accept(this) } } } } diff --git a/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt b/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt index 323a70ec..b27c4ab2 100644 --- a/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt +++ b/core/src/main/java/com/facebook/ktfmt/kdoc/KDocFormatter.kt @@ -114,7 +114,7 @@ object KDocFormatter { // END_KDOC properly. We want to recover in such cases if (word == "*/") { tokens.add(Token(END_KDOC, word)) - } else if (word == "```") { + } else if (word.startsWith("```")) { tokens.add(Token(CODE_BLOCK_MARKER, word)) } else { tokens.add(Token(LITERAL, word)) diff --git a/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt b/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt index 4837ca7c..85837123 100644 --- a/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/FormatterKtTest.kt @@ -1890,6 +1890,21 @@ class FormatterKtTest { |""".trimMargin(), deduceMaxWidth = true) + @Test + fun `a secondary constructor with no arguments passed to delegate`() = + assertFormatted( + """ + |-------------------------------------------------- + |data class Foo { + | constructor() : + | this( + | Foo.createSpeciallyDesignedParameter(), + | Foo.createSpeciallyDesignedParameter(), + | ) + |} + |""".trimMargin(), + deduceMaxWidth = true) + @Test fun `secondary constructor with param list that fits in one line, with delegate`() = assertFormatted( @@ -3744,6 +3759,20 @@ class FormatterKtTest { |class MyClass {} |""".trimMargin()) + @Test + fun `handle KDoc with tagged code examples`() = + assertFormatted( + """ + |/** + | * ```kotlin + | * fun main(args: Array) { + | * println("Hello World!") + | * } + | * ``` + | */ + |class MyClass {} + |""".trimMargin()) + @Test fun `handle stray code markers in lines and produce stable output`() { val code = @@ -4346,7 +4375,7 @@ class FormatterKtTest { | | |class C {} - | + | | |class C {} | diff --git a/core/src/test/java/com/facebook/ktfmt/GoogleStyleFormatterKtTest.kt b/core/src/test/java/com/facebook/ktfmt/GoogleStyleFormatterKtTest.kt index 87bc26b0..f275a072 100644 --- a/core/src/test/java/com/facebook/ktfmt/GoogleStyleFormatterKtTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/GoogleStyleFormatterKtTest.kt @@ -603,6 +603,22 @@ class GoogleStyleFormatterKtTest { formattingOptions = GOOGLE_FORMAT, deduceMaxWidth = true) + @Test + fun `a secondary constructor with no arguments passed to delegate`() = + assertFormatted( + """ + |-------------------------------------------------- + |data class Foo { + | constructor() : + | this( + | Foo.createSpeciallyDesignedParameter(), + | Foo.createSpeciallyDesignedParameter(), + | ) + |} + |""".trimMargin(), + formattingOptions = GOOGLE_FORMAT, + deduceMaxWidth = true) + @Test fun `handle trailing commas (function calls)`() = assertFormatted(