示例#1
0
def parse_source_group(ctx, tokens, breakstack):
    """
  ::

    source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])
    source_group(TREE <root> [PREFIX <prefix>] [FILES <src>...])
    source_group(<name> <regex>)

  :see: https://cmake.org/cmake/help/latest/command/source_group.html
  """
    descriminator = get_nth_semantic_token(tokens, 0)
    if descriminator is not None and descriminator.spelling.upper() == "TREE":
        kwargs = {
            "PREFIX": PositionalParser(1),
            "FILES": PositionalParser("+")
        }
        return StandardArgTree.parse(ctx, tokens, 2, kwargs, [], breakstack)

    kwargs = {
        "FILES": PositionalParser("+"),
        "REGULAR_EXPRESSION": PositionalParser(1)
    }

    descriminator = get_nth_semantic_token(tokens, 1)
    if descriminator is not None and descriminator.spelling.upper(
    ) not in kwargs:
        return StandardArgTree.parse(ctx, tokens, 2, {}, [], breakstack)

    return StandardArgTree.parse(ctx, tokens, 1, kwargs, [], breakstack)
示例#2
0
def parse_build_command(ctx, tokens, breakstack):
    """
  ::

    build_command(<variable>
                  [CONFIGURATION <config>]
                  [TARGET <target>]
                  [PROJECT_NAME <projname>] # legacy, causes warning
                 )

  :see: https://cmake.org/cmake/help/latest/command/build_command.html
  """
    kwargs = {
        "CONFIGURATION": PositionalParser(1),
        "TARGET": PositionalParser(1),
        "PROJECT_NAME": PositionalParser(1)
    }

    second_token = get_nth_semantic_token(tokens, 1)
    if second_token is not None and second_token.spelling.upper not in kwargs:
        ctx.lint_ctx.record_lint(
            "W0106",
            "build_command(<cachevariable> <makecommand>)",
            location=tokens[0].get_location())
        return StandardArgTree.parse(ctx, tokens, "2", {}, [], breakstack)

    return StandardArgTree.parse(ctx, tokens, "1", kwargs, [], breakstack)
示例#3
0
def parse_get_filename_component(ctx, tokens, breakstack):
    """
  ::

      get_filename_component(<VAR> <FileName> <COMP> [CACHE])

      get_filename_component(<VAR> FileName
                             PROGRAM [PROGRAM_ARGS <ARG_VAR>]
                             [CACHE])

  :see: https://cmake.org/cmake/help/latest/command/get_filename_component.html
  """
    descriminator = get_nth_semantic_token(tokens, 2)
    if descriminator is not None and descriminator.spelling.upper(
    ) == "PROGRAM":
        flags = ["PROGRAM", "PROGRAM_ARGS", "CACHE"]
        return StandardArgTree.parse(ctx, tokens, "3+", {}, flags, breakstack)

    flags = [
        "DIRECTORY",
        "NAME",
        "EXT",
        "NAME_WE",
        "ABSOLUTE",
        "REALPATH",
        "PATH",
    ]
    return StandardArgTree.parse(ctx, tokens, "3+", {}, flags, breakstack)
示例#4
0
def parse_install_programs(ctx, tokens, breakstack):
  """
  ::

    install_programs(<dir> file1 file2 [file3 ...])
    install_programs(<dir> FILES file1 [file2 ...])
    install_programs(<dir> regexp)

  :see: https://cmake.org/cmake/help/latest/command/install_programs.html
  """
  second_token = get_nth_semantic_token(tokens, 1)
  third_token = get_nth_semantic_token(tokens, 2)

  if second_token is not None and second_token.spelling.upper() == "FILES":
    return StandardArgTree.parse(ctx, tokens, "3+", {}, ["FILES"], breakstack)

  if third_token is None:
    return StandardArgTree.parse(ctx, tokens, 2, {}, [], breakstack)

  return StandardArgTree.parse(ctx, tokens, "3+", {}, [], breakstack)
示例#5
0
def parse_cmake_parse_arguments(ctx, tokens, breakstack):
    """
  ::

  cmake_parse_arguments(<prefix> <options> <one_value_keywords>
                      <multi_value_keywords> <args>...)

  cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
                        <one_value_keywords> <multi_value_keywords>)

  :see: https://cmake.org/cmake/help/latest/command/cmake_parse_arguments.html
  """

    first_token = get_nth_semantic_token(tokens, 0)
    if first_token is not None and first_token.spelling.upper == "PARSE_ARGV":
        return StandardArgTree.parse(ctx, tokens, "6", {}, ["PARSE_ARGV"],
                                     breakstack)
    return StandardArgTree.parse(ctx, tokens, "5+", {}, [], breakstack)
示例#6
0
def parse_cmake_policy(ctx, tokens, breakstack):
    """
  ::

    cmake_policy(VERSION <min>[...<max>])
    cmake_policy(SET CMP<NNNN> NEW)
    cmake_policy(SET CMP<NNNN> OLD)
    cmake_policy(GET CMP<NNNN> <variable>)
    cmake_policy(PUSH)
    cmake_policy(POP)

  :see: https://cmake.org/cmake/help/latest/command/cmake_policy.html
  """
    first_token = get_nth_semantic_token(tokens, 0)
    if first_token is None:
        return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)

    if first_token.type is lexer.TokenType.DEREF:
        ctx.lint_ctx.record_lint("C0114", location=first_token.get_location())
        return StandardArgTree.parse(ctx, tokens, "+", {}, [], breakstack)

    descriminator = first_token.spelling.upper()
    if descriminator == "VERSION":
        return StandardArgTree.parse(ctx, tokens, "2+", {}, ["VERSION"],
                                     breakstack)

    if descriminator == "SET":
        return StandardArgTree.parse(ctx, tokens, 3, {}, ["SET", "OLD", "NEW"],
                                     breakstack)

    if descriminator == "GET":
        return StandardArgTree.parse(ctx, tokens, 3, {}, ["GET"], breakstack)

    if descriminator in ("PUSH", "POP"):
        return StandardArgTree.parse(ctx, tokens, 1, {}, ["PUSH", "POP"],
                                     breakstack)

    ctx.lint_ctx.record_lint("E1126", location=first_token.get_location())
    return StandardArgTree.parse(ctx, tokens, 1, {}, ["PUSH", "POP"],
                                 breakstack)