summaryrefslogtreecommitdiff
path: root/scalalib/worker/src/ZincWorkerImpl.scala
diff options
context:
space:
mode:
Diffstat (limited to 'scalalib/worker/src/ZincWorkerImpl.scala')
-rw-r--r--scalalib/worker/src/ZincWorkerImpl.scala77
1 files changed, 66 insertions, 11 deletions
diff --git a/scalalib/worker/src/ZincWorkerImpl.scala b/scalalib/worker/src/ZincWorkerImpl.scala
index a1d632df..0f2cbf10 100644
--- a/scalalib/worker/src/ZincWorkerImpl.scala
+++ b/scalalib/worker/src/ZincWorkerImpl.scala
@@ -3,16 +3,17 @@ package mill.scalalib.worker
import java.io.File
import java.util.Optional
-import scala.ref.WeakReference
import mill.api.Loose.Agg
-import mill.api.{KeyedLockedCache, PathRef}
-import xsbti.compile.{CompilerCache => _, FileAnalysisStore => _, ScalaInstance => _, _}
+import mill.api.{Info, KeyedLockedCache, PathRef, Problem, ProblemPosition, Severity, Warn, BuildProblemReporter}
import mill.scalalib.api.Util.{grepJar, isDotty, scalaBinaryVersion}
+import mill.scalalib.api.{CompilationResult, ZincWorkerApi}
import sbt.internal.inc._
import sbt.internal.util.{ConsoleOut, MainAppender}
import sbt.util.LogExchange
-import mill.scalalib.api.{CompilationResult, ZincWorkerApi}
-import upickle.core.Visitor
+import xsbti.compile.{CompilerCache => _, FileAnalysisStore => _, ScalaInstance => _, _}
+
+import scala.ref.WeakReference
+
case class MockedLookup(am: File => Optional[CompileAnalysis]) extends PerClasspathEntryLookup {
override def analysis(classpathEntry: File): Optional[CompileAnalysis] =
am(classpathEntry)
@@ -21,6 +22,45 @@ case class MockedLookup(am: File => Optional[CompileAnalysis]) extends PerClassp
Locate.definesClass(classpathEntry)
}
+class ZincProblem(base: xsbti.Problem) extends Problem {
+ override def category: String = base.category()
+
+ override def severity: Severity = base.severity() match {
+ case xsbti.Severity.Info => mill.api.Info
+ case xsbti.Severity.Warn => mill.api.Warn
+ case xsbti.Severity.Error => mill.api.Error
+ }
+
+ override def message: String = base.message()
+
+ override def position: ProblemPosition = new ZincProblemPosition(base.position())
+}
+
+class ZincProblemPosition(base: xsbti.Position) extends ProblemPosition {
+
+ object JavaOptionConverter {
+ implicit def convertInt(x: Optional[Integer]): Option[Int] = if (x.isEmpty) None else Some(x.get().intValue())
+ implicit def convert[T](x: Optional[T]): Option[T] = if (x.isEmpty) None else Some(x.get())
+ }
+
+ import JavaOptionConverter._
+
+ override def line: Option[Int] = base.line()
+
+ override def lineContent: String = base.lineContent()
+
+ override def offset: Option[Int] = base.offset()
+
+ override def pointer: Option[Int] = base.pointer()
+
+ override def pointerSpace: Option[String] = base.pointerSpace()
+
+ override def sourcePath: Option[String] = base.sourcePath()
+
+ override def sourceFile: Option[File] = base.sourceFile()
+}
+
+
class ZincWorkerImpl(compilerBridge: Either[
(ZincWorkerApi.Ctx, (String, String) => (Option[Array[os.Path]], os.Path)),
String => os.Path
@@ -156,7 +196,7 @@ class ZincWorkerImpl(compilerBridge: Either[
sources: Agg[os.Path],
compileClasspath: Agg[os.Path],
javacOptions: Seq[String],
- reporter: Option[ManagedLoggedReporter])
+ reporter: Option[BuildProblemReporter])
(implicit ctx: ZincWorkerApi.Ctx): mill.api.Result[CompilationResult] = {
for(res <- compileJava0(
@@ -171,7 +211,7 @@ class ZincWorkerImpl(compilerBridge: Either[
sources: Agg[os.Path],
compileClasspath: Agg[os.Path],
javacOptions: Seq[String],
- reporter: Option[ManagedLoggedReporter])
+ reporter: Option[BuildProblemReporter])
(implicit ctx: ZincWorkerApi.Ctx): mill.api.Result[(os.Path, os.Path)] = {
compileInternal(
upstreamCompileOutput,
@@ -193,7 +233,7 @@ class ZincWorkerImpl(compilerBridge: Either[
scalacOptions: Seq[String],
compilerClasspath: Agg[os.Path],
scalacPluginClasspath: Agg[os.Path],
- reporter: Option[ManagedLoggedReporter])
+ reporter: Option[BuildProblemReporter])
(implicit ctx: ZincWorkerApi.Ctx): mill.api.Result[CompilationResult] = {
for (res <- compileMixed0(
@@ -219,7 +259,7 @@ class ZincWorkerImpl(compilerBridge: Either[
scalacOptions: Seq[String],
compilerClasspath: Agg[os.Path],
scalacPluginClasspath: Agg[os.Path],
- reporter: Option[ManagedLoggedReporter])
+ reporter: Option[BuildProblemReporter])
(implicit ctx: ZincWorkerApi.Ctx): mill.api.Result[(os.Path, os.Path)] = {
withCompilers(
scalaVersion,
@@ -307,7 +347,7 @@ class ZincWorkerImpl(compilerBridge: Either[
javacOptions: Seq[String],
scalacOptions: Seq[String],
compilers: Compilers,
- reporter: Option[ManagedLoggedReporter])
+ reporter: Option[BuildProblemReporter])
(implicit ctx: ZincWorkerApi.Ctx): mill.api.Result[(os.Path, os.Path)] = {
os.makeDir.all(ctx.dest)
@@ -323,7 +363,22 @@ class ZincWorkerImpl(compilerBridge: Either[
}
val newReporter = reporter match {
case None => new ManagedLoggedReporter(10, logger)
- case r: Option[ManagedLoggedReporter] => r.get
+ case Some(r) => new ManagedLoggedReporter(10, logger) {
+ override def logError(problem: xsbti.Problem): Unit = {
+ r.logError(new ZincProblem(problem))
+ super.logError(problem)
+ }
+
+ override def logWarning(problem: xsbti.Problem): Unit = {
+ r.logWarning(new ZincProblem(problem))
+ super.logWarning(problem)
+ }
+
+ override def logInfo(problem: xsbti.Problem): Unit = {
+ r.logInfo(new ZincProblem(problem))
+ super.logInfo(problem)
+ }
+ }
}
val analysisMap0 = upstreamCompileOutput.map(_.swap).toMap