From cbb953279ccac742867c9d76acee3ae5a46e0455 Mon Sep 17 00:00:00 2001 From: Alistair Johnson Date: Sat, 31 Mar 2018 20:28:09 +0200 Subject: [PATCH] Intial implementation of CompositeProject --- main/src/main/scala/sbt/Project.scala | 8 +++++++- main/src/main/scala/sbt/internal/BuildDef.scala | 3 ++- .../sbt/internal/EvaluateConfigurations.scala | 10 +++++----- .../project/sbt-composite-projects/a/A.scala | 1 + .../project/sbt-composite-projects/a/a.sbt | 2 ++ .../project/sbt-composite-projects/b/build.sbt | 2 ++ .../project/sbt-composite-projects/build.sbt | 13 +++++++++++++ .../sbt-composite-projects/changes/basic.sbt | 1 + .../project/sbt-composite-projects/other.sbt | 1 + .../project/sbt-composite-projects/test | 17 +++++++++++++++++ 10 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/a/A.scala create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/a/a.sbt create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/b/build.sbt create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/build.sbt create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/changes/basic.sbt create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/other.sbt create mode 100644 sbt/src/sbt-test/project/sbt-composite-projects/test diff --git a/main/src/main/scala/sbt/Project.scala b/main/src/main/scala/sbt/Project.scala index f292ca0e1..0fe82b457 100755 --- a/main/src/main/scala/sbt/Project.scala +++ b/main/src/main/scala/sbt/Project.scala @@ -119,7 +119,13 @@ sealed trait ProjectDefinition[PR <: ProjectReference] { if (ts.isEmpty) Nil else s"$label: $ts" :: Nil } -sealed trait Project extends ProjectDefinition[ProjectReference] { +trait CompositeProject { + def componentProjects: Seq[Project] +} + +sealed trait Project extends ProjectDefinition[ProjectReference] with CompositeProject { + def componentProjects: Seq[Project] = this :: Nil + private[sbt] def copy( id: String = id, base: File = base, diff --git a/main/src/main/scala/sbt/internal/BuildDef.scala b/main/src/main/scala/sbt/internal/BuildDef.scala index 96c4641f6..4194613ae 100644 --- a/main/src/main/scala/sbt/internal/BuildDef.scala +++ b/main/src/main/scala/sbt/internal/BuildDef.scala @@ -17,7 +17,8 @@ import sbt.internal.inc.ReflectUtilities trait BuildDef { def projectDefinitions(baseDirectory: File): Seq[Project] = projects - def projects: Seq[Project] = ReflectUtilities.allVals[Project](this).values.toSeq + def projects: Seq[Project] = + ReflectUtilities.allVals[CompositeProject](this).values.toSeq.flatMap(_.componentProjects) // TODO: Should we grab the build core settings here or in a plugin? def settings: Seq[Setting[_]] = Defaults.buildCore def buildLoaders: Seq[BuildLoader.Components] = Nil diff --git a/main/src/main/scala/sbt/internal/EvaluateConfigurations.scala b/main/src/main/scala/sbt/internal/EvaluateConfigurations.scala index 6b4e77f91..872b8e33f 100644 --- a/main/src/main/scala/sbt/internal/EvaluateConfigurations.scala +++ b/main/src/main/scala/sbt/internal/EvaluateConfigurations.scala @@ -123,10 +123,10 @@ private[sbt] object EvaluateConfigurations { // Tracks all the files we generated from evaluating the sbt file. val allGeneratedFiles = (definitions.generated ++ dslEntries.flatMap(_.generated)) loader => { - val projects = - definitions.values(loader).collect { - case p: Project => resolveBase(file.getParentFile, p) - } + val projects = definitions.values(loader).flatMap { + case p: CompositeProject => p.componentProjects.map(resolveBase(file.getParentFile, _)) + case _ => Nil + } val (settingsRaw, manipulationsRaw) = dslEntries map (_.result apply loader) partition { case DslEntry.ProjectSettings(_) => true @@ -234,7 +234,7 @@ private[sbt] object EvaluateConfigurations { } private[this] def extractedValTypes: Seq[String] = - Seq(classOf[Project], classOf[InputKey[_]], classOf[TaskKey[_]], classOf[SettingKey[_]]).map(_.getName) + Seq(classOf[CompositeProject], classOf[InputKey[_]], classOf[TaskKey[_]], classOf[SettingKey[_]]).map(_.getName) private[this] def evaluateDefinitions(eval: Eval, name: String, imports: Seq[(String, Int)], definitions: Seq[(String, LineRange)], file: Option[File]): compiler.EvalDefinitions = { diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/a/A.scala b/sbt/src/sbt-test/project/sbt-composite-projects/a/A.scala new file mode 100644 index 000000000..528ffce71 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/a/A.scala @@ -0,0 +1 @@ +object A \ No newline at end of file diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/a/a.sbt b/sbt/src/sbt-test/project/sbt-composite-projects/a/a.sbt new file mode 100644 index 000000000..67966f6d2 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/a/a.sbt @@ -0,0 +1,2 @@ +val aa = taskKey[Unit]("A task in the 'a' project") +aa := println("Hello.") diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/b/build.sbt b/sbt/src/sbt-test/project/sbt-composite-projects/b/build.sbt new file mode 100644 index 000000000..3c7dc5056 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/b/build.sbt @@ -0,0 +1,2 @@ +val h = taskKey[Unit]("A task in project 'b'") +h := println("Hello.") diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/build.sbt b/sbt/src/sbt-test/project/sbt-composite-projects/build.sbt new file mode 100644 index 000000000..cd56ca9e2 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/build.sbt @@ -0,0 +1,13 @@ +import sbt.internal.AddSettings +import sbt.CompositeProject + +// Based on sbt-file-projects test +val cross = new CompositeProject +{ + val p1 = Project.apply("a", new File("a")) + val p2 = Project.apply("b", new File("b")) + def componentProjects: Seq[Project] = Seq(p1, p2) +} + +val g = taskKey[Unit]("A task in the root project") +g := println("Hello.") diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/changes/basic.sbt b/sbt/src/sbt-test/project/sbt-composite-projects/changes/basic.sbt new file mode 100644 index 000000000..c128b140e --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/changes/basic.sbt @@ -0,0 +1 @@ +lazy val root = (project in file(".")) diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/other.sbt b/sbt/src/sbt-test/project/sbt-composite-projects/other.sbt new file mode 100644 index 000000000..94e5f2363 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/other.sbt @@ -0,0 +1 @@ +val c = project diff --git a/sbt/src/sbt-test/project/sbt-composite-projects/test b/sbt/src/sbt-test/project/sbt-composite-projects/test new file mode 100644 index 000000000..dbf2e5289 --- /dev/null +++ b/sbt/src/sbt-test/project/sbt-composite-projects/test @@ -0,0 +1,17 @@ +> g +-> root/compile +> a/compile +> a/aa +> b/compile +> b/h +> c/compile + +$ copy-file changes/basic.sbt basic.sbt +> reload +> g +> root/compile +> a/compile +> a/aa +> b/compile +> b/h +> c/compile