package org.scribble.visit.context;
import org.scribble.ast.ScribNode;
import org.scribble.ast.local.LChoice;
import org.scribble.ast.local.LInteractionSeq;
import org.scribble.ast.local.LProtocolBlock;
import org.scribble.del.local.LChoiceDel;
import org.scribble.del.local.LInteractionSeqDel;
import org.scribble.main.Job;
import org.scribble.main.ScribbleException;
import org.scribble.model.endpoint.EGraphBuilderUtil;
import org.scribble.visit.NoEnvInlinedProtocolVisitor;
// Changed from offsetsubprot visitor to inlined visitor to reduce state label accumulation to rec only -- then, wfc-checking for "unguarded" recursive-do-as-continue in choice blocks handled by unfolding inlineds
// Inlined visitor, not unfolding -- but the inlined is already statically unfolded; this just means we don't do a "dynamic" unfolding as part of the AST visit
public class EGraphBuilder extends NoEnvInlinedProtocolVisitor
//public class EndpointGraphBuilder extends NoEnvUnfoldingVisitor // Doesn't work
{
public final EGraphBuilderUtil util = new EGraphBuilderUtil();
public EGraphBuilder(Job job)
{
super(job);
}
// Override visitInlinedProtocol -- not visit, or else enter/exit is lost
@Override
public ScribNode visitInlinedProtocol(ScribNode parent, ScribNode child) throws ScribbleException
{
if (child instanceof LInteractionSeq)
{
return visitOverrideForLInteractionSeq((LProtocolBlock) parent, (LInteractionSeq) child);
}
else if (child instanceof LChoice)
{
return visitOverrideForLChoice((LInteractionSeq) parent, (LChoice) child);
}
else
{
return super.visitInlinedProtocol(parent, child);
}
}
protected LInteractionSeq visitOverrideForLInteractionSeq(LProtocolBlock parent, LInteractionSeq child) throws ScribbleException
{
return ((LInteractionSeqDel) child.del()).visitForFsmConversion(this, child);
}
protected LChoice visitOverrideForLChoice(LInteractionSeq parent, LChoice child)
{
return ((LChoiceDel) child.del()).visitForFsmConversion(this, child);
}
@Override
protected final void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException
//protected final void unfoldingEnter(ScribNode parent, ScribNode child) throws ScribbleException
{
super.inlinedEnter(parent, child);
//super.unfoldingEnter(parent, child);
child.del().enterEGraphBuilding(parent, child, this);
}
@Override
protected ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException
//protected ScribNode unfoldingLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException
{
visited = visited.del().leaveEGraphBuilding(parent, child, this, visited);
return super.inlinedLeave(parent, child, visited);
//return super.unfoldingLeave(parent, child, visited);
}
}