package org.scribble.del;
import org.scribble.ast.Continue;
import org.scribble.ast.Recursion;
import org.scribble.ast.ScribNode;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.name.RecVar;
import org.scribble.visit.InlinedProtocolUnfolder;
import org.scribble.visit.util.RecVarCollector;
public abstract class ContinueDel extends SimpleInteractionNodeDel
{
public ContinueDel()
{
}
/*@Override
public Continue<?> leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException
{
Continue<?> c = (Continue<?>) visited;
Continue<?> inlined = (Continue<?>) c.clone();
inl.pushEnv(inl.popEnv().setTranslation(inlined));
return (Continue<?>) super.leaveProtocolInlining(parent, child, inl, c);
}*/
@Override
public ScribNode leaveInlinedProtocolUnfolding(ScribNode parent, ScribNode child, InlinedProtocolUnfolder unf, ScribNode visited) throws ScribbleException
{
Continue<?> cont = (Continue<?>) visited;
RecVar rv = cont.recvar.toName();
if (unf.isContinueUnguarded(rv)) // Without this, graph building becomes sensitive to the order of choice blocks (specifically, the relative position were the side effect (re-set entry to rec state) of an unguarded continue is performed)
{
Recursion<?> tmp = unf.getRecVar(rv);
if (tmp == null) // Hacky? for recursive unfolding of cached blocks
{
return cont;
}
return unf.getRecVar(rv).clone();
}
else if (unf.shouldUnfoldForUnguardedRec(rv))
{
return unf.getRecVar(rv).clone();
}
return cont;
}
@Override
public ScribNode leaveRecVarCollection(ScribNode parent, ScribNode child, RecVarCollector coll, ScribNode visited)
throws ScribbleException
{
coll.removeName(((Continue<?>) visited).recvar.toName());
return visited;
}
}