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(
           """