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 ed11008126
commit 19c78ac413
1 changed files with 12 additions and 1 deletions

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`)