diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2017-03-19 21:38:02 -0400 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2017-03-19 21:38:02 -0400 |
commit | 8f055d10fb3b5494115ffd8bf46b972d0937e234 (patch) | |
tree | e0519bd38f618eaa91303076007383a8f3639484 /stage2/plugins | |
parent | ff4bc8f6d8077dd8d96064267c31bdace93d892b (diff) | |
download | cbt-8f055d10fb3b5494115ffd8bf46b972d0937e234.tar.gz cbt-8f055d10fb3b5494115ffd8bf46b972d0937e234.tar.bz2 cbt-8f055d10fb3b5494115ffd8bf46b972d0937e234.zip |
Get rid of the hacky "essential" plugins separation
Let’s keep move them back into stage2 again instead for reduction
of complexity, cbt build speed and convenience of fewer manual
dependencies.
And for that let cbt just include eval from the start.
Diffstat (limited to 'stage2/plugins')
-rw-r--r-- | stage2/plugins/CommandLineOverrides.scala | 27 | ||||
-rw-r--r-- | stage2/plugins/DynamicOverrides.scala | 82 | ||||
-rw-r--r-- | stage2/plugins/MultipleScalaVersions.scala | 9 | ||||
-rw-r--r-- | stage2/plugins/Readme.md | 3 | ||||
-rw-r--r-- | stage2/plugins/SnapshotVersion.scala | 7 |
5 files changed, 128 insertions, 0 deletions
diff --git a/stage2/plugins/CommandLineOverrides.scala b/stage2/plugins/CommandLineOverrides.scala new file mode 100644 index 0000000..3ffaf21 --- /dev/null +++ b/stage2/plugins/CommandLineOverrides.scala @@ -0,0 +1,27 @@ +package cbt +trait CommandLineOverrides extends DynamicOverrides{ + def `with`: Any = { + lib.callReflective( + newBuild[DynamicOverrides]( + context.copy( + args = context.args.drop(2) + ) + )( s""" + ${context.args.lift(0).getOrElse("")} + """ ), + context.args.lift(1) orElse Some("void"), + context + ) + } + def eval = { + lib.callReflective( + newBuild[CommandLineOverrides]( + context.copy( + args = ( context.args.lift(0).map("println{ "+_+" }") ).toSeq + ) + ){""}, + Some("with"), + context + ) + } +} diff --git a/stage2/plugins/DynamicOverrides.scala b/stage2/plugins/DynamicOverrides.scala new file mode 100644 index 0000000..8d67be7 --- /dev/null +++ b/stage2/plugins/DynamicOverrides.scala @@ -0,0 +1,82 @@ +package cbt +import cbt.eval.Eval +trait DynamicOverrides extends BaseBuild{ + private val twitterEval = { + taskCache[DynamicOverrides]( "eval" ).memoize{ + new Eval{ + override lazy val impliedClassPath: List[String] = context.parentBuild.get.classpath.strings.toList//new ScalaCompilerDependency( context.cbtLastModified, context.paths.mavenCache, scalaVersion ).classpath.strings.toList + override def classLoader = DynamicOverrides.this.getClass.getClassLoader + } + } + } + + protected [cbt] def overrides: String = "" + + // TODO: add support for Build inner classes + import scala.reflect.runtime.universe._ + def newBuild[T <: DynamicOverrides:TypeTag]: T = newBuild[T](context)("") + def newBuild[T <: DynamicOverrides:TypeTag](body: String): T = newBuild[T](context)(body) + def newBuild[T <: DynamicOverrides:TypeTag](context: Context)(body: String): T = { + val tag = typeTag[T] + val mixinClass = tag.mirror.runtimeClass(tag.tpe) + assert(mixinClass.getTypeParameters.size == 0) + val mixin = if( + mixinClass == classOf[Nothing] + || mixinClass.getSimpleName == "Build" + ) "" else " with "+mixinClass.getName + import scala.collection.JavaConverters._ + val parent = Option( + if(this.getClass.getName.startsWith("Evaluator__")) + this.getClass.getName.dropWhile(_ != '$').drop(1).stripSuffix("$1") + else + this.getClass.getName + ).getOrElse( + throw new Exception( "You cannot have more than one newBuild call on the Stack right now." ) + ) + val overrides = "" // currently disables, but can be used to force overrides everywhere + if(mixin == "" && overrides == "" && body == ""){ + // TODO: is it possible for the contructor to have the wrong signature and + // thereby produce a pretty hard to understand error message here? + this.getClass + .getConstructor(classOf[Context]) + .newInstance(context) + .asInstanceOf[T] + } else { + val baseName = "DynamicBuild" + System.currentTimeMillis + val overrideName = baseName+"Overrides" + val (finalName, code) = if(overrides == ""){ + ( + baseName, + s""" + class $baseName(context: _root_.cbt.Context) + extends $parent(context)$mixin{ + $body + } + """ + ) + } else { + ( + overrideName, + s""" + class $baseName(context: _root_.cbt.Context) + extends $parent(context)$mixin{ + $body + } + class $overrideName(context: _root_.cbt.Context) + extends $baseName(context){ + $overrides + } + """ + ) + } + logger.dynamic("Dynamically generated code:\n" ++ code) + twitterEval.compile(code) + val createBuild = twitterEval.apply[Context => T](s"new $finalName(_: _root_.cbt.Context)",false) + createBuild( context ).asInstanceOf[T] + } + } + + def runFlat: ExitCode = newBuild[DynamicOverrides]{""" + override def flatClassLoader = true + """}.run +} diff --git a/stage2/plugins/MultipleScalaVersions.scala b/stage2/plugins/MultipleScalaVersions.scala new file mode 100644 index 0000000..5d896dd --- /dev/null +++ b/stage2/plugins/MultipleScalaVersions.scala @@ -0,0 +1,9 @@ +package cbt + +trait MultipleScalaVersions extends DynamicOverrides{ + def scalaVersions: Seq[String] = Seq(scalaVersion, "2.10.6") + def cross: Seq[MultipleScalaVersions] = + scalaVersions.map{ v => + newBuild[MultipleScalaVersions](context.copy(scalaVersion = Some(v)))("") + } +} diff --git a/stage2/plugins/Readme.md b/stage2/plugins/Readme.md new file mode 100644 index 0000000..76d3756 --- /dev/null +++ b/stage2/plugins/Readme.md @@ -0,0 +1,3 @@ +Essential CBT plugins + +Not part of CBT's core to keep it slim and so they can have dependencies if needed. diff --git a/stage2/plugins/SnapshotVersion.scala b/stage2/plugins/SnapshotVersion.scala new file mode 100644 index 0000000..1f7eb23 --- /dev/null +++ b/stage2/plugins/SnapshotVersion.scala @@ -0,0 +1,7 @@ +package cbt + +trait SnapshotVersion extends ArtifactInfo with DynamicOverrides{ + def snapshot = newBuild[SnapshotVersion]{""" + override def version = super.version ++ "-SNAPSHOT" + """} +} |