Exemplo n.º 1
0
class ParseConfig(ConfigObject):
    """Options affecting listfile parsing"""

    _field_registry = []

    additional_commands = FieldDescriptor(
        ADDITIONAL_COMMANDS_DEMO,
        "Specify structure for custom cmake functions")

    override_spec = FieldDescriptor(
        {}, "Override configurations per-command where available")

    vartags = FieldDescriptor([], "Specify variable tags.")
    proptags = FieldDescriptor([], "Specify property tags.")

    def __init__(self, **kwargs):  # pylint: disable=W0613
        self.fn_spec = parse_util.CommandSpec("<root>")
        self.vartags_ = []
        self.proptags_ = []
        super(ParseConfig, self).__init__(**kwargs)

    def _update_derived(self):
        if self.additional_commands is not None:
            for command_name, spec in self.additional_commands.items():
                self.fn_spec.add(command_name, **spec)

        for pathkeystr, value in self.override_spec.items():
            parse_util.apply_overrides(self.fn_spec, pathkeystr, value)

        self.vartags_ = [(re.compile(pattern, re.IGNORECASE), tags)
                         for pattern, tags in BUILTIN_VARTAGS + self.vartags]
        self.proptags_ = [(re.compile(pattern, re.IGNORECASE), tags)
                          for pattern, tags in BUILTIN_PROPTAGS + self.proptags
                          ]
Exemplo n.º 2
0
class ParseConfig(ConfigObject):
  """Options affecting listfile parsing"""

  _field_registry = []

  additional_commands = FieldDescriptor(
      ADDITIONAL_COMMANDS_DEMO,
      "Specify structure for custom cmake functions"
  )

  vartags = FieldDescriptor([], "Specify variable tags.")
  proptags = FieldDescriptor([], "Specify property tags.")

  def _update_derived(self):
    if self.additional_commands is not None:
      for command_name, spec in self.additional_commands.items():
        self.fn_spec.add(command_name, **spec)

    self.vartags_ = [
        (re.compile(pattern, re.IGNORECASE), tags) for pattern, tags in
        BUILTIN_VARTAGS + self.vartags]
    self.proptags_ = [
        (re.compile(pattern, re.IGNORECASE), tags) for pattern, tags in
        BUILTIN_PROPTAGS + self.proptags]

  def __init__(self, **kwargs):  # pylint: disable=W0613
    self.fn_spec = commands.get_fn_spec()
    self.vartags_ = []
    self.proptags_ = []
    super(ParseConfig, self).__init__(**kwargs)
Exemplo n.º 3
0
class MarkupConfig(ConfigObject):
  """Options affecting comment reflow and formatting."""

  _field_registry = []

  bullet_char = FieldDescriptor(
      '*',
      "What character to use for bulleted lists"
  )

  enum_char = FieldDescriptor(
      '.',
      "What character to use as punctuation after numerals in an"
      " enumerated list"
  )
  first_comment_is_literal = FieldDescriptor(
      False,
      "If comment markup is enabled, don't reflow the first comment block"
      " in each listfile. Use this to preserve formatting of your"
      " copyright/license statements. "
  )
  literal_comment_pattern = FieldDescriptor(
      None,
      "If comment markup is enabled, don't reflow any comment block which"
      " matches this (regex) pattern. Default is `None` (disabled).",
  )
  fence_pattern = FieldDescriptor(
      markup.FENCE_PATTERN,
      "Regular expression to match preformat fences in comments"
      " default= ``r'{}'``".format(markup.FENCE_PATTERN)
  )
  ruler_pattern = FieldDescriptor(
      markup.RULER_PATTERN,
      "Regular expression to match rulers in comments default= ``r'{}'``"
      .format(markup.RULER_PATTERN)
  )
  explicit_trailing_pattern = FieldDescriptor(
      "#<",
      "If a comment line matches starts with this pattern then it is "
      "explicitly a trailing comment for the preceeding argument. Default "
      "is '#<'"
  )
  hashruler_min_length = FieldDescriptor(
      10,
      "If a comment line starts with at least this many consecutive hash "
      "characters, then don't lstrip() them off. This allows for lazy hash "
      "rulers where the first hash char is not separated by space"
  )
  canonicalize_hashrulers = FieldDescriptor(
      True,
      "If true, then insert a space between the first hash char and"
      " remaining hash chars in a hash ruler, and normalize its length to"
      " fill the column"
  )
  enable_markup = FieldDescriptor(
      True,
      "enable comment markup parsing and reflow"
  )
