8

我想使用 clang-tidy 'readability-identifier-naming' 模块来清理我的代码,但我未能在一个带有类属性和方法的简短示例中正确使用它。

我使用了以下 .clang-tidy 文件:

Checks: '-*,readability-identifier-naming'
CheckOptions:
  - { key: readability-identifier-naming.ClassCase,     value: CamelCase  }
  - { key: readability-identifier-naming.VariableCase,  value: lower_case }
  - { key: readability-identifier-naming.FunctionCase,  value: lower_case }
  - { key: readability-identifier-naming.MemberPrefix,  value: m_         }
  - { key: readability-identifier-naming.ParameterCase, value: lower_case }

在这段代码上:

class one_class
{
public:
    int OneMethod(int OneArgument);

    int OneAttribute;
};

int one_class::OneMethod(int OneArgument)
{
    OneAttribute = 42;
    return OneArgument + 1;
}

int main(void)
{
    int OneVariable = 0;

    one_class c;
    OneVariable = c.OneMethod(OneVariable);
    c.OneAttribute = 21;

    return 0;
}

结果是这段代码:

class OneClass
{
public:
    int one_method(int one_argument);

    int m_OneAttribute;
};

int OneClass::one_method(int one_argument)
{
    OneAttribute = 42; // must be m_OneAttribute =
    return one_argument + 1;
}

int main(void)
{
    int one_variable = 0;

    OneClass c;
    one_variable = c.OneMethod(one_variable); // must be c.one_method(...)
    c.OneAttribute = 21; // must be c.m_OneAttribute = ...

    return 0;
}

类方法 OneMethod() 的声明和定义已正确转换,但 main() 函数中的方法调用没有。类属性 OneAttribute 也是如此。生成的代码不再编译。

我用这个命令行调用了 clang-tidy:

clang-tidy-5.0  -checks='readability-identifier-naming'  -fix  test.cpp  --

我已经从 Ubuntu 16.04 上的软件包安装了 clang 5.0 和 clang 3.8。

我究竟做错了什么 ?

4

1 回答 1

7

你没有做错什么。clang-tidy只是由于某种原因不包括这种情况。它可能只是一个错误,但如果是的话,它似乎是一个非常明显的错误。

有趣的是clang-rename能正确地做这样的重命名,说明clang-tidy的失败并不是因为技术上的可行性。

可能值得在这里提交一个错误:https ://bugs.llvm.org/enter_bug.cgi?product=clang-tools-extra

虽然有一个相关的错误,你应该抄送自己,以便更多地关注这个问题

https://bugs.llvm.org/show_bug.cgi?id=41122

看起来它可能已在 2020-01 年修复:

https://bugs.llvm.org/show_bug.cgi?id=41122#c2

但这可能意味着 Clang 版本 < 11 将无法修复,除非它被向后移植。

于 2019-04-19T04:42:26.163 回答