@@ -11,6 +11,7 @@ import replpp.scripting.CompilerError
11
11
import java .nio .file .{Files , Path }
12
12
import scala .language .unsafeNulls
13
13
import scala .util .Try
14
+ import scala .util .control .NoStackTrace
14
15
15
16
/** Compiles input files to a temporary directory
16
17
*
@@ -23,7 +24,7 @@ import scala.util.Try
23
24
* i.e. store hash of all inputs?
24
25
* that functionality must exist somewhere already, e.g. zinc incremental compiler, or even in dotty itself?
25
26
*/
26
- class SimpleDriver (lineNumberReportingAdjustment : Int = 0 ) extends Driver {
27
+ class SimpleDriver (linesBeforeRunBeforeCode : Int = 0 , linesBeforeScript : Int = 0 ) extends Driver {
27
28
28
29
def compileAndGetOutputDir [A ](compilerArgs : Array [String ], inputFiles : Seq [Path ], verbose : Boolean ): Try [Path ] =
29
30
compile(compilerArgs, inputFiles, verbose) { (ctx, outDir) => outDir }
@@ -45,7 +46,9 @@ class SimpleDriver(lineNumberReportingAdjustment: Int = 0) extends Driver {
45
46
46
47
given ctx0 : Context = {
47
48
val ctx = rootCtx.fresh.setSetting(rootCtx.settings.outputDir, new PlainDirectory (Directory (outDir)))
48
- if (lineNumberReportingAdjustment != 0 ) ctx.setReporter(createAdjustedReporter(rootCtx.reporter))
49
+ if (linesBeforeRunBeforeCode != 0 || linesBeforeScript != 0 ) {
50
+ ctx.setReporter(createReporter(linesBeforeRunBeforeCode, linesBeforeScript, rootCtx.reporter))
51
+ }
49
52
50
53
if (verbose) {
51
54
ctx.setSetting(rootCtx.settings.help, true )
@@ -58,19 +61,27 @@ class SimpleDriver(lineNumberReportingAdjustment: Int = 0) extends Driver {
58
61
59
62
if (doCompile(newCompiler, toCompile).hasErrors) {
60
63
val msgAddonMaybe = if (verbose) " " else " - try `--verbose` for more output"
61
- throw CompilerError (s " Errors encountered during compilation $msgAddonMaybe" )
64
+ throw new CompilerError (s " Errors encountered during compilation $msgAddonMaybe" ) with NoStackTrace
62
65
} else {
63
66
fun(ctx0, outDir)
64
67
}
65
68
}
66
69
}
67
70
68
- // creates a new reporter based on the original reporter that copies Diagnostic and changes line numbers
69
- private def createAdjustedReporter (originalReporter : Reporter ): Reporter = {
71
+ private def createReporter (linesBeforeRunBeforeCode : Int , linesBeforeScript : Int , originalReporter : Reporter ): Reporter = {
70
72
new Reporter {
71
73
override def doReport (dia : Diagnostic )(using Context ): Unit = {
72
74
val adjustedPos = new SourcePosition (source = dia.pos.source, span = dia.pos.span, outer = dia.pos.outer) {
73
- override def line : Int = super .line + lineNumberReportingAdjustment
75
+ override def line : Int = {
76
+ val original = super .line
77
+ val adjusted = original - linesBeforeScript
78
+ if (adjusted >= 0 ) {
79
+ adjusted
80
+ } else {
81
+ // adjusted line number is negative, i.e. the error must be in the `runBefore` code
82
+ original - linesBeforeRunBeforeCode
83
+ }
84
+ }
74
85
}
75
86
originalReporter.doReport(new Diagnostic (dia.msg, adjustedPos, dia.level))
76
87
}
0 commit comments