Exemplo n.º 4
0
class EncodingConfig(ConfigObject):
    """Options affecting file encoding"""

    _field_registry = []

    emit_byteorder_mark = FieldDescriptor(
        False,
        "If true, emit the unicode byte-order mark (BOM) at the start of"
        " the file")
    input_encoding = FieldDescriptor(
        "utf-8", "Specify the encoding of the input file. Defaults to utf-8")
    output_encoding = FieldDescriptor(
        "utf-8",
        "Specify the encoding of the output file. Defaults to utf-8. Note"
        " that cmake only claims to support utf-8 so be careful when using"
        " anything else")
Exemplo n.º 5
0
class MiscConfig(ConfigObject):
    """Miscellaneous configurations options."""

    _field_registry = []

    per_command = FieldDescriptor(
        {}, "A dictionary containing any per-command configuration overrides."
        " Currently only `command_case` is supported.")

    def _update_derived(self):
        self.per_command_ = standard_funs.get_default_config()
        for command, cdict in self.per_command.items():
            if not isinstance(cdict, dict):
                logging.warning("Invalid override of type %s for %s",
                                type(cdict), command)
                continue

            command = command.lower()
            if command not in self.per_command_:
                self.per_command_[command] = {}
            self.per_command_[command].update(cdict)

    def __init__(self, **kwargs):  # pylint: disable=W0613
        self.per_command_ = {}
        super(MiscConfig, self).__init__(**kwargs)
Exemplo n.º 6
0
class ParseConfig(ConfigObject):
    """Options affecting listfile parsing"""

    _field_registry = []

    additional_commands = FieldDescriptor(
        ADDITIONAL_COMMANDS_DEMO,
        "Specify structure for custom cmake functions")

    def _update_derived(self):
        if self.additional_commands is not None:
            for command_name, spec in self.additional_commands.items():
                self.fn_spec.add(command_name, **spec)

    def __init__(self, **kwargs):  # pylint: disable=W0613
        self.fn_spec = commands.get_fn_spec()
        super(ParseConfig, self).__init__(**kwargs)
Exemplo n.º 7
0
class LinterConfig(ConfigObject):
    """Options affecting the linter"""

    _field_registry = []

    disabled_codes = FieldDescriptor(
        [],
        "a list of lint codes to disable",
    )

    function_pattern = FieldDescriptor(
        "[0-9a-z_]+",
        "regular expression pattern describing valid function names")

    macro_pattern = FieldDescriptor(
        "[0-9A-Z_]+",
        "regular expression pattern describing valid macro names")

    global_var_pattern = FieldDescriptor(
        "[A-Z][0-9A-Z_]+",
        "regular expression pattern describing valid names for variables"
        " with global (cache) scope")

    internal_var_pattern = FieldDescriptor(
        "_[A-Z][0-9A-Z_]+",
        "regular expression pattern describing valid names for variables"
        " with global scope (but internal semantic)")

    local_var_pattern = FieldDescriptor(
        "[a-z][a-z0-9_]+",
        "regular expression pattern describing valid names for variables"
        " with local scope")

    private_var_pattern = FieldDescriptor(
        "_[0-9a-z_]+",
        "regular expression pattern describing valid names for private"
        "directory variables")

    public_var_pattern = FieldDescriptor(
        "[A-Z][0-9A-Z_]+",
        "regular expression pattern describing valid names for public"
        " directory variables")

    argument_var_pattern = FieldDescriptor(
        "[a-z][a-z0-9_]+",
        "regular expression pattern describing valid names for function/macro"
        " arguments and loop variables.")

    keyword_pattern = FieldDescriptor(
        "[A-Z][0-9A-Z_]+",
        "regular expression pattern describing valid names for keywords"
        " used in functions or macros")

    max_conditionals_custom_parser = FieldDescriptor(
        2, "In the heuristic for C0201, how many conditionals to match within"
        " a loop in before considering the loop a parser.")

    min_statement_spacing = FieldDescriptor(
        1, "Require at least this many newlines between statements")

    max_statement_spacing = FieldDescriptor(
        2, "Require no more than this many newlines between statements")

    max_returns = FieldDescriptor(6, )
    max_branches = FieldDescriptor(12, )
    max_arguments = FieldDescriptor(5, )
    max_localvars = FieldDescriptor(15, )
    max_statements = FieldDescriptor(50, )
