package org.scribble.parser.ast;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.antlr.runtime.tree.CommonTree;
import org.scribble.ast.AstFactoryImpl;
import org.scribble.ast.PayloadElem;
import org.scribble.ast.PayloadElemList;
import org.scribble.ast.name.qualified.DataTypeNode;
import org.scribble.ast.name.qualified.GProtocolNameNode;
import org.scribble.ast.name.simple.AmbigNameNode;
import org.scribble.ast.name.simple.RoleNode;
import org.scribble.parser.AntlrConstants.AntlrNodeType;
import org.scribble.parser.ScribParser;
import org.scribble.parser.ast.name.AntlrAmbigName;
import org.scribble.parser.ast.name.AntlrQualifiedName;
import org.scribble.parser.ast.name.AntlrSimpleName;
import org.scribble.parser.util.ScribParserUtil;
public class AntlrPayloadElemList
{
// Cf. AntlrNonRoleArgList
public static PayloadElemList parsePayloadElemList(ScribParser parser, CommonTree ct)
{
// As in AntlrNonRoleArgList, i.e. payloadelem (NonRoleArg) not directly parsed -- cf. rolearg and nonroleparamdecl, which are directly parsed (not consistent), due to amibgious names
//List<PayloadElem> pes = getPayloadElements(ct).stream().map((pe) -> parsePayloadElem(pe)).collect(Collectors.toList());
List<PayloadElem<?>> pes = getPayloadElements(ct).stream().map((pe) -> parsePayloadElem(pe)).collect(Collectors.toList());
return AstFactoryImpl.FACTORY.PayloadElemList(ct, pes);
}
//private static PayloadElem parsePayloadElem(CommonTree ct)
private static PayloadElem<?> parsePayloadElem(CommonTree ct)
{
AntlrNodeType type = ScribParserUtil.getAntlrNodeType(ct);
/*// Parser isn't working to distinguish simple from qualified names (cf. Scribble.g payloadelement)
if (type == AntlrNodeType.QUALIFIEDNAME)
{
DataTypeNameNode dt = AntlrQualifiedName.toDataTypeNameNode(ct);
return AstFactoryImpl.FACTORY.PayloadElement(dt);
}
else if (type == AntlrNodeType.AMBIGUOUSNAME)
{
// Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode
AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct);
return AstFactoryImpl.FACTORY.PayloadElement(an);
}*/
if (type == AntlrNodeType.DELEGATION)
{
RoleNode rn = AntlrSimpleName.toRoleNode((CommonTree) ct.getChild(0));
//GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1)); // FIXME:
GProtocolNameNode gpnn = AntlrQualifiedName.toGProtocolNameNode((CommonTree) ct.getChild(1));
return AstFactoryImpl.FACTORY.GDelegationElem(ct, gpnn, rn);
//throw new RuntimeException("Shouldn't get in here: " + ct);
}
else if (type == AntlrNodeType.QUALIFIEDNAME)
{
if (ct.getChildCount() > 1)
{
DataTypeNode dt = AntlrQualifiedName.toDataTypeNameNode(ct);
//return AstFactoryImpl.FACTORY.PayloadElem(dt);
return AstFactoryImpl.FACTORY.UnaryPayloadElem(ct, dt); // return and dt share same ct in this case
}
else
{
// Similarly to NonRoleArg: cannot syntactically distinguish right now between SimplePayloadTypeNode and ParameterNode
AmbigNameNode an = AntlrAmbigName.toAmbigNameNode(ct);
return AstFactoryImpl.FACTORY.UnaryPayloadElem(ct, an);
}
}
else
{
throw new RuntimeException("Shouldn't get in here: " + ct);
}
}
public static final List<CommonTree> getPayloadElements(CommonTree ct)
{
return (ct.getChildCount() == 0)
? Collections.emptyList()
: ScribParserUtil.toCommonTreeList(ct.getChildren());
}
}