Source code for cmakelang.parse.funs

# pylint: disable=too-many-lines
"""
Statement parser functions
"""

import importlib
import logging

from cmakelang import lex
from cmakelang.parse.additional_nodes import ShellCommandNode
from cmakelang.parse.argument_nodes import (
    ConditionalGroupNode, StandardParser, StandardParser2
)
from cmakelang.parse.common import NodeType, KwargBreaker, TreeNode
from cmakelang.parse.util import (
    IMPLICIT_PARG_TYPES,
    WHITESPACE_TOKENS,
    get_first_semantic_token,
    get_normalized_kwarg,
    get_tag,
    should_break,
)
from cmakelang.parse.funs import standard_funs

logger = logging.getLogger(__name__)


[docs]def get_funtree(cmdspec): kwargs = {} for kwarg, subspec in cmdspec.kwargs.items(): if kwarg in ("if", "elseif", "while"): subparser = ConditionalGroupNode.parse elif kwarg == "COMMAND": subparser = ShellCommandNode.parse elif isinstance(subspec, (standard_funs.CommandSpec)): subparser = StandardParser2(subspec, get_funtree(subspec)) else: raise ValueError("Unexpected kwarg spec of type {}" .format(type(subspec))) kwargs[kwarg] = subparser return kwargs
SUBMODULE_NAMES = [ "add_executable", "add_library", "add_xxx", "deprecated", "break", "external_project", "fetch_content", "foreach", "file", "install", "list", "miscellaneous", "random", "set", "set_target_properties", ]
[docs]def get_parse_db(): """ Returns a dictionary mapping statement name to parse functor for that statement. """ parse_db = {} for subname in SUBMODULE_NAMES: submodule = importlib.import_module("cmakelang.parse.funs." + subname) submodule.populate_db(parse_db) for key in ( "if", "else", "elseif", "endif", "while", "endwhile"): parse_db[key] = ConditionalGroupNode.parse for key in ("function", "macro"): parse_db[key] = StandardParser("1+") for key in ("endfunction", "endmacro"): parse_db[key] = StandardParser("?") parse_db.update(get_funtree(standard_funs.get_fn_spec())) return parse_db