mirror of https://github.com/sbt/sbt.git
Show defining locations when there are cycles between derived settings
This commit is contained in:
parent
fa9db0ab36
commit
7ed56d3fcd
|
|
@ -269,15 +269,7 @@ object Project extends ProjectExtra
|
||||||
}
|
}
|
||||||
val definingScoped = definingScope match { case Some(sc) => ScopedKey(sc, key); case None => scoped }
|
val definingScoped = definingScope match { case Some(sc) => ScopedKey(sc, key); case None => scoped }
|
||||||
val comp = Def.compiled(structure.settings, actual)(structure.delegates, structure.scopeLocal, display)
|
val comp = Def.compiled(structure.settings, actual)(structure.delegates, structure.scopeLocal, display)
|
||||||
val definedAt = comp get definingScoped map { c =>
|
val definedAt = comp get definingScoped map { c => Def.definedAtString(c.settings).capitalize } getOrElse ""
|
||||||
val posDefined = c.settings.flatMap(_.positionString.toList)
|
|
||||||
if (posDefined.size > 0) {
|
|
||||||
val header = if (posDefined.size == c.settings.size) "Defined at:" else
|
|
||||||
"Some of the defining occurrences:"
|
|
||||||
header + (posDefined.distinct mkString ("\n\t", "\n\t", "\n"))
|
|
||||||
} else ""
|
|
||||||
} getOrElse ""
|
|
||||||
|
|
||||||
|
|
||||||
val cMap = Def.flattenLocals(comp)
|
val cMap = Def.flattenLocals(comp)
|
||||||
val related = cMap.keys.filter(k => k.key == key && k.scope != scope)
|
val related = cMap.keys.filter(k => k.key == key && k.scope != scope)
|
||||||
|
|
|
||||||
|
|
@ -256,6 +256,16 @@ trait Init[Scope]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def definedAtString(settings: Seq[Setting[_]]): String =
|
||||||
|
{
|
||||||
|
val posDefined = settings.flatMap(_.positionString.toList)
|
||||||
|
if (posDefined.size > 0) {
|
||||||
|
val header = if (posDefined.size == settings.size) "defined at:" else
|
||||||
|
"some of the defining occurrences:"
|
||||||
|
header + (posDefined.distinct mkString ("\n\t", "\n\t", "\n"))
|
||||||
|
} else ""
|
||||||
|
}
|
||||||
|
|
||||||
private[this] def derive(init: Seq[Setting[_]])(implicit delegates: Scope => Seq[Scope]): Seq[Setting[_]] =
|
private[this] def derive(init: Seq[Setting[_]])(implicit delegates: Scope => Seq[Scope]): Seq[Setting[_]] =
|
||||||
{
|
{
|
||||||
import collection.mutable
|
import collection.mutable
|
||||||
|
|
@ -266,7 +276,8 @@ trait Init[Scope]
|
||||||
}
|
}
|
||||||
final class Deriveds(val key: AttributeKey[_], val settings: mutable.ListBuffer[Derived]) {
|
final class Deriveds(val key: AttributeKey[_], val settings: mutable.ListBuffer[Derived]) {
|
||||||
def dependencies = settings.flatMap(_.dependencies)
|
def dependencies = settings.flatMap(_.dependencies)
|
||||||
override def toString = "Derived settings for " + key.label
|
// This is mainly for use in the cyclic reference error message
|
||||||
|
override def toString = s"Derived settings for ${key.label}, ${definedAtString(settings.map(_.setting))}"
|
||||||
}
|
}
|
||||||
|
|
||||||
// separate `derived` settings from normal settings (`defs`)
|
// separate `derived` settings from normal settings (`defs`)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue