package org.scribble.ast.global; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.PayloadElem; import org.scribble.ast.ScribNodeBase; import org.scribble.ast.local.LDelegationElem; import org.scribble.ast.name.qualified.GProtocolNameNode; import org.scribble.ast.name.simple.RoleNode; import org.scribble.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.sesstype.kind.Local; import org.scribble.sesstype.name.GDelegationType; import org.scribble.sesstype.name.PayloadType; import org.scribble.visit.AstVisitor; import org.scribble.visit.context.Projector; // A "binary name pair" payload elem (current AST hierarchy induces this pattern), cf. UnaryPayloadElem (also differs in no parsing ambig against parameters) // The this.name will be global kind, but overall this node is local kind //public class DelegationElem extends PayloadElem<Local> public class GDelegationElem extends ScribNodeBase implements PayloadElem<Local> { // Currently no potential for ambiguity, cf. UnaryPayloadElem (DataTypeNameNode or ParameterNode) public final GProtocolNameNode proto; // Becomes full name after disambiguation public final RoleNode role; public GDelegationElem(CommonTree source, GProtocolNameNode proto, RoleNode role) { //super(proto); super(source); this.proto = proto; this.role = role; } @Override public LDelegationElem project() { return AstFactoryImpl.FACTORY.LDelegationElem(this.source, Projector.makeProjectedFullNameNode(this.source, this.proto.toName(), this.role.toName())); } @Override public boolean isGlobalDelegationElem() { return true; } @Override protected GDelegationElem copy() { return new GDelegationElem(this.source, this.proto, this.role); } @Override public GDelegationElem clone() { GProtocolNameNode name = (GProtocolNameNode) this.proto.clone(); RoleNode role = (RoleNode) this.role.clone(); return AstFactoryImpl.FACTORY.GDelegationElem(this.source, name, role); } public GDelegationElem reconstruct(GProtocolNameNode proto, RoleNode role) { ScribDel del = del(); GDelegationElem elem = new GDelegationElem(this.source, proto, role); elem = (GDelegationElem) elem.del(del); return elem; } @Override public GDelegationElem visitChildren(AstVisitor nv) throws ScribbleException { GProtocolNameNode name = (GProtocolNameNode) visitChild(this.proto, nv); RoleNode role = (RoleNode) visitChild(this.role, nv); return reconstruct(name, role); } @Override public String toString() { return this.proto + "@" + this.role; } @Override public PayloadType<Local> toPayloadType() { return new GDelegationType(this.proto.toName(), this.role.toName()); } }