package org.scribble.ast.global;
import java.util.List;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.Module;
import org.scribble.ast.NonRoleParamDeclList;
import org.scribble.ast.ProtocolDecl;
import org.scribble.ast.ProtocolDef;
import org.scribble.ast.ProtocolHeader;
import org.scribble.ast.RoleDeclList;
import org.scribble.ast.local.LProtocolDecl;
import org.scribble.ast.local.LProtocolDef;
import org.scribble.ast.local.LProtocolHeader;
import org.scribble.ast.name.qualified.LProtocolNameNode;
import org.scribble.del.ScribDel;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.Global;
import org.scribble.sesstype.name.GProtocolName;
import org.scribble.sesstype.name.ModuleName;
import org.scribble.sesstype.name.Role;
import org.scribble.visit.context.Projector;
public class GProtocolDecl extends ProtocolDecl<Global> implements GNode
{
public GProtocolDecl(CommonTree source, List<Modifiers> modifiers, GProtocolHeader header, GProtocolDef def)
{
super(source, modifiers, header, def);
}
// FIXME? project modifiers?
public LProtocolDecl project(Module mod, Role self, LProtocolDef def) throws ScribbleException // mod is just the parent?
{
//Role self = proj.peekSelf();
GProtocolHeader gph = getHeader();
LProtocolNameNode pn = Projector.makeProjectedSimpleNameNode(gph.getSource(), gph.getDeclName(), self);
// Move to delegates? -- maybe fully integrate into projection pass
RoleDeclList roledecls = this.header.roledecls.project(self);
NonRoleParamDeclList paramdecls = this.header.paramdecls.project(self);
LProtocolHeader lph = AstFactoryImpl.FACTORY.LProtocolHeader(this.header.getSource(), pn, roledecls, paramdecls);
GProtocolName gpn = this.getFullMemberName(mod);
LProtocolDecl projected = AstFactoryImpl.FACTORY.LProjectionDecl(this.source, this.modifiers, gpn, self, lph, def);
return projected;
}
@Override
protected GProtocolDecl copy()
{
return new GProtocolDecl(this.source, this.modifiers, getHeader(), getDef());
}
@Override
public GProtocolDecl clone()
{
GProtocolHeader header = getHeader().clone();
GProtocolDef def = getDef().clone();
return AstFactoryImpl.FACTORY.GProtocolDecl(this.source, this.modifiers, header, def);
}
@Override
public GProtocolDecl reconstruct(ProtocolHeader<Global> header, ProtocolDef<Global> def)
{
ScribDel del = del();
GProtocolDecl gpd = new GProtocolDecl(this.source, this.modifiers, (GProtocolHeader) header, (GProtocolDef) def);
gpd = (GProtocolDecl) gpd.del(del); // FIXME: does another shallow copy
return gpd;
}
@Override
public GProtocolHeader getHeader()
{
return (GProtocolHeader) this.header;
}
@Override
public GProtocolDef getDef()
{
return (GProtocolDef) this.def;
}
@Override
public GProtocolName getFullMemberName(Module mod)
{
ModuleName fullmodname = mod.getFullModuleName();
return new GProtocolName(fullmodname, this.header.getDeclName());
}
// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350
@Override
public boolean isGlobal()
{
return GNode.super.isGlobal();
}
// FIXME: shouldn't be needed, but here due to Eclipse bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350
@Override
public Global getKind()
{
return GNode.super.getKind();
}
}