From 4032d931158efc402f06f3c2268ad6f5d91f3ae1 Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Sat, 14 Sep 2024 07:57:23 -0700 Subject: [PATCH] Split: keep 2 instances of FileLine, for debugging --- .../org/scalafmt/internal/FileLineStack.scala | 34 +++++++++++++++++++ .../org/scalafmt/internal/FormatOps.scala | 4 +-- .../scala/org/scalafmt/internal/Router.scala | 4 +-- .../scala/org/scalafmt/internal/Split.scala | 21 +++++++----- .../scala/org/scalafmt/internal/State.scala | 3 +- 5 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FileLineStack.scala diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FileLineStack.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FileLineStack.scala new file mode 100644 index 0000000000..eacee1e617 --- /dev/null +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FileLineStack.scala @@ -0,0 +1,34 @@ +package org.scalafmt.internal + +import org.scalameta.FileLine + +class FileLineStack private ( + val fileLineHead: FileLine, + val fileLineLast: FileLine, +) extends Ordered[FileLineStack] { + override def toString: String = s"$fileLineHead->$fileLineLast" + + def forThisLine(implicit + file: sourcecode.File, + line: sourcecode.Line, + ): FileLineStack = new FileLineStack( + fileLineHead = fileLineHead, + fileLineLast = FileLine.generate, + ) + + override def compare(that: FileLineStack): Int = Integer + .compare(this.fileLineHead.line.value, that.fileLineHead.line.value) +} + +object FileLineStack { + implicit def generate(implicit + file: sourcecode.File, + line: sourcecode.Line, + fileLineHead: FileLine, + ): FileLineStack = new FileLineStack(fileLineHead, FileLine.generate) + + def nextLine(implicit fl: FileLine): FileLine = { + val line = fl.line + new FileLine(fl.file, line.copy(value = line.value + 1)) + } +} 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 abe156420a..d04bbee26a 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 @@ -1532,7 +1532,7 @@ class FormatOps( .forThisLine(nextLine) def getSplits(spaceSplit: Split, nlCost: Int = 1) = ( spaceSplit.withIndents(spaceIndents), - getNlSplit(1, nlCost)(nextLine(spaceSplit.fileLine)), + getNlSplit(1, nlCost)(spaceSplit.fileLine), ) def getSlb(end: T, excl: TokenRanges)(implicit fileLine: FileLine) = SingleLineBlock(end, exclude = excl, noSyntaxNL = true) @@ -1938,7 +1938,7 @@ class FormatOps( Seq(Split(Newline, 0).withIndent(indent).withPolicy(nlPolicy)) else Seq( Split(Space, 0).withSingleLine(slbExpire.left).withIndent(indent), - Split(Newline, 1)(nextLine).withIndent(indent).withPolicy(nlPolicy), + Split(Newline, 1).withIndent(indent).withPolicy(nlPolicy), ) } 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 04a73210d1..72dc0e7297 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 @@ -533,13 +533,13 @@ class Router(formatOps: FormatOps) { case _ => false } val bodyIsEmpty = isEmptyTree(body) - def baseSplit = Split(Space, 0) + def baseSplit(implicit l: FileLine) = Split(Space, 0) def nlSplit(ft: FormatToken)(cost: Int)(implicit l: FileLine) = Split(Newline2x(ft), cost) CtrlBodySplits.checkComment(nlSplit(ft)) { nft => def withSlbSplit(implicit l: FileLine) = Seq( baseSplit.withSingleLine(getLastNonTrivialToken(body)), - nlSplit(nft)(1)(nextLine), + nlSplit(nft)(1), ) implicit val beforeMultiline = style.newlines.getBeforeMultiline if ( diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala index 469b36e3c1..6504e466eb 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Split.scala @@ -54,7 +54,7 @@ case class Split( activeTags: Set[SplitTag] = Set.empty, policy: Policy = NoPolicy, optimalAt: Option[OptimalToken] = None, -)(implicit val fileLine: FileLine) { +)(implicit val fileLineStack: FileLineStack) { import PolicyOps._ def withNoIndent: Split = mod match { @@ -63,6 +63,9 @@ case class Split( case _ => this } + @inline + def fileLine: FileLine = fileLineStack.fileLineLast + @inline def indentation: String = modExt.indentation @@ -133,7 +136,8 @@ case class Split( if (isIgnored) this else splitTag.fold(this)(preActivateFor) def forThisLine(implicit fileLine: FileLine): Split = - if (isIgnored) this else copy()(fileLine = fileLine) + if (isIgnored) this + else copy()(fileLineStack.forThisLine(fileLine.file, fileLine.line)) def getCost(ifActive: Int => Int, ifIgnored: => Int): Int = if (isIgnored) ifIgnored else ifActive(cost) @@ -319,8 +323,7 @@ case class Split( else "" } val opt = optimalAt.fold("")(", opt=" + _) - s"""$prefix${modExt - .mod}:[$fileLine](cost=$cost, indents=$indentation, $policy$opt)""" + s"""$prefix$mod:[$fileLineStack](cost=$cost, indents=$indentation, $policy$opt)""" } } @@ -328,13 +331,15 @@ object Split { private val ignoredTags = Set[SplitTag](null) - def ignored(implicit fileLine: FileLine) = Split(ModExt(NoSplit), 0).ignored + def ignored(implicit fileLineStack: FileLineStack) = Split(ModExt(NoSplit), 0) + .ignored def apply(ignore: Boolean, cost: Int)(modExt: => ModExt)(implicit - fileLine: FileLine, + fileLineStack: FileLineStack, ): Split = if (ignore) ignored else Split(modExt, cost) - def opt(mod: Modification, cost: Int)(implicit fileLine: FileLine): Split = - if (mod eq null) ignored else Split(mod, cost) + def opt(mod: Modification, cost: Int)(implicit + fileLineStack: FileLineStack, + ): Split = if (mod eq null) ignored else Split(mod, cost) } diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala index bb28cfd36f..673db99e73 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/State.scala @@ -364,8 +364,7 @@ object State { private def compareSplitOrigin(s1: State, s2: State): Int = { // We assume the same number of splits, see compareSplitsLength // Break ties by the last split's line origin. - val r = Integer - .compare(s1.split.fileLine.line.value, s2.split.fileLine.line.value) + val r = s1.split.fileLineStack.compare(s2.split.fileLineStack) if (r != 0 || s1.prev.depth == 0) r else compareSplitOrigin(s1.prev, s2.prev) }