From 5572683b58a89f4405a6494b2de73e3df5eb50a7 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:36:27 +0100 Subject: [PATCH 1/3] Add test with missing space after extension --- .../src/test/resources/scala3/Extension.stat | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/scalafmt-tests/src/test/resources/scala3/Extension.stat b/scalafmt-tests/src/test/resources/scala3/Extension.stat index f8bb84f868..cd6e8d9d90 100644 --- a/scalafmt-tests/src/test/resources/scala3/Extension.stat +++ b/scalafmt-tests/src/test/resources/scala3/Extension.stat @@ -279,3 +279,33 @@ object Dictionary: dict.selectDynamic(key).asInstanceOf[A] def update(key: String, value: A): Unit = dict.updateDynamic(key)(value.asInstanceOf[js.Any]) +<<< #3499 1 +spaces.afterKeywordBeforeParen = true +=== +extension (s: String) + def foo(): Unit = ??? +>>> +extension (s: String) def foo(): Unit = ??? +<<< #3499 2 +spaces.afterKeywordBeforeParen = true +newlines.beforeOpenParenDefnSite = unfold +=== +extension (s: String) + def foo(): Unit = ??? +>>> +extension(s: String) def foo(): Unit = ??? +<<< #3499 3 +spaces.afterKeywordBeforeParen = false +=== +extension (s: String) + def foo(): Unit = ??? +>>> +extension (s: String) def foo(): Unit = ??? +<<< #3499 4 +spaces.afterKeywordBeforeParen = false +newlines.beforeOpenParenDefnSite = unfold +=== +extension (s: String) + def foo(): Unit = ??? +>>> +extension(s: String) def foo(): Unit = ??? From 3c55f3b1ce381d5f29b5c271294087a1bbe9d088 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:50:05 +0100 Subject: [PATCH 2/3] Router: apply split before open delim consistently --- .../src/main/scala/org/scalafmt/internal/Router.scala | 9 +++++---- scalafmt-tests/src/test/resources/scala3/Extension.stat | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala index d11e17e2c9..057b5b4047 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala @@ -683,6 +683,7 @@ class Router(formatOps: FormatOps) { Space case _ => Space(left.is[T.Comment]) } + def baseNoSplit(implicit fileLine: FileLine) = Split(modification, 0) val defn = isParamClauseSite(rightOwner) val defRhs = if (defn) defDefBodyParent(rightOwner) else None val beforeDefRhs = defRhs.flatMap(tokens.tokenJustBeforeOpt) @@ -696,8 +697,8 @@ class Router(formatOps: FormatOps) { val isAlignFirstParen = shouldAlignBefore(style.align) && !prevNonComment(ft).left.is[T.RightParen] def noSplitSplit(implicit fileLine: FileLine) = - if (isAlignFirstParen) Split(NoSplit, 0) - else Split(NoSplit, 0).withSingleLine(close) + if (isAlignFirstParen) baseNoSplit + else baseNoSplit.withSingleLine(close) val splits = src match { case Newlines.unfold => val rightParent = rightOwner.parent.get @@ -716,7 +717,7 @@ class Router(formatOps: FormatOps) { case _ => NoPolicy } Seq( - Split(NoSplit, 0).withSingleLine(slbEnd), + baseNoSplit.withSingleLine(slbEnd), Split(Newline, 1) .withIndent(indent) .withPolicy( @@ -804,7 +805,7 @@ class Router(formatOps: FormatOps) { } } else None - beforeOpenParenSplits.getOrElse(Seq(Split(modification, 0))) + beforeOpenParenSplits.getOrElse(Seq(baseNoSplit)) // Defn.{Object, Class, Trait, Enum} case FormatToken( diff --git a/scalafmt-tests/src/test/resources/scala3/Extension.stat b/scalafmt-tests/src/test/resources/scala3/Extension.stat index cd6e8d9d90..39c1578d14 100644 --- a/scalafmt-tests/src/test/resources/scala3/Extension.stat +++ b/scalafmt-tests/src/test/resources/scala3/Extension.stat @@ -293,7 +293,7 @@ newlines.beforeOpenParenDefnSite = unfold extension (s: String) def foo(): Unit = ??? >>> -extension(s: String) def foo(): Unit = ??? +extension (s: String) def foo(): Unit = ??? <<< #3499 3 spaces.afterKeywordBeforeParen = false === @@ -308,4 +308,4 @@ newlines.beforeOpenParenDefnSite = unfold extension (s: String) def foo(): Unit = ??? >>> -extension(s: String) def foo(): Unit = ??? +extension (s: String) def foo(): Unit = ??? From 8326eadce4fd9e61deea73b092348eb27bffc1a1 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:50:20 +0100 Subject: [PATCH 3/3] Router: `extension` is probably also a keyword --- .../shared/src/main/scala/org/scalafmt/internal/Router.scala | 2 +- scalafmt-tests/src/test/resources/scala3/Extension.stat | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala index 057b5b4047..78e4503e85 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala @@ -680,7 +680,7 @@ class Router(formatOps: FormatOps) { isSymbolicName(name.value) && name.parent.exists(isDefDef) => Space case _: Defn.ExtensionGroup if left.is[soft.KwExtension] => - Space + Space(style.spaces.afterKeywordBeforeParen) case _ => Space(left.is[T.Comment]) } def baseNoSplit(implicit fileLine: FileLine) = Split(modification, 0) diff --git a/scalafmt-tests/src/test/resources/scala3/Extension.stat b/scalafmt-tests/src/test/resources/scala3/Extension.stat index 39c1578d14..33718ef79c 100644 --- a/scalafmt-tests/src/test/resources/scala3/Extension.stat +++ b/scalafmt-tests/src/test/resources/scala3/Extension.stat @@ -300,7 +300,7 @@ spaces.afterKeywordBeforeParen = false extension (s: String) def foo(): Unit = ??? >>> -extension (s: String) def foo(): Unit = ??? +extension(s: String) def foo(): Unit = ??? <<< #3499 4 spaces.afterKeywordBeforeParen = false newlines.beforeOpenParenDefnSite = unfold @@ -308,4 +308,4 @@ newlines.beforeOpenParenDefnSite = unfold extension (s: String) def foo(): Unit = ??? >>> -extension (s: String) def foo(): Unit = ??? +extension(s: String) def foo(): Unit = ???