package org.scribble.del.global;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.ScribNode;
import org.scribble.ast.global.GProtocolBlock;
import org.scribble.ast.global.GRecursion;
import org.scribble.ast.local.LProtocolBlock;
import org.scribble.ast.local.LRecursion;
import org.scribble.ast.name.simple.RecVarNode;
import org.scribble.del.RecursionDel;
import org.scribble.main.ScribbleException;
import org.scribble.visit.ProtocolDefInliner;
import org.scribble.visit.context.Projector;
import org.scribble.visit.context.env.ProjectionEnv;
import org.scribble.visit.env.InlineProtocolEnv;
import org.scribble.visit.wf.WFChoiceChecker;
import org.scribble.visit.wf.env.WFChoiceEnv;
public class GRecursionDel extends RecursionDel implements GCompoundInteractionNodeDel
{
@Override
public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException
{
GRecursion gr = (GRecursion) visited;
//RecVarNode recvar = gr.recvar.clone();
RecVarNode recvar = (RecVarNode) ((InlineProtocolEnv) gr.recvar.del().env()).getTranslation();
GProtocolBlock block = (GProtocolBlock) ((InlineProtocolEnv) gr.block.del().env()).getTranslation();
GRecursion inlined = AstFactoryImpl.FACTORY.GRecursion(gr.getSource(), recvar, block);
inl.pushEnv(inl.popEnv().setTranslation(inlined));
return (GRecursion) super.leaveProtocolInlining(parent, child, inl, gr);
}
@Override
public GRecursion leaveInlinedWFChoiceCheck(ScribNode parent, ScribNode child, WFChoiceChecker checker, ScribNode visited) throws ScribbleException
{
GRecursion rec = (GRecursion) visited;
WFChoiceEnv merged = checker.popEnv().mergeContext((WFChoiceEnv) rec.block.del().env());
checker.pushEnv(merged);
return (GRecursion) super.leaveInlinedWFChoiceCheck(parent, child, checker, rec);
}
@Override
public GRecursion leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException
{
GRecursion gr = (GRecursion) visited;
LProtocolBlock block =
(LProtocolBlock) ((ProjectionEnv) gr.block.del().env()).getProjection();
//((GProtocolBlockDel) gr.block.del()).project(gr.getBlock(), self);
LRecursion projection = gr.project(proj.peekSelf(), block);
proj.pushEnv(proj.popEnv().setProjection(projection));
return (GRecursion) GCompoundInteractionNodeDel.super.leaveProjection(parent, child, proj, gr);
}
}