From d9b7ef57ec1f5695928375ad9a441a6407008249 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Mon, 30 Sep 2024 07:13:36 -0700 Subject: [PATCH] FormatOps: no blank within infix if not enclosed --- .../org/scalafmt/internal/FormatOps.scala | 6 ++- .../resources/newlines/source_classic.stat | 44 +++++++++++-------- .../test/resources/newlines/source_keep.stat | 34 ++++++++++---- 3 files changed, 55 insertions(+), 29 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala index cb21419954..3a0c2b4a34 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala @@ -484,8 +484,10 @@ class FormatOps( rtidx >= 0 && (atokens(rtidx) eq ft.right) // no rewritten tokens } } - val useSpace = ft.noBreak || !okToBreak - val split = Split(if (useSpace) spaceMod else Newline2x(ft), 0) + val mod = + if (ft.noBreak || !okToBreak) spaceMod + else Newline2x(isFullInfixEnclosed && ft.hasBlankLine) + val split = Split(mod, 0) if (isBeforeOp && isFewerBracesRhs(app.arg)) Seq(split) else Seq(InfixSplits.withNLIndent(split, app, fullInfix)) } diff --git a/scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat index c7c05762ed..2c4c4f9fab 100644 --- a/scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat +++ b/scalafmt-tests/shared/src/test/resources/newlines/source_classic.stat @@ -9710,22 +9710,28 @@ class ClassEmitter { } >>> -Idempotency violated -=> Diff (- obtained, + expected) - chainProto ::: -- ( -- genIdentBracketSelect( -- prototypeFor(ctorVar), -- "constructor" -- ) := ctorVar -- ) :: -+ (genIdentBracketSelect( -+ prototypeFor(ctorVar), -+ "constructor" -+ ) := ctorVar) :: - ∙ -- // Inheritable constructor -- js.JSDocConstructor(inheritableCtorDef.head) :: -+ // Inheritable constructor -+ js.JSDocConstructor(inheritableCtorDef.head) :: - inheritableCtorDef.tail ::: +class ClassEmitter { + + def genScalaClassConstructor = + + if (useESClass) { + for { + chainProto <- chainProtoWithGlobals + } yield + // Real constructor + js.JSDocConstructor(realCtorDef.head) :: + realCtorDef.tail ::: + chainProto ::: + (genIdentBracketSelect( + prototypeFor(ctorVar), + "constructor" + ) := ctorVar) :: + // Inheritable constructor + js.JSDocConstructor(inheritableCtorDef.head) :: + inheritableCtorDef.tail ::: + (globalVar(VarField.h, className).prototype := prototypeFor( + ctorVar + )) :: Nil + } + +} diff --git a/scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat b/scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat index 445ff2a843..65b9d91b5a 100644 --- a/scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat +++ b/scalafmt-tests/shared/src/test/resources/newlines/source_keep.stat @@ -9507,11 +9507,29 @@ class ClassEmitter { } >>> -Idempotency violated -=> Diff (- obtained, + expected) - ∙ -- // Inheritable constructor -- js.JSDocConstructor(inheritableCtorDef.head) :: -+ // Inheritable constructor -+ js.JSDocConstructor(inheritableCtorDef.head) :: - inheritableCtorDef.tail ::: +class ClassEmitter { + + def genScalaClassConstructor = + + if (useESClass) { + for { + chainProto <- chainProtoWithGlobals + } yield + // Real constructor + js.JSDocConstructor(realCtorDef.head) :: + realCtorDef.tail ::: + chainProto ::: + (genIdentBracketSelect( + prototypeFor(ctorVar), + "constructor" + ) := ctorVar) :: + // Inheritable constructor + js.JSDocConstructor(inheritableCtorDef.head) :: + inheritableCtorDef.tail ::: + (globalVar( + VarField.h, + className + ).prototype := prototypeFor(ctorVar)) :: Nil + } + +}