From 4bed184d134af523bcee05cf80e046d06b92e74a Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:17:44 -0800 Subject: [PATCH] State: exclude trailing space/CR from column width --- .../main/scala/org/scalafmt/internal/FormatWriter.scala | 1 + .../src/main/scala/org/scalafmt/internal/State.scala | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala index 6e4d8789eb..dff052e2ac 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatWriter.scala @@ -1020,6 +1020,7 @@ class FormatWriter(formatOps: FormatOps) { ): Boolean = { val codeStyle = style.copy( runner = style.runner.forCodeBlock, + lineEndings = Some(LineEndings.unix), // let's not wrap docstrings, to avoid recursion docstrings = style.docstrings.withoutRewrites, maxColumn = style.maxColumn - spaces.length - termIndent.length - 1, 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 b2d96cdab3..952aa20c96 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 @@ -422,7 +422,7 @@ object State { val firstLineLength = column + syntaxLen (firstLineLength, firstLineLength) } else { - val firstLength = column + firstNL + val firstLength = column + getLineLength(syntax, 0, firstNL) tok match { case _: T.Constant.String => val margin: Int => Int = stringMargin @@ -453,6 +453,9 @@ object State { _ => adjusted } else identity) + def getLineLength(syntax: String, lineBeg: Int, lineEnd: Int): Int = + (syntax.lastIndexWhere(!_.isWhitespace, lineEnd - 1) + 1 - lineBeg).max(0) + private def getColumnsFromMultiline( syntax: String, firstNL: Int, @@ -461,7 +464,9 @@ object State { @tailrec def iter(prevMaxLength: Int, lineBeg: Int): (Int, Int) = { val nextNL = syntax.indexOf('\n', lineBeg) - val length = (if (nextNL < 0) syntax.length else nextNL) - lineBeg + val length = + if (nextNL < 0) syntax.length - lineBeg + else getLineLength(syntax, lineBeg, nextNL) val maxLength = math.max(prevMaxLength, length) if (nextNL < 0) (maxLength, length) else iter(maxLength, nextNL + 1) }