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); } }