improve error messages for cycles

This commit is contained in:
Mark Harrah 2011-04-13 19:06:36 -04:00
parent 90aa53a19e
commit 8b7e421807
1 changed files with 19 additions and 8 deletions

View File

@ -22,20 +22,31 @@ object Dag
val finished = asSet(new java.util.LinkedHashSet[T])
def visitAll(nodes: Iterable[T]) = nodes foreach visit
def visit(dag : T){
if (!discovered(dag)) {
discovered(dag) = true;
visitAll(dependencies(dag));
finished += dag;
def visit(node : T){
if (!discovered(node)) {
discovered(node) = true;
try { visitAll(dependencies(node)); } catch { case c: Cyclic => throw node :: c }
finished += node;
}
else if(!finished(dag))
throw new Cyclic(dag)
else if(!finished(node))
throw new Cyclic(node)
}
visitAll(nodes);
finished.toList;
}
final class Cyclic(val value: Any) extends Exception("Cyclic reference involving " + value)
final class Cyclic(val value: Any, val all: List[Any], val complete: Boolean)
extends Exception( "Cyclic reference involving " + (if(complete) all.mkString(", ") else value) )
{
def this(value: Any) = this(value, value :: Nil, false)
def ::(a: Any): Cyclic =
if(complete)
this
else if(a == value)
new Cyclic(value, all, true)
else
new Cyclic(value, a :: all, false)
}
}