package org.scribble.del.global;
import java.util.Arrays;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.ProtocolDef;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GInteractionSeq;
import org.scribble.ast.global.GProtocolBlock;
import org.scribble.ast.global.GProtocolDecl;
import org.scribble.ast.global.GProtocolDef;
import org.scribble.ast.global.GRecursion;
import org.scribble.ast.local.LProtocolBlock;
import org.scribble.ast.local.LProtocolDef;
import org.scribble.ast.name.simple.RecVarNode;
import org.scribble.del.ProtocolDefDel;
import org.scribble.del.ScribDelBase;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.SubprotocolSig;
import org.scribble.sesstype.kind.RecVarKind;
import org.scribble.visit.ProtocolDefInliner;
import org.scribble.visit.context.Projector;
import org.scribble.visit.context.env.ProjectionEnv;
import org.scribble.visit.env.InlineProtocolEnv;
public class GProtocolDefDel extends ProtocolDefDel
{
public GProtocolDefDel()
{
}
@Override
protected GProtocolDefDel copy()
{
GProtocolDefDel copy = new GProtocolDefDel();
copy.inlined = this.inlined;
return copy;
}
@Override
public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException
{
CommonTree blame = ((GProtocolDecl) parent).header.getSource();
SubprotocolSig subsig = inl.peekStack();
GProtocolDef def = (GProtocolDef) visited;
GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) def.block.del().env()).getTranslation();
RecVarNode recvar = (RecVarNode) AstFactoryImpl.FACTORY.SimpleNameNode(blame,
RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString());
GRecursion rec = AstFactoryImpl.FACTORY.GRecursion(blame, recvar, block);
GInteractionSeq gis = AstFactoryImpl.FACTORY.GInteractionSeq(blame, Arrays.asList(rec));
GProtocolDef inlined = AstFactoryImpl.FACTORY.GProtocolDef(def.getSource(), AstFactoryImpl.FACTORY.GProtocolBlock(blame, gis));
inl.pushEnv(inl.popEnv().setTranslation(inlined));
GProtocolDefDel copy = setInlinedProtocolDef(inlined);
return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, (GProtocolDef) def.del(copy));
}
@Override
public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException
{
//pushVisitorEnv(parent, child, proj);
ScribDelBase.pushVisitorEnv(this, proj);
}
@Override
public GProtocolDef leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException
{
GProtocolDef gpd = (GProtocolDef) visited;
LProtocolBlock block = (LProtocolBlock) ((ProjectionEnv) gpd.block.del().env()).getProjection();
LProtocolDef projection = gpd.project(proj.peekSelf(), block);
proj.pushEnv(proj.popEnv().setProjection(projection));
return (GProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, proj, gpd);
}
@Override
public GProtocolDef getInlinedProtocolDef()
{
return (GProtocolDef) super.getInlinedProtocolDef();
}
@Override
public GProtocolDefDel setInlinedProtocolDef(ProtocolDef<?> inlined)
{
return (GProtocolDefDel) super.setInlinedProtocolDef(inlined);
}
}