package org.scribble.visit;
import java.util.Map;
import org.scribble.ast.NonRoleArgNode;
import org.scribble.ast.ScribNode;
import org.scribble.ast.name.simple.RoleNode;
import org.scribble.main.Job;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.Arg;
import org.scribble.sesstype.kind.NonRoleArgKind;
import org.scribble.sesstype.name.Role;
public class Substitutor extends AstVisitor
{
// name in the current protocoldecl scope -> the original name node in the root protocol decl
// Applications of the maps (i.e. substitution) should reconstruct/clone the original nodes
private final Map<Role, RoleNode> rolemap;
private final Map<Arg<? extends NonRoleArgKind>, NonRoleArgNode> argmap;
public Substitutor(Job job, Map<Role, RoleNode> rolemap, Map<Arg<? extends NonRoleArgKind>, NonRoleArgNode> argmap)
{
super(job);
this.rolemap = rolemap;
this.argmap = argmap;
}
@Override
public ScribNode leave(ScribNode parent, ScribNode child, ScribNode visited) throws ScribbleException
{
return visited.substituteNames(this);
}
public RoleNode getRoleSubstitution(Role role)
{
return this.rolemap.get(role).clone();
}
public NonRoleArgNode getArgumentSubstitution(Arg<? extends NonRoleArgKind> arg)
{
return (NonRoleArgNode) this.argmap.get(arg).clone(); // Makes new dels that will be discarded in NonRoleParamNode (just as calling the factory manually would)
}
}