diff options
author | Christopher Vogt <oss.nsp@cvogt.org> | 2016-11-13 13:38:38 -0500 |
---|---|---|
committer | Christopher Vogt <oss.nsp@cvogt.org> | 2016-11-13 15:00:11 -0500 |
commit | e5dfc8e09622e4863500e7f19395b5ba44a9780c (patch) | |
tree | 75afc657c38b412dd115982ebde58dcd00b39c01 /plugins | |
parent | de12007cc8907d98f183e65f50f2f9b4700894c3 (diff) | |
download | cbt-e5dfc8e09622e4863500e7f19395b5ba44a9780c.tar.gz cbt-e5dfc8e09622e4863500e7f19395b5ba44a9780c.tar.bz2 cbt-e5dfc8e09622e4863500e7f19395b5ba44a9780c.zip |
enhance dynamic override to not use codegen when possible
+ minor refactorings
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/essentials/DynamicOverrides.scala | 70 |
1 files changed, 39 insertions, 31 deletions
diff --git a/plugins/essentials/DynamicOverrides.scala b/plugins/essentials/DynamicOverrides.scala index 0826f12..4a3fe9e 100644 --- a/plugins/essentials/DynamicOverrides.scala +++ b/plugins/essentials/DynamicOverrides.scala @@ -11,9 +11,9 @@ trait DynamicOverrides extends BaseBuild{ protected [cbt] def overrides: String = "" // TODO: add support for Build inner classes - def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag]: DynamicOverrides with T = newBuild[T](context)("") - def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag](body: String): DynamicOverrides with T = newBuild[T](context)(body) - def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag](context: Context)(body: String): DynamicOverrides with T = { + def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag]: T = newBuild[T](context)("") + def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag](body: String): T = newBuild[T](context)(body) + def newBuild[T <: DynamicOverrides:scala.reflect.ClassTag](context: Context)(body: String): T = { val mixinClass = scala.reflect.classTag[T].runtimeClass assert(mixinClass.getTypeParameters.size == 0) val mixin = if( @@ -30,37 +30,45 @@ trait DynamicOverrides extends BaseBuild{ 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 - val name = if(mixin == "" && overrides == "" && body == ""){ - "Build" - } else if(overrides == ""){ - val name = "DynamicBuild" + System.currentTimeMillis - val code = s""" - class $name(context: _root_.cbt.Context) - extends $parent(context)$mixin{ - $body - } - """ - logger.dynamic("Dynamically generated code:\n" ++ code) - twitterEval.compile(code) - name + 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 name = "DynamicBuild" + System.currentTimeMillis - val code = s""" - class $name(context: _root_.cbt.Context) - extends $parent(context)$mixin{ - $body - } - class ${name}Overrides(context: _root_.cbt.Context) - extends $name(context){ - $overrides - } - """ + 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) - name+"Overrides" + val createBuild = twitterEval.apply[Context => T](s"new $finalName(_: _root_.cbt.Context)",false) + createBuild( context ).asInstanceOf[T] } - - val createBuild = twitterEval.apply[Context => T](s"new $name(_: _root_.cbt.Context)",false) - createBuild( context ).asInstanceOf[DynamicOverrides with T] } } |