package org.scribble.parser.ast; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.NonRoleParamDecl; import org.scribble.ast.name.simple.NonRoleParamNode; import org.scribble.parser.AntlrConstants; import org.scribble.parser.ScribParser; import org.scribble.parser.ast.name.AntlrSimpleName; import org.scribble.sesstype.kind.DataTypeKind; import org.scribble.sesstype.kind.Kind; import org.scribble.sesstype.kind.NonRoleParamKind; import org.scribble.sesstype.kind.SigKind; public class AntlrNonRoleParamDecl { public static final int KIND_CHILD_INDEX = 0; public static final int NAME_CHILD_INDEX = 1; public static NonRoleParamDecl<? extends NonRoleParamKind> parseNonRoleParamDecl(ScribParser parser, CommonTree ct) { Kind kind = parseKind(getKindChild(ct)); if (kind.equals(SigKind.KIND)) { NonRoleParamNode<SigKind> name = AntlrSimpleName.toParamNode(SigKind.KIND, getNameChild(ct)); return AstFactoryImpl.FACTORY.NonRoleParamDecl(ct, SigKind.KIND, name); } else if (kind.equals(DataTypeKind.KIND)) { NonRoleParamNode<DataTypeKind> name = AntlrSimpleName.toParamNode(DataTypeKind.KIND, getNameChild(ct)); return AstFactoryImpl.FACTORY.NonRoleParamDecl(ct, DataTypeKind.KIND, name); } else { throw new RuntimeException("Shouldn't get in here: " + kind); } } private static Kind parseKind(CommonTree ct) { String kind = ct.getText(); switch (kind) { case AntlrConstants.KIND_MESSAGESIGNATURE: { return SigKind.KIND; } case AntlrConstants.KIND_PAYLOADTYPE: { return DataTypeKind.KIND; } default: { throw new RuntimeException("Unknown parameter declaration kind: " + kind); } } } public static CommonTree getKindChild(CommonTree ct) { return (CommonTree) ct.getChild(KIND_CHILD_INDEX); } public static CommonTree getNameChild(CommonTree ct) { return (CommonTree) ct.getChild(NAME_CHILD_INDEX); } }