lift anonymous Incompletes to the next keyed, empty Incomplete

This commit is contained in:
Mark Harrah 2011-04-06 20:52:48 -04:00
parent 32d1bc9e4e
commit 1e7d628dbb
2 changed files with 16 additions and 7 deletions

View File

@ -192,12 +192,19 @@ object EvaluateTask
replaced
}
def transformInc[T](result: Result[T]): Result[T] =
result.toEither.left.map { i =>
Incomplete.transform(i) {
case in @ Incomplete(Some(node: Task[_]), _, _, _, _) => in.copy(node = transformNode(node))
case _ => i
result.toEither.left.map { i => Incomplete.transformBU(i)(liftAnonymous andThen taskToKey ) }
def taskToKey: Incomplete => Incomplete = {
case in @ Incomplete(Some(node: Task[_]), _, _, _, _) => in.copy(node = transformNode(node))
case i => i
}
def liftAnonymous: Incomplete => Incomplete = {
case i @ Incomplete(node, tpe, None, causes, None) =>
causes.find( inc => inc.message.isDefined || inc.directCause.isDefined) match {
case Some(lift) => i.copy(directCause = lift.directCause, message = lift.message)
case None => i
}
}
case i => i
}
def transformNode(node: Task[_]): Option[ScopedKey[_]] =
node.info.attributes get taskDefinitionKey

View File

@ -12,12 +12,14 @@ final case class Incomplete(node: Option[AnyRef], tpe: IValue = Error, message:
object Incomplete extends Enumeration {
val Skipped, Error = Value
def transform(i: Incomplete)(f: Incomplete => Incomplete): Incomplete =
def transformTD(i: Incomplete)(f: Incomplete => Incomplete): Incomplete = transform(i, true)(f)
def transformBU(i: Incomplete)(f: Incomplete => Incomplete): Incomplete = transform(i, false)(f)
def transform(i: Incomplete, topDown: Boolean)(f: Incomplete => Incomplete): Incomplete =
{
import collection.JavaConversions._
val visited: collection.mutable.Map[Incomplete,Incomplete] = new java.util.IdentityHashMap[Incomplete, Incomplete]
def visit(inc: Incomplete): Incomplete =
visited.getOrElseUpdate(inc, visitCauses(f(inc)) )
visited.getOrElseUpdate(inc, if(topDown) visitCauses(f(inc)) else f(visitCauses(inc)))
def visitCauses(inc: Incomplete): Incomplete =
inc.copy(causes = inc.causes.map(visit) )