package org.scribble.ast;
import org.scribble.sesstype.kind.PayloadTypeKind;
import org.scribble.sesstype.name.PayloadType;
// Not in grammar file -- but cf. DoArg (and PayloadElemList cf. DoArgList) -- i.e. need a wrapper for mixed and initially ambiguous name kinds
//public abstract class PayloadElem<K extends PayloadTypeKind> extends ScribNodeBase
//public abstract class PayloadElem<T extends PayloadElemNameNode<?>> extends ScribNodeBase -- problem is GProtocolNameNode child isn't a payload kind, and anyway there's also a role node child
//public abstract class PayloadElem extends ScribNodeBase
//public interface PayloadElem extends ScribNode
public interface PayloadElem<K extends PayloadTypeKind> extends ScribNode
{
PayloadElem<K> project(); // Currently outside of visitor/env pattern (cf. MessageNode)
default boolean isGlobalDelegationElem()
{
return false;
}
default boolean isLocalDelegationElem()
{
return false;
}
/*public final PayloadElemNameNode<K> name; // Doesn't work for DelegationElem (Global@Role), name is global but payloadelem is local -- similar reason why not a NameNode, delegation doesn't fit -- would work for direct LProtocolNameNode elems though
public PayloadElem(PayloadElemNameNode<K> name)
{
this.name = name;
}*/
/*@Override
protected PayloadElem copy()
{
return new PayloadElem(this.name);
}
@Override
public PayloadElem clone()
{
PayloadElemNameNode name = (PayloadElemNameNode) this.name.clone();
return AstFactoryImpl.FACTORY.PayloadElem(name);
}*/
/*public PayloadElem reconstruct(PayloadElemNameNode name)
{
ScribDel del = del();
PayloadElem elem = new PayloadElem(name);
elem = (PayloadElem) elem.del(del);
return elem;
}
@Override
public PayloadElem visitChildren(AstVisitor nv) throws ScribbleException
{
PayloadElemNameNode name = (PayloadElemNameNode) visitChild(this.name, nv);
return reconstruct(name);
}*/
//public abstract PayloadType<?> toPayloadType();
public PayloadType<? extends PayloadTypeKind> toPayloadType(); // Mainly a wrapper method for the wrapped NameNode
/*public abstract Name<K> toName(); // Not deriving from Named/NameNode, delegation doesn't fit -- would need to make a special (Global@Role) name of Local kind
@Override
public String toString()
{
//return this.name.toString();
return toName().toString();
}*/
}