package org.scribble.del.global; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ScribNode; import org.scribble.ast.global.GInteractionSeq; import org.scribble.ast.global.GProtocolBlock; import org.scribble.ast.local.LInteractionSeq; import org.scribble.ast.local.LProtocolBlock; import org.scribble.del.ProtocolBlockDel; import org.scribble.del.ScribDelBase; 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; public class GProtocolBlockDel extends ProtocolBlockDel { @Override public void enterProjection(ScribNode parent, ScribNode child, Projector proj) throws ScribbleException { ScribDelBase.pushVisitorEnv(this, proj); } @Override public ScribNode leaveProtocolInlining(ScribNode parent, ScribNode child, ProtocolDefInliner inl, ScribNode visited) throws ScribbleException { GProtocolBlock gpb = (GProtocolBlock) visited; GInteractionSeq seq = (GInteractionSeq) ((InlineProtocolEnv) gpb.seq.del().env()).getTranslation(); GProtocolBlock inlined = AstFactoryImpl.FACTORY.GProtocolBlock(gpb.getSource(), seq); inl.pushEnv(inl.popEnv().setTranslation(inlined)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, inl, gpb); } @Override public GProtocolBlock leaveProjection(ScribNode parent, ScribNode child, Projector proj, ScribNode visited) throws ScribbleException { GProtocolBlock gpb = (GProtocolBlock) visited; LInteractionSeq seq = (LInteractionSeq) ((ProjectionEnv) gpb.seq.del().env()).getProjection(); //((GInteractionSeqDel) gpb.seq.del()).project(gpb.getInteractionSeq(), self); LProtocolBlock projection = gpb.project(proj.peekSelf(), seq); proj.pushEnv(proj.popEnv().setProjection(projection)); return (GProtocolBlock) ScribDelBase.popAndSetVisitorEnv(this, proj, gpb); } }