From 2e37532d915d54f61bc645faa6b0c73f29c5d9ea Mon Sep 17 00:00:00 2001 From: Alexandra Dima Date: Fri, 19 Jul 2019 16:33:43 +0200 Subject: Added a root target for the mill base module of each project so that intellij can display the project correctly. --- .../bsp/src/mill/contrib/bsp/MillBuildServer.scala | 14 ++++-- contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala | 56 +++++++++++++++++++--- 2 files changed, 59 insertions(+), 11 deletions(-) (limited to 'contrib/bsp/src') diff --git a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala b/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala index 7684ba31..2c25a9fc 100644 --- a/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala +++ b/contrib/bsp/src/mill/contrib/bsp/MillBuildServer.scala @@ -48,7 +48,10 @@ class MillBuildServer(evaluator: Evaluator, var millEvaluator: Evaluator = evaluator var millModules: Seq[JavaModule] = getMillModules(millEvaluator) var client: BuildClient = _ - var moduleToTargetId: Predef.Map[JavaModule, BuildTargetIdentifier] = ModuleUtils.getModuleTargetIdMap(millModules) + var moduleToTargetId: Predef.Map[JavaModule, BuildTargetIdentifier] = ModuleUtils.getModuleTargetIdMap( + millModules, + evaluator + ) var targetIdToModule: Predef.Map[BuildTargetIdentifier, JavaModule] = targetToModule(moduleToTargetId) var moduleToTarget: Predef.Map[JavaModule, BuildTarget] = ModuleUtils.millModulesToBspTargets(millModules, evaluator, List("scala", "java")) @@ -97,7 +100,8 @@ class MillBuildServer(evaluator: Evaluator, override def workspaceBuildTargets(): CompletableFuture[WorkspaceBuildTargetsResult] = { recomputeTargets() handleExceptions[String, WorkspaceBuildTargetsResult]( - (in) => new WorkspaceBuildTargetsResult(moduleToTarget.values.toList.asJava), "") + (in) => new WorkspaceBuildTargetsResult(moduleToTarget.values.toList.asJava), + "") } private[this] def getSourceFiles(sources: Seq[os.Path]): Iterable[os.Path] = { @@ -114,7 +118,7 @@ class MillBuildServer(evaluator: Evaluator, files } - //TODO: use mill's sources, same for resources + override def buildTargetSources(sourcesParams: SourcesParams): CompletableFuture[SourcesResult] = { def computeSourcesResult: SourcesResult = { @@ -403,7 +407,7 @@ class MillBuildServer(evaluator: Evaluator, var cleaned = true for (targetId <- cleanCacheParams.getTargets.asScala) { val module = targetIdToModule(targetId) - val process = Runtime.getRuntime.exec(s"mill clean ${module.millModuleSegments.parts.mkString(".")}.compile") + val process = Runtime.getRuntime.exec(s"mill clean ${ModuleUtils.moduleName(module.millModuleSegments)}.compile") val processIn = process.getInputStream val processErr = process.getErrorStream @@ -527,7 +531,7 @@ class MillBuildServer(evaluator: Evaluator, private[this] def recomputeTargets(): Unit = { millModules = getMillModules(millEvaluator) - moduleToTargetId = ModuleUtils.getModuleTargetIdMap(millModules) + moduleToTargetId = ModuleUtils.getModuleTargetIdMap(millModules, millEvaluator) targetIdToModule = targetToModule(moduleToTargetId) moduleToTarget = ModuleUtils.millModulesToBspTargets(millModules, evaluator, List("scala", "java")) } diff --git a/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala b/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala index 1d707350..d0db5fd0 100644 --- a/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala +++ b/contrib/bsp/src/mill/contrib/bsp/ModuleUtils.scala @@ -1,12 +1,14 @@ package mill.contrib.bsp +import java.net.URI import java.util.Collections import scala.collection.JavaConverters._ import ch.epfl.scala.bsp4j._ +import mill.T import mill.api.Result.Success import mill.api.{Loose, Strict} -import mill.define.{Discover, Segment, Segments, Task} +import mill.define.{BaseModule, Ctx, Discover, Module, Segment, Segments, Sources, Target, Task} import mill.eval._ import mill.eval.Evaluator import mill.scalajslib.ScalaJSModule @@ -14,6 +16,7 @@ import mill.scalalib.api.Util import mill.scalanativelib._ import mill.scalalib.{GenIdea, GenIdeaImpl, JavaModule, ScalaModule, TestModule} import mill.util.DummyLogger +import os.Path object ModuleUtils { @@ -31,8 +34,11 @@ object ModuleUtils { evaluator: Evaluator, supportedLanguages: List[String]): Predef.Map[JavaModule, BuildTarget] = { - val moduleIdMap = getModuleTargetIdMap(modules) - var moduleToTarget = Predef.Map[JavaModule, BuildTarget]() + val moduleIdMap = getModuleTargetIdMap(modules, evaluator) + val rootModule = getRootJavaModule(evaluator.rootModule) + var moduleToTarget = Predef.Map[JavaModule, BuildTarget]( + rootModule -> getRootTarget(rootModule, evaluator) + ) for ( module <- modules ) { val dataBuildTarget = computeScalaBuildTarget(module, evaluator) @@ -57,12 +63,47 @@ object ModuleUtils { buildTarget.setData(dataBuildTarget) buildTarget.setDisplayName(moduleName(module.millModuleSegments)) buildTarget.setBaseDirectory(module.intellijModulePath.toNIO.toAbsolutePath.toUri.toString) - moduleToTarget ++= Map(module -> buildTarget) + + if (!moduleToTarget.contains(module)) moduleToTarget ++= Map(module -> buildTarget) } moduleToTarget } + def getRootJavaModule(rootBaseModule: BaseModule): JavaModule = { + implicit val ctx: Ctx = rootBaseModule.millOuterCtx + new JavaModule { + + override def millSourcePath: Path = rootBaseModule.millSourcePath + override def sources = T.sources{millSourcePath / "src"} + + def out = T.sources{millSourcePath / "out"} + def target = T.sources{millSourcePath / "target"} + //override def sources: Sources = T.sources{millSourcePath} + override def generatedSources: Target[Seq[PathRef]] = T.sources{ + out() ++ target()} + } + } + + def getRootTarget(rootModule: JavaModule, evaluator: Evaluator): BuildTarget = { + + val rootTarget = new BuildTarget( + new BuildTargetIdentifier(rootModule.millSourcePath.toNIO.toAbsolutePath.toUri.toString), + List.empty[String].asJava, + List.empty[String].asJava, + List.empty[BuildTargetIdentifier].asJava, + new BuildTargetCapabilities(false, false, false)) + rootTarget.setBaseDirectory(rootModule.millSourcePath.toNIO.toAbsolutePath.toUri.toString) + rootTarget.setDataKind("scala") + rootTarget.setTags(List(BuildTargetTag.LIBRARY, BuildTargetTag.APPLICATION).asJava) + rootTarget.setData(computeScalaBuildTarget(rootModule, evaluator)) + val basePath = rootModule.millSourcePath.toIO.toPath + if (basePath.getNameCount >= 1) + rootTarget.setDisplayName(basePath.getName(basePath.getNameCount - 1) + "-root") + else rootTarget.setDisplayName("root") + rootTarget + } + def getModuleCapabilities(module: JavaModule, evaluator: Evaluator): BuildTargetCapabilities = { val canTest = module match { case module: TestModule => true @@ -126,8 +167,11 @@ object ModuleUtils { } } - def getModuleTargetIdMap(modules: Seq[JavaModule]): Predef.Map[JavaModule, BuildTargetIdentifier] = { - var moduleToTarget = Map[JavaModule, BuildTargetIdentifier]() + def getModuleTargetIdMap(modules: Seq[JavaModule], evaluator:Evaluator): Predef.Map[JavaModule, BuildTargetIdentifier] = { + var moduleToTarget = Map[JavaModule, BuildTargetIdentifier]( + getRootJavaModule(evaluator.rootModule) -> new BuildTargetIdentifier(evaluator.rootModule.millSourcePath. + toNIO.toAbsolutePath.toUri.toString) + ) for ( module <- modules ) { moduleToTarget ++= Map(module -> new BuildTargetIdentifier( -- cgit v1.2.3