package org.scribble.del.name;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.ScribNode;
import org.scribble.ast.name.simple.RecVarNode;
import org.scribble.del.ScribDelBase;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.RecVarKind;
import org.scribble.sesstype.name.RecVar;
import org.scribble.visit.ProtocolDefInliner;
import org.scribble.visit.wf.NameDisambiguator;
public class RecVarNodeDel extends ScribDelBase
{
public RecVarNodeDel()
{
}
@Override
public RecVarNode leaveDisambiguation(ScribNode parent, ScribNode child, NameDisambiguator disamb, ScribNode visited) throws ScribbleException
{
// Consistent with bound RoleNode checking
RecVarNode rn = (RecVarNode) visited;
RecVar rv = rn.toName();
if (!disamb.isBoundRecVar(rv))
{
throw new ScribbleException(rn.getSource(), "Rec variable not bound: " + rn);
}
return (RecVarNode) super.leaveDisambiguation(parent, child, disamb, rn);
//return super.leaveDisambiguation(parent, child, disamb, rn.reconstruct(disamb.getCanonicalRecVarName(rv)));
}
@Override
public void enterProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner) throws ScribbleException
{
super.enterProtocolInlining(parent, child, inliner);
ScribDelBase.pushVisitorEnv(this, inliner);
}
@Override
public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inliner, ScribNode visited) throws ScribbleException
{
RecVarNode rn = (RecVarNode) visited;
RecVar rv = rn.toName();
//return super.leaveProtocolInlining(parent, child, inliner, rn.reconstruct(inliner.getCanonicalRecVarName(rv))); // No, affects the source AST
//RecVarNode inlined = rn.reconstruct(inliner.getCanonicalRecVarName(rv));
RecVarNode inlined = (RecVarNode) AstFactoryImpl.FACTORY.SimpleNameNode(rn.getSource(), RecVarKind.KIND, inliner.getCanonicalRecVarName(rv));
inliner.pushEnv(inliner.popEnv().setTranslation(inlined));
return ScribDelBase.popAndSetVisitorEnv(this, inliner, rn); // Not done by any super
}
}