Exemplo n.º 8
0
class FormattingConfig(ConfigObject):
    """Options affecting formatting."""

    _field_registry = []

    disable = FieldDescriptor(
        False, "Disable formatting entirely, making cmake-format a no-op")

    line_width = FieldDescriptor(80, "How wide to allow formatted cmake files")

    tab_size = FieldDescriptor(2, "How many spaces to tab for indent")

    max_subgroups_hwrap = FieldDescriptor(
        2, "If an argument group contains more than this many sub-groups "
        "(parg or kwarg groups) then force it to a vertical layout. ")

    max_pargs_hwrap = FieldDescriptor(
        6, "If a positional argument group contains more than this many"
        " arguments, then force it to a vertical layout. ")

    max_rows_cmdline = FieldDescriptor(
        2, "If a cmdline positional group consumes more than this many lines"
        " without nesting, then invalidate the layout (and nest)")

    separate_ctrl_name_with_space = FieldDescriptor(
        False,
        "If true, separate flow control names from their parentheses with a"
        " space")

    separate_fn_name_with_space = FieldDescriptor(
        False,
        "If true, separate function names from parentheses with a space")

    dangle_parens = FieldDescriptor(
        False,
        "If a statement is wrapped to more than one line, than dangle the"
        " closing parenthesis on its own line.")

    dangle_align = FieldDescriptor(
        "prefix",
        "If the trailing parenthesis must be 'dangled' on its on line, then"
        " align it to this reference: `prefix`: the start of the statement, "
        " `prefix-indent`: the start of the statement, plus one indentation "
        " level, `child`: align to the column of the arguments",
        ["prefix", "prefix-indent", "child", "off"],
    )

    min_prefix_chars = FieldDescriptor(
        4, "If the statement spelling length (including space and parenthesis)"
        " is smaller than this amount, then force reject nested layouts.")

    max_prefix_chars = FieldDescriptor(
        10,
        "If the statement spelling length (including space and parenthesis)"
        " is larger than the tab width by more than this amount, then"
        " force reject un-nested layouts.")

    max_lines_hwrap = FieldDescriptor(
        2, "If a candidate layout is wrapped horizontally but it exceeds this"
        " many lines, then reject the layout.")

    line_ending = FieldDescriptor(
        "unix", "What style line endings to use in the output.",
        ['windows', 'unix', 'auto'])

    command_case = FieldDescriptor(
        "canonical",
        "Format command names consistently as 'lower' or 'upper' case",
        ['lower', 'upper', 'canonical', 'unchanged'])

    keyword_case = FieldDescriptor(
        "unchanged", "Format keywords consistently as 'lower' or 'upper' case",
        ['lower', 'upper', 'unchanged'])

    always_wrap = FieldDescriptor(
        [], "A list of command names which should always be wrapped")

    enable_sort = FieldDescriptor(
        True,
        "If true, the argument lists which are known to be sortable will be "
        "sorted lexicographicall")

    autosort = FieldDescriptor(
        False,
        "If true, the parsers may infer whether or not an argument list is"
        " sortable (without annotation).")

    require_valid_layout = FieldDescriptor(
        False,
        "By default, if cmake-format cannot successfully fit everything into"
        " the desired linewidth it will apply the last, most agressive"
        " attempt that it made. If this flag is True, however, cmake-format"
        " will print error, exit with non-zero status code, and write-out"
        " nothing")

    layout_passes = FieldDescriptor(
        {},
        "A dictionary mapping layout nodes to a list of wrap decisions. See"
        " the documentation for more information.")

    def __init__(self, **kwargs):
        super(FormattingConfig, self).__init__(**kwargs)
        self.endl = None

    @property
    def linewidth(self):
        return self.line_width

    def set_line_ending(self, detected):
        self.endl = {"windows": "\r\n", "unix": "\n"}[detected]

    def _update_derived(self):
        """Update derived values after a potential config change
    """
        self.endl = {
            "windows": "\r\n",
            "unix": "\n",
            "auto": "\n"
        }[self.line_ending]