Skip to content

Commit 2359fb2

Browse files
delegate dotty compiler info to sbt
1 parent 73192b6 commit 2359fb2

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

bridge/src/main/scala/xsbt/CompilerInterface.scala

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,17 @@ class CachedCompilerImpl(args: Array[String], output: Output, resident: Boolean)
4949
def commandArguments(sources: Array[File]): Array[String] =
5050
(outputArgs ++ args.toList ++ sources.map(_.getAbsolutePath).sortWith(_ < _)).toArray[String]
5151

52-
def run(sources: Array[File], changes: DependencyChanges, callback: AnalysisCallback, log: Logger, delegate: Reporter, progress: CompileProgress): Unit = synchronized {
53-
run(sources.toList, changes, callback, log, progress)
52+
def run(sources: Array[File], changes: DependencyChanges, callback: AnalysisCallback,
53+
log: Logger, delegate: Reporter, progress: CompileProgress): Unit = synchronized {
54+
55+
run(sources.toList, changes, callback, log, delegate, progress)
5456
}
55-
private[this] def run(sources: List[File], changes: DependencyChanges, callback: AnalysisCallback, log: Logger, compileProgress: CompileProgress): Unit = {
57+
private[this] def run(sources: List[File], changes: DependencyChanges, callback: AnalysisCallback,
58+
log: Logger, delegate: Reporter, compileProgress: CompileProgress): Unit = {
5659
debug(log, args.mkString("Calling Dotty compiler with arguments (CompilerInterface):\n\t", "\n\t", ""))
5760
val ctx = (new ContextBase).initialCtx.fresh
5861
.setSbtCallback(callback)
62+
.setReporter(DelegatingReporter(delegate))
5963
val cl = getClass.getClassLoader.asInstanceOf[URLClassLoader]
6064

6165
val reporter = DottyMain.process(commandArguments(sources.toArray), ctx)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/* sbt -- Simple Build Tool
2+
* Copyright 2008, 2009 Mark Harrah
3+
*/
4+
package xsbt
5+
6+
import dotty.tools._
7+
import dotc._
8+
import reporting._
9+
import core.Contexts._
10+
11+
import xsbti.Maybe
12+
13+
private object DelegatingReporter {
14+
def apply(delegate: xsbti.Reporter) = new DelegatingReporter(delegate)
15+
}
16+
17+
private final class DelegatingReporter(delegate: xsbti.Reporter) extends Reporter
18+
with UniqueMessagePositions
19+
with HideNonSensicalMessages {
20+
21+
def doReport(d: Diagnostic)(implicit ctx: Context): Unit = {
22+
val severity =
23+
d match {
24+
case _: Reporter.Error => xsbti.Severity.Error
25+
case _: Reporter.Warning => xsbti.Severity.Warn
26+
case _ => xsbti.Severity.Info
27+
}
28+
val pos = d.pos
29+
30+
val file =
31+
if(pos.source.file.exists) Some(pos.source.file.file)
32+
else None
33+
34+
val position = new xsbti.Position {
35+
def line: Maybe[Integer] = Maybe.just(pos.line)
36+
def lineContent(): String = pos.lineContent
37+
def offset(): xsbti.Maybe[Integer] = Maybe.just(pos.point)
38+
def pointer(): xsbti.Maybe[Integer] = offset()
39+
def pointerSpace(): xsbti.Maybe[String] = Maybe.just(" " * pos.point)
40+
def sourceFile(): xsbti.Maybe[java.io.File] = maybe(file)
41+
def sourcePath(): xsbti.Maybe[String] = maybe(file.map(_.getPath))
42+
}
43+
44+
delegate.log(position, d.message, severity)
45+
}
46+
47+
private[this] def maybe[T](opt: Option[T]): Maybe[T] = opt match {
48+
case None => Maybe.nothing[T]
49+
case Some(s) => Maybe.just[T](s)
50+
}
51+
}

0 commit comments

Comments
 (0)