package org.scribble.ast;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.main.ScribbleException;
import org.scribble.sesstype.kind.ParamKind;
import org.scribble.sesstype.name.Role;
import org.scribble.visit.AstVisitor;
// RoleKind or (NonRole)ParamKind
public abstract class HeaderParamDeclList<K extends ParamKind> extends ScribNodeBase
{
private final List<? extends HeaderParamDecl<K>> decls;
protected HeaderParamDeclList(CommonTree source, List<? extends HeaderParamDecl<K>> decls)
{
super(source);
this.decls = new LinkedList<>(decls);
}
public abstract HeaderParamDeclList<K> reconstruct(List<? extends HeaderParamDecl<K>> decls);
@Override
public HeaderParamDeclList<? extends K> visitChildren(AstVisitor nv) throws ScribbleException
{
List<? extends HeaderParamDecl<K>> nds = visitChildListWithClassEqualityCheck(this, this.decls, nv);
return reconstruct(nds);
}
public List<? extends HeaderParamDecl<K>> getDecls()
{
return Collections.unmodifiableList(this.decls);
}
public abstract HeaderParamDeclList<K> project(Role self); // FIXME: move to delegate
public int length()
{
return this.decls.size();
}
public boolean isEmpty()
{
return this.decls.isEmpty();
}
// Without enclosing braces -- added by subclasses
@Override
public String toString()
{
return this.decls.stream().map((nd) -> nd.toString()).collect(Collectors.joining(", "));
}
}