5

用例

我想为readability-identifier-naming在我的代码库上运行的 clang-tidy 配置检查器。

背景

clang-tidy 中的检查器可以通过 CheckOptions 提供,例如:

    clang-tidy -checks='-*,readability-identifier-naming' \ 
    -config="{CheckOptions: [ {key: readability-identifier-naming.ClassCase, value: CamelCase} ]}" main.cpp 

也可以在 .clang-tidy 文件中指定选项。

问题

我在哪里可以找到可用选项列表(readability-identifier-naming在这种情况下进行检查),例如ClassCase上面的代码行?

官方文档不是很具体,只是说“可以使用许多配置选项,以便能够为不同类型的标识符创建不同的规则。”

谷歌搜索的结果

我在 github 上找到了这个页面,它更详细地解释了它(但仍然没有解决问题)。

我还在Microsoft 存储库的文件中找到了一个巨大的列表,但我不知道他们是从哪里得到的。

进一步的调查

我想,如果需要,clang-tidy 可能会丢弃所有可能的选项。如果你跑

    clang-tidy -checks=* --dump-config

(或者只指定readability-identifier-naming检查器。没关系,输出是一样的)

    clang-tidy -checks='-*,readability-identifier-naming --dump-config

转储文件仅包含一个关于可读性标识符命名的选项,即:

      - key:             readability-identifier-naming.IgnoreFailedSplit   
        value:           '0'

我也试图通过clang-tidy源代码,但没有成功。

毕竟

如果有人能指出一个包含所有可用 CheckOptions 列表的地方(如果存在),我将不胜感激。

4

2 回答 2

1

我在哪里可以找到可用选项列表(在这种情况下用于可读性标识符命名检查),例如上面代码行中的 ClassCase?

该列表已出现在您最初链接到此处的页面上。

我在 github 上找到了这个页面,它更详细地解释了它(但仍然没有解决问题)。

现在可以了!

于 2020-04-28T15:24:00.737 回答
0

The easiest way is to look into the source code of tests for this check here:

// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \
// RUN:   -config='{CheckOptions: [ \
// RUN:     {key: readability-identifier-naming.AbstractClassCase, value: CamelCase}, \
// RUN:     {key: readability-identifier-naming.AbstractClassPrefix, value: 'A'}, \
...etc.

This list is not guaranteed to be exhaustive since it's only a command used for testing. To really be sure you'll have to look into the source code of the check itself here and you'll find all the naming keys:

#define NAMING_KEYS(m) \
    m(Namespace) \
    m(InlineNamespace) \
    m(EnumConstant) \
    ...

These naming keys are then stringized to StylenaNames[]. Then look into the IdentifierNamingCheck::storeOptions() function:

  for (size_t i = 0; i < SK_Count; ++i) {
    Options.store(Opts, (StyleNames[i] + "Case").str(),
                  toString(NamingStyles[i].Case));
    Options.store(Opts, (StyleNames[i] + "Prefix").str(),
                  NamingStyles[i].Prefix);
    Options.store(Opts, (StyleNames[i] + "Suffix").str(),
                  NamingStyles[i].Suffix);
  }

and you'll see that each naming key concatenated with Case, Prefix or Suffix can be specified as an option. That gives you the definitive list of possible options for this check.

于 2019-01-18T13:48:29.440 回答