Show defining locations when there are cycles between derived settings

This commit is contained in:
Mark Harrah 2013-05-09 17:13:22 -04:00
parent fa9db0ab36
commit 7ed56d3fcd
2 changed files with 13 additions and 10 deletions

View File

@ -269,15 +269,7 @@ object Project extends ProjectExtra
}
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 definedAt = comp get definingScoped map { c =>
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 definedAt = comp get definingScoped map { c => Def.definedAtString(c.settings).capitalize } getOrElse ""
val cMap = Def.flattenLocals(comp)
val related = cMap.keys.filter(k => k.key == key && k.scope != scope)

View File

@ -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[_]] =
{
import collection.mutable
@ -266,7 +276,8 @@ trait Init[Scope]
}
final class Deriveds(val key: AttributeKey[_], val settings: mutable.ListBuffer[Derived]) {
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`)