summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbuild.sc1
-rw-r--r--contrib/bsp/src/mill/contrib/MainMillBuildServer.scala16
-rw-r--r--contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala26
-rw-r--r--contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala98
-rw-r--r--main/api/src/mill/api/Ctx.scala2
-rw-r--r--main/core/src/eval/Evaluator.scala10
-rw-r--r--scalalib/src/JavaModule.scala2
-rw-r--r--scalalib/src/ScalaModule.scala2
8 files changed, 70 insertions, 87 deletions
diff --git a/build.sc b/build.sc
index abf9b9b7..222de575 100755
--- a/build.sc
+++ b/build.sc
@@ -125,6 +125,7 @@ object main extends MillModule {
}
}
object api extends MillApiModule{
+ //def moduleDeps = Seq(core)
def ivyDeps = Agg(
Deps.osLib,
Deps.upickle
diff --git a/contrib/bsp/src/mill/contrib/MainMillBuildServer.scala b/contrib/bsp/src/mill/contrib/MainMillBuildServer.scala
index d932fbcb..bfe23444 100644
--- a/contrib/bsp/src/mill/contrib/MainMillBuildServer.scala
+++ b/contrib/bsp/src/mill/contrib/MainMillBuildServer.scala
@@ -7,7 +7,7 @@ import java.nio.file.FileAlreadyExistsException
import java.util.concurrent.{CancellationException, CompletableFuture, ExecutorService, Executors, Future}
import upickle.default._
-import ch.epfl.scala.bsp4j.{BspConnectionDetails, BuildClient, CompileParams, DidChangeBuildTarget, LogMessageParams, PublishDiagnosticsParams, ScalaTestClassesParams, ShowMessageParams, TaskFinishParams, TaskProgressParams, TaskStartParams, TestParams, WorkspaceBuildTargetsResult}
+import ch.epfl.scala.bsp4j.{BspConnectionDetails, BuildClient, CleanCacheParams, CompileParams, DidChangeBuildTarget, LogMessageParams, PublishDiagnosticsParams, ScalaTestClassesParams, ShowMessageParams, TaskFinishParams, TaskProgressParams, TaskStartParams, TestParams, WorkspaceBuildTargetsResult}
import mill._
import mill.api.Strict
import mill.contrib.bsp.{BspLoggedReporter, MillBuildServer, ModuleUtils}
@@ -183,14 +183,12 @@ object MainMillBuildServer extends ExternalModule {
???
}
millServer.client = client
- for (module <- millServer.millModules) {
- if (millServer.moduleToTarget(module).getDisplayName == "test") {
-// println(eval.evaluate(Strict.Agg(module.asInstanceOf[TestModule].testLocal()
-// )).rawValues)
- millServer.initialized = true
- println(millServer.buildTargetTest(new TestParams(List(millServer.moduleToTargetId(module)).asJava)).get)
- }
- }
+ millServer.initialized = true
+ println(millServer.buildTargetCleanCache(
+ new CleanCacheParams(millServer.millModules.map(m => millServer.moduleToTargetId(m)).asJava)).get)
+ println(millServer.buildTargetCompile(
+ new CompileParams(millServer.millModules.map(m => millServer.moduleToTargetId(m)).asJava)).get)
+ println("Diagnostics: " + client.diagnostics)
}
/**
diff --git a/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala b/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala
index eda25566..846ffd42 100644
--- a/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala
+++ b/contrib/bsp/src/mill/contrib/bsp/BspLoggedReporter.scala
@@ -2,6 +2,7 @@ package mill.contrib.bsp
import java.io.File
+import ch.epfl.scala.bsp4j.{BuildServer, BuildTargetIdentifier, InverseSourcesParams, ScalaBuildServer, TextDocumentIdentifier}
import ch.epfl.scala.{bsp4j => bsp}
import mill.api.BspContext
import sbt.internal.inc.ManagedLoggedReporter
@@ -14,24 +15,30 @@ import scala.compat.java8.OptionConverters._
import scala.io.Source
class BspLoggedReporter(client: bsp.BuildClient,
- targetId: bsp.BuildTargetIdentifier,
+ targetId: BuildTargetIdentifier,
compilationOriginId: Option[String],
maxErrors: Int,
logger: ManagedLogger) extends ManagedLoggedReporter(maxErrors, logger) {
+ var errors = 0
+ var warnings = 0
+ var infos = 0
+
override def logError(problem: Problem): Unit = {
client.onBuildPublishDiagnostics(getDiagnostics(problem, targetId, compilationOriginId))
+ errors += 1
super.logError(problem)
}
override def logInfo(problem: Problem): Unit = {
- logger.info("Problem: " + problem.toString)
- client.onBuildPublishDiagnostics(getDiagnostics(problem, targetId, compilationOriginId))
+ client.onBuildPublishDiagnostics(getDiagnostics(problem, targetId, compilationOriginId))
+ infos += 1
super.logInfo(problem)
}
override def logWarning(problem: Problem): Unit = {
- client.onBuildPublishDiagnostics(getDiagnostics(problem, targetId, compilationOriginId))
+ client.onBuildPublishDiagnostics(getDiagnostics(problem, targetId, compilationOriginId))
+ warnings += 1
super.logWarning(problem)
}
@@ -67,6 +74,17 @@ class BspLoggedReporter(client: bsp.BuildClient,
params
}
+ private[this] def getTragetId(problem: Problem, server: BuildServer with ScalaBuildServer):
+ Option[BuildTargetIdentifier] = {
+ problem.position().sourceFile().asScala match {
+ case Some(file) => Option(
+ server.buildTargetInverseSources(
+ new InverseSourcesParams(new TextDocumentIdentifier(file.toURI.toString))
+ ).get.getTargets.asScala.head)
+ case None => Option.empty[BuildTargetIdentifier]
+ }
+ }
+
private[this] def getErrorCode(file: Option[File], start: bsp.Position, end: bsp.Position, position: xsbti.Position): String = {
file match {
case None => position.lineContent
diff --git a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala b/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala
index bd06d29b..3937f1ab 100644
--- a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala
+++ b/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala
@@ -52,6 +52,8 @@ class MillBuildServer(evaluator: Evaluator,
var targetIdToModule: Predef.Map[BuildTargetIdentifier, JavaModule] = targetToModule(moduleToTargetId)
var moduleToTarget: Predef.Map[JavaModule, BuildTarget] =
ModuleUtils.millModulesToBspTargets(millModules, evaluator, List("scala", "java"))
+ var moduleCodeToTargetId: Predef.Map[Int, BuildTargetIdentifier] =
+ for ( (targetId, module) <- targetIdToModule ) yield (targetId, module.hashCode()).swap
var initialized = false
var clientInitialized = false
@@ -236,72 +238,40 @@ class MillBuildServer(evaluator: Evaluator,
l
}
+ private[this] def getBspLoggedReporterPool(params: Parameters): Int => Option[ManagedLoggedReporter] = {
+ (int: Int) =>
+ if (moduleCodeToTargetId.contains(int)) {
+ println("Module: " + int)
+ Option(new BspLoggedReporter(client,
+ moduleCodeToTargetId(int),
+ params.getOriginId,
+ 10, getCompilationLogger))}
+ else Option.empty[ManagedLoggedReporter]
+ }
+
//TODO: if the client wants to give compilation arguments and the module
// already has some from the build file, what to do?
override def buildTargetCompile(compileParams: CompileParams): CompletableFuture[CompileResult] = {
def getCompileResult: CompileResult = {
val params = TaskParameters.fromCompileParams(compileParams)
- var numFailures = 0
- var compileTime = 0
- for (targetId <- params.getTargets) {
- if (moduleToTarget(targetIdToModule(targetId)).getCapabilities.getCanCompile) {
- val millModule = targetIdToModule(targetId)
- val compileTask = millModule.compile
-
- // send notification to client that compilation of this target started
- val taskStartParams = new TaskStartParams(new TaskId(compileTask.hashCode().toString))
- taskStartParams.setEventTime(System.currentTimeMillis())
- taskStartParams.setMessage("Compiling target: " + targetId)
- taskStartParams.setDataKind("compile-task")
- taskStartParams.setData(new CompileTask(targetId))
- client.onBuildTaskStart(taskStartParams)
-
- val result = millEvaluator.evaluate(Strict.Agg(compileTask),
- Option(new BspLoggedReporter(client,
- targetId,
- getOriginId(compileParams),
- 10, getCompilationLogger)),
- new BspContext {
- override def args: Seq[String] = params.getArguments.getOrElse(Seq.empty[String])
- override def logStart(event: Event): Unit = {}
-
- override def logFinish(event: Event): Unit = {}
- },
- new MillBspLogger(client, compileTask.hashCode(), millEvaluator.log)
- )
- val endTime = System.currentTimeMillis()
-
- compileTime += result.timings.map(timingTuple => timingTuple._2).sum
- var statusCode = StatusCode.OK
-
- if (result.failing.keyCount > 0) {
- statusCode = StatusCode.ERROR
- numFailures += result.failing.keyCount
- }
-
- // send notification to client that compilation of this target ended => compilation report
- val taskFinishParams = new TaskFinishParams(new TaskId(compileTask.hashCode().toString), statusCode)
- taskFinishParams.setEventTime(endTime)
- taskFinishParams.setMessage("Finished compiling target: " +
- moduleToTarget(targetIdToModule(targetId)).getDisplayName)
- taskFinishParams.setDataKind("compile-report")
- val compileReport = new CompileReport(targetId, numFailures, 0)
- compileReport.setOriginId(compileParams.getOriginId)
- compileReport.setTime(compileTime.toLong)
- taskFinishParams.setData(compileReport)
- client.onBuildTaskFinish(taskFinishParams)
- }
- }
-
- var overallStatusCode = StatusCode.OK
- if (numFailures > 0) {
- overallStatusCode = StatusCode.ERROR
- }
- val compileResult = new CompileResult(overallStatusCode)
+ val taskId = params.hashCode()
+ val compileTasks = Strict.Agg(params.getTargets.map(targetId => targetIdToModule(targetId).compile):_*)
+
+ val result = millEvaluator.evaluate(compileTasks,
+ getBspLoggedReporterPool(params),
+ new BspContext {
+ override def args: Seq[String] = params.getArguments.getOrElse(Seq.empty[String])
+ override def logStart(event: Event): Unit = {}
+
+ override def logFinish(event: Event): Unit = {}
+ },
+ new MillBspLogger(client, taskId, millEvaluator.log)
+ )
+ val compileResult = new CompileResult(getStatusCode(result))
compileResult.setOriginId(compileParams.getOriginId)
compileResult //TODO: See what form IntelliJ expects data about products of compilation in order to set data field
- }
+ }
handleExceptions[String, CompileResult]((in) => getCompileResult, "")
}
@@ -312,10 +282,7 @@ class MillBuildServer(evaluator: Evaluator,
val args = params.getArguments.getOrElse(Seq.empty[String])
val runTask = module.run(args.mkString(" "))
val runResult = millEvaluator.evaluate(Strict.Agg(runTask),
- Option(new BspLoggedReporter(client,
- params.getTargets.head,
- params.getOriginId,
- 10, getCompilationLogger)),
+ getBspLoggedReporterPool(params),
logger = new MillBspLogger(client, runTask.hashCode(), millEvaluator.log))
if (runResult.failing.keyCount > 0) {
new RunResult(StatusCode.ERROR)
@@ -328,7 +295,7 @@ class MillBuildServer(evaluator: Evaluator,
private[this] def getStatusCode(results: Evaluator.Results): StatusCode = {
System.err.println("Results: " + results.rawValues)
- if (results.rawValues.exists(r => r.isInstanceOf[Result.Failure[Any]])) {
+ if (results.failing.keyCount > 0) {
StatusCode.ERROR
}
@@ -374,10 +341,7 @@ class MillBuildServer(evaluator: Evaluator,
val results = millEvaluator.evaluate(
Strict.Agg(testTask),
- Option(new BspLoggedReporter(client,
- targetId,
- params.getOriginId,
- 10, getCompilationLogger)),
+ getBspLoggedReporterPool(params),
bspContext,
new MillBspLogger(client, testTask.hashCode, millEvaluator.log))
val endTime = System.currentTimeMillis()
diff --git a/main/api/src/mill/api/Ctx.scala b/main/api/src/mill/api/Ctx.scala
index 439f08d3..02d50b22 100644
--- a/main/api/src/mill/api/Ctx.scala
+++ b/main/api/src/mill/api/Ctx.scala
@@ -61,7 +61,7 @@ class Ctx(
val log: Logger,
val home: os.Path,
val env: Map[String, String],
- val reporter: Option[ManagedLoggedReporter],
+ val reporter: Int => Option[ManagedLoggedReporter],
val bsp: BspContext
)
extends Ctx.Dest
diff --git a/main/core/src/eval/Evaluator.scala b/main/core/src/eval/Evaluator.scala
index 4dd45d14..c6a1f52a 100644
--- a/main/core/src/eval/Evaluator.scala
+++ b/main/core/src/eval/Evaluator.scala
@@ -29,6 +29,8 @@ case class Labelled[T](task: NamedTask[T],
case t: Target[T] => Some(t.readWrite.asInstanceOf[upickle.default.ReadWriter[T]])
case _ => None
}
+
+// override def hashCode(): Int = task.hashCode()
}
case class Evaluator(home: os.Path,
@@ -45,7 +47,7 @@ case class Evaluator(home: os.Path,
val classLoaderSignHash = classLoaderSig.hashCode()
def evaluate(goals: Agg[Task[_]],
- reporter: Option[ManagedLoggedReporter] = Option.empty[ManagedLoggedReporter],
+ reporter: Int => Option[ManagedLoggedReporter] = (int: Int) => Option.empty[ManagedLoggedReporter],
bspContext: BspContext = DummyBspContext,
logger: Logger = log): Evaluator.Results = {
os.makeDir.all(outPath)
@@ -121,7 +123,7 @@ case class Evaluator(home: os.Path,
group: Agg[Task[_]],
results: collection.Map[Task[_], Result[(Any, Int)]],
counterMsg: String,
- reporter: Option[ManagedLoggedReporter],
+ reporter: Int => Option[ManagedLoggedReporter],
bspContext: BspContext,
logger: Logger
): (collection.Map[Task[_], Result[(Any, Int)]], Seq[Task[_]], Boolean) = {
@@ -278,7 +280,7 @@ case class Evaluator(home: os.Path,
paths: Option[Evaluator.Paths],
maybeTargetLabel: Option[String],
counterMsg: String,
- reporter: Option[ManagedLoggedReporter],
+ reporter: Int => Option[ManagedLoggedReporter],
bspContext: BspContext,
logger: Logger): (mutable.LinkedHashMap[Task[_], Result[(Any, Int)]], mutable.Buffer[Task[_]]) = {
@@ -313,7 +315,6 @@ case class Evaluator(home: os.Path,
.map{x => newResults.getOrElse(x, results(x))}
.collect{ case Result.Success((v, hashCode)) => v }
-
val res =
if (targetInputValues.length != task.inputs.length) Result.Skipped
else {
@@ -345,6 +346,7 @@ case class Evaluator(home: os.Path,
reporter,
bspContext //new ManagedLoggedReporter(10, logger)
)
+
val out = System.out
val in = System.in
val err = System.err
diff --git a/scalalib/src/JavaModule.scala b/scalalib/src/JavaModule.scala
index cd467a3b..822d7985 100644
--- a/scalalib/src/JavaModule.scala
+++ b/scalalib/src/JavaModule.scala
@@ -222,7 +222,7 @@ trait JavaModule extends mill.Module with TaskModule with GenIdeaModule { outer
allSourceFiles().map(_.path),
compileClasspath().map(_.path),
javacOptions() ++ T.ctx.bsp.args,
- T.ctx().reporter
+ T.ctx().reporter(hashCode)
)
}
diff --git a/scalalib/src/ScalaModule.scala b/scalalib/src/ScalaModule.scala
index 85f1b6db..5669ca8c 100644
--- a/scalalib/src/ScalaModule.scala
+++ b/scalalib/src/ScalaModule.scala
@@ -143,7 +143,7 @@ trait ScalaModule extends JavaModule { outer =>
scalacOptions() ++ T.ctx.bsp.args,
scalaCompilerClasspath().map(_.path),
scalacPluginClasspath().map(_.path),
- T.ctx().reporter
+ T.ctx().reporter(hashCode)
)
}