package org.scribble.ast;
import java.util.List;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.global.GChoice;
import org.scribble.ast.global.GConnect;
import org.scribble.ast.global.GContinue;
import org.scribble.ast.global.GDelegationElem;
import org.scribble.ast.global.GDisconnect;
import org.scribble.ast.global.GDo;
import org.scribble.ast.global.GInteractionNode;
import org.scribble.ast.global.GInteractionSeq;
import org.scribble.ast.global.GMessageTransfer;
import org.scribble.ast.global.GProtocolBlock;
import org.scribble.ast.global.GProtocolDecl;
import org.scribble.ast.global.GProtocolDef;
import org.scribble.ast.global.GProtocolHeader;
import org.scribble.ast.global.GRecursion;
import org.scribble.ast.global.GWrap;
import org.scribble.ast.local.LAccept;
import org.scribble.ast.local.LChoice;
import org.scribble.ast.local.LConnect;
import org.scribble.ast.local.LContinue;
import org.scribble.ast.local.LDelegationElem;
import org.scribble.ast.local.LDisconnect;
import org.scribble.ast.local.LDo;
import org.scribble.ast.local.LInteractionNode;
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.LProtocolHeader;
import org.scribble.ast.local.LReceive;
import org.scribble.ast.local.LRecursion;
import org.scribble.ast.local.LSend;
import org.scribble.ast.local.LWrapClient;
import org.scribble.ast.local.LWrapServer;
import org.scribble.ast.local.SelfRoleDecl;
import org.scribble.ast.name.NameNode;
import org.scribble.ast.name.PayloadElemNameNode;
import org.scribble.ast.name.qualified.DataTypeNode;
import org.scribble.ast.name.qualified.GProtocolNameNode;
import org.scribble.ast.name.qualified.LProtocolNameNode;
import org.scribble.ast.name.qualified.MessageSigNameNode;
import org.scribble.ast.name.qualified.ModuleNameNode;
import org.scribble.ast.name.qualified.QualifiedNameNode;
import org.scribble.ast.name.simple.AmbigNameNode;
import org.scribble.ast.name.simple.DummyProjectionRoleNode;
import org.scribble.ast.name.simple.NonRoleParamNode;
import org.scribble.ast.name.simple.OpNode;
import org.scribble.ast.name.simple.RecVarNode;
import org.scribble.ast.name.simple.RoleNode;
import org.scribble.sesstype.kind.Kind;
import org.scribble.sesstype.kind.NonRoleParamKind;
import org.scribble.sesstype.kind.PayloadTypeKind;
import org.scribble.sesstype.name.GProtocolName;
import org.scribble.sesstype.name.Role;
public interface AstFactory
{
Module Module(CommonTree source, ModuleDecl moddecl, List<ImportDecl<?>> imports, List<NonProtocolDecl<?>> data, List<ProtocolDecl<?>> protos);
MessageSigNode MessageSigNode(CommonTree source, OpNode op, PayloadElemList payload);
//PayloadElemList PayloadElemList(List<PayloadElem<?>> payloadelems);
PayloadElemList PayloadElemList(CommonTree source, List<PayloadElem<?>> payloadelems);
//PayloadElem PayloadElem(PayloadElemNameNode name);
//UnaryPayloadElem DataTypeElem(PayloadElemNameNode<DataTypeKind> name);
//UnaryPayloadElem UnaryPayloadElem(PayloadElemNameNode<?> name);
<K extends PayloadTypeKind> UnaryPayloadElem<K> UnaryPayloadElem(CommonTree source, PayloadElemNameNode<K> name);
GDelegationElem GDelegationElem(CommonTree source, GProtocolNameNode name, RoleNode role);
LDelegationElem LDelegationElem(CommonTree source, LProtocolNameNode name);
ModuleDecl ModuleDecl(CommonTree source, ModuleNameNode fullmodname);
ImportModule ImportModule(CommonTree source, ModuleNameNode modname, ModuleNameNode alias);
MessageSigNameDecl MessageSigNameDecl(CommonTree source, String schema, String extName, String extSource, MessageSigNameNode name);
DataTypeDecl DataTypeDecl(CommonTree source, String schema, String extName, String extSource, DataTypeNode name);
GProtocolDecl GProtocolDecl(CommonTree source, List<ProtocolDecl.Modifiers> modifiers, GProtocolHeader header, GProtocolDef def);
GProtocolHeader GProtocolHeader(CommonTree source, GProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls);
RoleDeclList RoleDeclList(CommonTree source, List<RoleDecl> rds);
RoleDecl RoleDecl(CommonTree source, RoleNode role);
//ConnectDecl ConnectDecl(CommonTree source, RoleNode src, RoleNode role);
NonRoleParamDeclList NonRoleParamDeclList(CommonTree source, List<NonRoleParamDecl<NonRoleParamKind>> pds);
<K extends NonRoleParamKind> NonRoleParamDecl<K> NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode<K> name);
GProtocolDef GProtocolDef(CommonTree source, GProtocolBlock block);
GProtocolBlock GProtocolBlock(CommonTree source, GInteractionSeq gis);
GInteractionSeq GInteractionSeq(CommonTree source, List<GInteractionNode> gis);
GMessageTransfer GMessageTransfer(CommonTree source, RoleNode src, MessageNode msg, List<RoleNode> dests);
GConnect GConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest);
//GConnect GConnect(CommonTree source, RoleNode src, RoleNode dest);
GDisconnect GDisconnect(CommonTree source, RoleNode src, RoleNode dest);
GWrap GWrap(CommonTree source, RoleNode src, RoleNode dest);
GChoice GChoice(CommonTree source, RoleNode subj, List<GProtocolBlock> blocks);
GRecursion GRecursion(CommonTree source, RecVarNode recvar, GProtocolBlock block);
GContinue GContinue(CommonTree source, RecVarNode recvar);
GDo GDo(CommonTree source, RoleArgList roles, NonRoleArgList args, GProtocolNameNode proto);
RoleArgList RoleArgList(CommonTree source, List<RoleArg> roles);
RoleArg RoleArg(CommonTree source, RoleNode role);
NonRoleArgList NonRoleArgList(CommonTree source, List<NonRoleArg> args);
NonRoleArg NonRoleArg(CommonTree source, NonRoleArgNode arg);
<K extends Kind> NameNode<K> SimpleNameNode(CommonTree source, K kind, String identifier);
<K extends Kind> QualifiedNameNode<K> QualifiedNameNode(CommonTree source, K kind, String... elems);
AmbigNameNode AmbiguousNameNode(CommonTree source, String identifier);
<K extends NonRoleParamKind> NonRoleParamNode<K> NonRoleParamNode(CommonTree source, K kind, String identifier);
DummyProjectionRoleNode DummyProjectionRoleNode();
LProtocolDecl LProtocolDecl(CommonTree source, List<ProtocolDecl.Modifiers> modifiers, LProtocolHeader header, LProtocolDef def);
LProtocolHeader LProtocolHeader(CommonTree source, LProtocolNameNode name, RoleDeclList roledecls, NonRoleParamDeclList paramdecls);
SelfRoleDecl SelfRoleDecl(CommonTree source, RoleNode namenode);
LProtocolDef LProtocolDef(CommonTree source, LProtocolBlock block);
LProtocolBlock LProtocolBlock(CommonTree source, LInteractionSeq seq);
LInteractionSeq LInteractionSeq(CommonTree source, List<LInteractionNode> actions);
LSend LSend(CommonTree source, RoleNode src, MessageNode msg, List<RoleNode> dests);
LReceive LReceive(CommonTree source, RoleNode src, MessageNode msg, List<RoleNode> dests);
LConnect LConnect(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest);
LAccept LAccept(CommonTree source, RoleNode src, MessageNode msg, RoleNode dest);
/*LConnect LConnect(CommonTree source, RoleNode src, RoleNode dest);
LAccept LAccept(CommonTree source, RoleNode src, RoleNode dest);*/
LDisconnect LDisconnect(CommonTree source, RoleNode self, RoleNode peer);
LWrapClient LWrapClient(CommonTree source, RoleNode self, RoleNode peer);
LWrapServer LWrapServer(CommonTree source, RoleNode self, RoleNode peer);
LChoice LChoice(CommonTree source, RoleNode subj, List<LProtocolBlock> blocks);
LRecursion LRecursion(CommonTree source, RecVarNode recvar, LProtocolBlock block);
LContinue LContinue(CommonTree source, RecVarNode recvar);
LDo LDo(CommonTree source, RoleArgList roles, NonRoleArgList args, LProtocolNameNode proto);
LProtocolDecl LProjectionDecl(CommonTree source, List<ProtocolDecl.Modifiers> modifiers, GProtocolName fullname, Role self, LProtocolHeader header, LProtocolDef def); // del extends that of LProtocolDecl
}