package org.scribble.visit.wf;
import org.scribble.ast.Module;
import org.scribble.ast.ProtocolDecl;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GProtocolDecl;
import org.scribble.main.Job;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.ProtocolKind;
import org.scribble.sesstype.name.GProtocolName;
import org.scribble.sesstype.name.Role;
import org.scribble.visit.SubprotocolVisitor;
import org.scribble.visit.wf.env.ExplicitCorrelationEnv;
//public class ExplicitCorrelationChecker extends InlinedProtocolVisitor<ExplicitCorrelationEnv>
public class ExplicitCorrelationChecker extends SubprotocolVisitor<ExplicitCorrelationEnv> // Need to follow /unfolded/ subprotos (inlined is already unfolded by context building when this pass is run)
{
public ExplicitCorrelationChecker(Job job)
{
super(job);
}
@Override
public ScribNode visit(ScribNode parent, ScribNode child) throws ScribbleException
{
if (child instanceof GProtocolDecl)
{
GProtocolDecl gpd = (GProtocolDecl) child;
if (!gpd.isAuxModifier() && gpd.isExplicitModifier())
{
Module mod = (Module) parent;
GProtocolName gpn = gpd.getFullMemberName(mod);
for (Role r : gpd.header.roledecls.getRoles())
{
Module proj = this.job.getContext().getProjection(gpn, r);
proj.accept(this);
}
}
return gpd;
}
return super.visit(parent, child);
}
@Override
//public void inlinedEnter(ScribNode parent, ScribNode child) throws ScribbleException
public void subprotocolEnter(ScribNode parent, ScribNode child) throws ScribbleException
{
//super.inlinedEnter(parent, child);
super.subprotocolEnter(parent, child);
child.del().enterExplicitCorrelationCheck(parent, child, this);
}
@Override
//public ScribNode inlinedLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException
public ScribNode subprotocolLeave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException
{
visited = visited.del().leaveExplicitCorrelationCheck(parent, child, this, visited);
//return super.inlinedLeave(parent, child, visited);
return super.subprotocolLeave(parent, child, visited);
}
@Override
protected ExplicitCorrelationEnv makeRootProtocolDeclEnv(ProtocolDecl<? extends ProtocolKind> pd)
{
return new ExplicitCorrelationEnv();
}
}