package org.scribble.parser.ast; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.ImportDecl; import org.scribble.ast.Module; import org.scribble.ast.ModuleDecl; import org.scribble.ast.NonProtocolDecl; import org.scribble.ast.ProtocolDecl; import org.scribble.parser.AntlrConstants.AntlrNodeType; import org.scribble.parser.ScribParser; import org.scribble.parser.util.ScribParserUtil; import org.scribble.util.ScribParserException; public class AntlrModule { public static final int MODULEDECL_CHILD_INDEX = 0; public static Module parseModule(ScribParser parser, CommonTree ct) throws ScribParserException { ModuleDecl md = (ModuleDecl) parser.parse(getModuleDeclChild(ct)); List<ImportDecl<?>> ids = new LinkedList<>(); List<NonProtocolDecl<?>> ptds = new LinkedList<>(); List<ProtocolDecl<?>> pds = new LinkedList<>(); for (CommonTree id : getImportDeclChildren(ct)) { ImportDecl<?> tmp = (ImportDecl<?>) parser.parse(id); ids.add(tmp); } for (CommonTree ptd : getDataTypeDeclChildren(ct)) { NonProtocolDecl<?> tmp = (NonProtocolDecl<?>) parser.parse(ptd); ptds.add(tmp); } for (CommonTree pd : getProtocolDeclChildren(ct)) { ProtocolDecl<?> tmp = (ProtocolDecl<?>) parser.parse(pd); pds.add(tmp); } return AstFactoryImpl.FACTORY.Module(ct, md, ids, ptds, pds); } public static CommonTree getModuleDeclChild(CommonTree ct) { return (CommonTree) ct.getChild(MODULEDECL_CHILD_INDEX); } public static List<CommonTree> getImportDeclChildren(CommonTree ct) { return filterChildren(ct, AntlrNodeType.IMPORTMODULE, AntlrNodeType.IMPORTMEMBER); } public static List<CommonTree> getDataTypeDeclChildren(CommonTree ct) { return filterChildren(ct, AntlrNodeType.PAYLOADTYPEDECL, AntlrNodeType.MESSAGESIGNATUREDECL); } public static List<CommonTree> getProtocolDeclChildren(CommonTree ct) { return filterChildren(ct, AntlrNodeType.GLOBALPROTOCOLDECL, AntlrNodeType.LOCALPROTOCOLDECL); } private static List<CommonTree> filterChildren(CommonTree ct, AntlrNodeType... types) { List<AntlrNodeType> tmp = Arrays.asList(types); List<CommonTree> children = ScribParserUtil.toCommonTreeList(ct.getChildren()); return children.subList(1, children.size()).stream() .filter((c) -> tmp.contains(ScribParserUtil.getAntlrNodeType(c))).collect(Collectors.toList()); } }