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.del.ScribDel; import org.scribble.main.ScribbleException; import org.scribble.sesstype.Payload; import org.scribble.sesstype.name.PayloadType; import org.scribble.util.ScribUtil; import org.scribble.visit.AstVisitor; // Cf. DoArgList, but here we don't need as much abstraction (cf. RoleArgList, NonRoleArgList) public class PayloadElemList extends ScribNodeBase { //private final List<PayloadElem> elems; // FIXME: parameterise on Kind (cf. sesstypes) private final List<PayloadElem<?>> elems; //public PayloadElemList(List<PayloadElem> elems) public PayloadElemList(CommonTree source, List<PayloadElem<?>> elems) { super(source); this.elems = new LinkedList<>(elems); } protected PayloadElemList project() { return AstFactoryImpl.FACTORY.PayloadElemList(this.source, this.elems.stream().map((pe) -> pe.project()).collect(Collectors.toList())); } @Override protected PayloadElemList copy() { return new PayloadElemList(this.source, this.elems); } @Override public PayloadElemList clone() { //List<PayloadElem> elems = ScribUtil.cloneList(this.elems); List<PayloadElem<?>> elems = ScribUtil.cloneList(this.elems); return AstFactoryImpl.FACTORY.PayloadElemList(this.source, elems); } //protected PayloadElemList reconstruct(List<PayloadElem> elems) protected PayloadElemList reconstruct(List<PayloadElem<?>> elems) { ScribDel del = del(); PayloadElemList pel = new PayloadElemList(this.source, elems); pel = (PayloadElemList) pel.del(del); return pel; } @Override public PayloadElemList visitChildren(AstVisitor nv) throws ScribbleException { //List<PayloadElem> elems = visitChildListWithClassEqualityCheck(this, this.elems, nv); List<PayloadElem<?>> elems = visitChildListWithClassEqualityCheck(this, this.elems, nv); return reconstruct(elems); } //public List<PayloadElem> getElements() public List<PayloadElem<?>> getElements() { return Collections.unmodifiableList(this.elems); } public Payload toPayload() { //List<PayloadType<?>> pts = this.elems.stream().map((pe) -> pe.name.toPayloadType()).collect(Collectors.toList()); List<PayloadType<?>> pts = this.elems.stream().map((pe) -> pe.toPayloadType()).collect(Collectors.toList()); return new Payload(pts); } public boolean isEmpty() { return this.elems.isEmpty(); } @Override public String toString() { return "(" + this.elems.stream().map((pe) -> pe.toString()).collect(Collectors.joining(", " )) + ")"; } }