package org.scribble.del.local;
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.local.LInteractionSeq;
import org.scribble.ast.local.LProtocolBlock;
import org.scribble.ast.local.LProtocolDecl;
import org.scribble.ast.local.LProtocolDef;
import org.scribble.ast.local.LRecursion;
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.ProtocolKind;
import org.scribble.sesstype.kind.RecVarKind;
import org.scribble.visit.ProtocolDefInliner;
import org.scribble.visit.env.InlineProtocolEnv;
public class LProtocolDefDel extends ProtocolDefDel
{
public LProtocolDefDel()
{
}
@Override
protected LProtocolDefDel copy()
{
LProtocolDefDel copy = new LProtocolDefDel();
copy.inlined = this.inlined;
return copy;
}
@Override
public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException
{
CommonTree blame = ((LProtocolDecl) parent).header.getSource(); // Cf., GProtocolDefDel
SubprotocolSig subsig = inl.peekStack();
LProtocolDef def = (LProtocolDef) visited;
LProtocolBlock block = (LProtocolBlock) ((InlineProtocolEnv) def.block.del().env()).getTranslation();
RecVarNode recvar = (RecVarNode) AstFactoryImpl.FACTORY.SimpleNameNode(blame, // The parent do would probably be the better blame source
RecVarKind.KIND, inl.getSubprotocolRecVar(subsig).toString());
LRecursion rec = AstFactoryImpl.FACTORY.LRecursion(blame, recvar, block);
LInteractionSeq lis = AstFactoryImpl.FACTORY.LInteractionSeq(blame, Arrays.asList(rec));
LProtocolDef inlined = AstFactoryImpl.FACTORY.LProtocolDef(def.getSource(), AstFactoryImpl.FACTORY.LProtocolBlock(blame, lis));
inl.pushEnv(inl.popEnv().setTranslation(inlined));
LProtocolDefDel copy = setInlinedProtocolDef(inlined);
return (LProtocolDef) ScribDelBase.popAndSetVisitorEnv(this, inl, (LProtocolDef) def.del(copy));
}
@Override
public LProtocolDef getInlinedProtocolDef()
{
return (LProtocolDef) super.getInlinedProtocolDef();
}
@Override
public LProtocolDefDel setInlinedProtocolDef(ProtocolDef<? extends ProtocolKind> inlined)
{
return (LProtocolDefDel) super.setInlinedProtocolDef(inlined);
}
}