package org.scribble.ast;
import java.util.Collections;
import java.util.List;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.ProtocolKind;
import org.scribble.visit.AstVisitor;
// FIXME: visitChildren for modifiers
public abstract class ProtocolDecl<K extends ProtocolKind> extends ScribNodeBase implements ModuleMember, ProtocolKindNode<K>
{
public static enum Modifiers { EXPLICIT, AUX } // FIXME: factor out? Header?
// FIXME: lookup routines, e.g. isExplicit
public final List<Modifiers> modifiers;
// Maybe just use standard pattern, make private with casting getters -- works better (e.g. to use overridden getName)
public final ProtocolHeader<K> header;
public final ProtocolDef<K> def;
protected ProtocolDecl(CommonTree source, List<Modifiers> modifiers, ProtocolHeader<K> header, ProtocolDef<K> def)
{
super(source);
this.modifiers = Collections.unmodifiableList(modifiers);
this.header = header;
this.def = def;
}
public abstract ProtocolDecl<K> reconstruct(ProtocolHeader<K> header, ProtocolDef<K> def);//, ProtocolDeclContext pdcontext, Env env);
@Override
public ProtocolDecl<K> visitChildren(AstVisitor nv) throws ScribbleException
{
ProtocolHeader<K> header = visitChildWithClassEqualityCheck(this, this.header, nv);
ProtocolDef<K> def = visitChildWithClassEqualityCheck(this, this.def, nv);
return reconstruct(header, def);
}
public abstract ProtocolHeader<K> getHeader();
public abstract ProtocolDef<K> getDef();
//public abstract ProtocolName<? extends ProtocolKind> getFullProtocolName(Module mod);
@Override
public String toString()
{
return this.header + " " + this.def;
}
public boolean isExplicitModifier()
{
return this.modifiers.contains(Modifiers.EXPLICIT);
}
public boolean isAuxModifier()
{
return this.modifiers.contains(Modifiers.AUX);
}
}