Allow breaking before `.` in a reciever function declaration to avoid long lines Summary: This fixes: https://github.com/facebookincubator/ktfmt/issues/268 It fixes it for function only, but I can try to extend into the declareOne method later (it's just more complicated for that) Reviewed By: cgrushko Differential Revision: D35047687 fbshipit-source-id: afe6411110becdfa49d14e57cfdfbe19f4d9de87
diff --git a/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt b/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt index 556a17c..217c82e 100644 --- a/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt +++ b/core/src/main/java/com/facebook/ktfmt/format/KotlinInputAstVisitor.kt
@@ -315,12 +315,15 @@ if (name != null || receiverTypeReference != null) { builder.space() } - if (receiverTypeReference != null) { - visit(receiverTypeReference) - builder.token(".") - } - if (name != null) { - builder.token(name) + builder.block(ZERO) { + if (receiverTypeReference != null) { + visit(receiverTypeReference) + builder.breakOp(Doc.FillMode.INDEPENDENT, "", expressionBreakIndent) + builder.token(".") + } + if (name != null) { + builder.token(name) + } } if (emitParenthesis) { builder.token("(")
diff --git a/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt b/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt index 59213e4..60bad09 100644 --- a/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/format/FormatterTest.kt
@@ -2791,6 +2791,21 @@ |""".trimMargin()) @Test + fun `handle extension methods with very long names`() = + assertFormatted( + """ + |------------------------------------------ + |fun LongReceiverNameThatRequiresBreaking + | .doIt() {} + | + |fun LongButNotTooLong.doIt( + | n: Int, + | f: Float + |) {} + |""".trimMargin(), + deduceMaxWidth = true) + + @Test fun `handle extension properties`() = assertFormatted( """