package org.scribble.ast; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.ast.name.simple.SimpleNameNode; import org.scribble.del.ScribDel; import org.scribble.sesstype.kind.DataTypeKind; import org.scribble.sesstype.kind.NonRoleParamKind; import org.scribble.sesstype.kind.SigKind; import org.scribble.sesstype.name.Role; public class NonRoleParamDecl<K extends NonRoleParamKind> extends HeaderParamDecl<K> { public final K kind; public NonRoleParamDecl(CommonTree source, K kind, NonRoleParamNode<K> name) { super(source, name); this.kind = kind; } @Override public NonRoleParamDecl<K> clone() { NonRoleParamNode<K> param = (NonRoleParamNode<K>) this.name.clone(); return AstFactoryImpl.FACTORY.NonRoleParamDecl(this.source, this.kind, param); } @Override public NonRoleParamDecl<K> reconstruct(SimpleNameNode<K> name) { ScribDel del = del(); NonRoleParamDecl<K> pd = new NonRoleParamDecl<>(this.source, this.kind, (NonRoleParamNode<K>) name); @SuppressWarnings("unchecked") NonRoleParamDecl<K> tmp = (NonRoleParamDecl<K>) pd.del(del); return tmp; } @Override protected NonRoleParamDecl<K> copy() { return new NonRoleParamDecl<>(this.source, this.kind, (NonRoleParamNode<K>) this.name); } @Override public NonRoleParamDecl<K> project(Role self) { NonRoleParamNode<K> pn = AstFactoryImpl.FACTORY.NonRoleParamNode(this.name.source, this.kind, this.name.toString()); return AstFactoryImpl.FACTORY.NonRoleParamDecl(this.source, this.kind, pn); } @Override public String getKeyword() { if (this.kind.equals(SigKind.KIND)) { return Constants.SIG_KW; } else if (this.kind.equals(DataTypeKind.KIND)) { return Constants.TYPE_KW; } else { throw new RuntimeException("Shouldn't get in here: " + this.kind); } } }