From 60b714e8dea72ca19db155811e0d3243647fbdcd Mon Sep 17 00:00:00 2001 From: Mark Harrah Date: Wed, 8 May 2013 12:56:58 -0400 Subject: [PATCH] require dynamic initialization to be explicitly enabled for derived settings --- main/settings/src/main/scala/sbt/Def.scala | 4 ++-- util/collection/src/main/scala/sbt/Settings.scala | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/main/settings/src/main/scala/sbt/Def.scala b/main/settings/src/main/scala/sbt/Def.scala index 77c5ed11e..1a5bda0c5 100644 --- a/main/settings/src/main/scala/sbt/Def.scala +++ b/main/settings/src/main/scala/sbt/Def.scala @@ -37,8 +37,8 @@ object Def extends Init[Scope] with TaskMacroExtra case None => s } - override def deriveAllowed[T](s: Setting[T]): Option[String] = - super.deriveAllowed(s) orElse + override def deriveAllowed[T](s: Setting[T], allowDynamic: Boolean): Option[String] = + super.deriveAllowed(s, allowDynamic) orElse (if(s.key.scope != ThisScope) Some(s"Scope cannot be defined for ${definedSettingString(s)}") else None ) orElse s.dependencies.find(k => k.scope != ThisScope).map(k => s"Scope cannot be defined for dependency ${k.key.label} of ${definedSettingString(s)}") diff --git a/util/collection/src/main/scala/sbt/Settings.scala b/util/collection/src/main/scala/sbt/Settings.scala index 1b2d60f3b..647b2c89e 100644 --- a/util/collection/src/main/scala/sbt/Settings.scala +++ b/util/collection/src/main/scala/sbt/Settings.scala @@ -73,12 +73,15 @@ trait Init[Scope] def uniform[S,T](inputs: Seq[Initialize[S]])(f: Seq[S] => T): Initialize[T] = new Apply[({ type l[L[x]] = List[L[S]] })#l, T](f, inputs.toList, AList.seq[S]) - def derive[T](s: Setting[T]): Setting[T] = { - deriveAllowed(s) foreach error + /** Constructs a derived setting that will be automatically defined in every scope where one of its dependencies is explicitly defined. + * A setting initialized with dynamic dependencies is only allowed if `allowDynamic` is true. + * Only the static dependencies are tracked, however. */ + final def derive[T](s: Setting[T], allowDynamic: Boolean = false): Setting[T] = { + deriveAllowed(s, allowDynamic) foreach error new DerivedSetting[T](s.key, s.init, s.pos) } - def deriveAllowed[T](s: Setting[T]): Option[String] = s.init match { - case _: Bind[_,_] => Some("Cannot derive from dynamic dependencies.") + def deriveAllowed[T](s: Setting[T], allowDynamic: Boolean): Option[String] = s.init match { + case _: Bind[_,_] if !allowDynamic => Some("Cannot derive from dynamic dependencies.") case _ => None }