From 4a7e1097d977b1cf0032ce9dce4a0e8de6b21e03 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Mon, 20 Jan 2025 01:16:12 -0500 Subject: [PATCH] fix: Fix build.sbt position **Problem** Compiler warnings and errors is not correct for build.sbt. **Solution** This adds line offset to the synthetic Scala file so the original line position is displayed in the errors. --- buildfile/src/main/scala/sbt/internal/Eval.scala | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/buildfile/src/main/scala/sbt/internal/Eval.scala b/buildfile/src/main/scala/sbt/internal/Eval.scala index 226ffe54a..63bcbc0ad 100644 --- a/buildfile/src/main/scala/sbt/internal/Eval.scala +++ b/buildfile/src/main/scala/sbt/internal/Eval.scala @@ -97,8 +97,8 @@ class Eval( | } |} |""".stripMargin - val startLine = header.linesIterator.toList.size - EvalSourceFile(srcName, startLine, contents) + val headerLine = header.linesIterator.toList.size + EvalSourceFile(srcName, headerLine, line - 1, contents) override def extract(run: Run, unit: CompilationUnit)(using ctx: Context): String = atPhase(Phases.typerPhase.next) { @@ -159,8 +159,8 @@ class Eval( |${definitions.map(_._1).mkString("\n")} |} |""".stripMargin - val startLine = header.linesIterator.toList.size - EvalSourceFile(srcName, startLine, contents) + val headerLine = header.linesIterator.toList.size + EvalSourceFile(srcName, headerLine, 0, contents) override def extract(run: Run, unit: CompilationUnit)(using ctx: Context): Seq[String] = atPhase(Phases.typerPhase.next) { @@ -319,13 +319,15 @@ object Eval: private[sbt] final val WrapValName = "$sbtdef" // used to map the position offset - class EvalSourceFile(name: String, startLine: Int, contents: String) + class EvalSourceFile(name: String, headerLine: Int, extraLine: Int, contents: String) extends SourceFile( new VirtualFile(name, contents.getBytes(StandardCharsets.UTF_8)), contents.toArray ): - override def lineToOffset(line: Int): Int = super.lineToOffset((line + startLine) max 0) - override def offsetToLine(offset: Int): Int = super.offsetToLine(offset) - startLine + override def lineToOffset(line: Int): Int = + super.lineToOffset((line + headerLine - extraLine) max 0) + override def offsetToLine(offset: Int): Int = + super.offsetToLine(offset) - headerLine + extraLine end EvalSourceFile trait EvalType[A]: