[clang-tools-extra] fb79ef5 - Fix readability-identifier-naming missing member variables
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 13 10:29:05 PST 2020
Author: Nathan James
Date: 2020-01-13T13:28:55-05:00
New Revision: fb79ef524171c96a9f3df025ac7a8a3e00fdc0b4
URL: https://github.com/llvm/llvm-project/commit/fb79ef524171c96a9f3df025ac7a8a3e00fdc0b4
DIFF: https://github.com/llvm/llvm-project/commit/fb79ef524171c96a9f3df025ac7a8a3e00fdc0b4.diff
LOG: Fix readability-identifier-naming missing member variables
Fixes PR41122 (missing fixes for member variables in a destructor) and
PR29005 (does not rename class members in all locations).
Added:
clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp
Modified:
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index bd736743ae1c..8146cb36cf21 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -237,10 +237,26 @@ void IdentifierNamingCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(namedDecl().bind("decl"), this);
Finder->addMatcher(usingDecl().bind("using"), this);
Finder->addMatcher(declRefExpr().bind("declRef"), this);
- Finder->addMatcher(cxxConstructorDecl().bind("classRef"), this);
- Finder->addMatcher(cxxDestructorDecl().bind("classRef"), this);
+ Finder->addMatcher(cxxConstructorDecl(unless(isImplicit())).bind("classRef"),
+ this);
+ Finder->addMatcher(cxxDestructorDecl(unless(isImplicit())).bind("classRef"),
+ this);
Finder->addMatcher(typeLoc().bind("typeLoc"), this);
Finder->addMatcher(nestedNameSpecifierLoc().bind("nestedNameLoc"), this);
+ Finder->addMatcher(
+ functionDecl(unless(cxxMethodDecl(isImplicit())),
+ hasBody(forEachDescendant(memberExpr().bind("memberExpr")))),
+ this);
+ Finder->addMatcher(
+ cxxConstructorDecl(
+ unless(isImplicit()),
+ forEachConstructorInitializer(
+ allOf(isWritten(), withInitializer(forEachDescendant(
+ memberExpr().bind("memberExpr")))))),
+ this);
+ Finder->addMatcher(fieldDecl(hasInClassInitializer(
+ forEachDescendant(memberExpr().bind("memberExpr")))),
+ this);
}
void IdentifierNamingCheck::registerPPCallbacks(
@@ -710,8 +726,6 @@ static void addUsage(IdentifierNamingCheck::NamingCheckFailureMap &Failures,
void IdentifierNamingCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *Decl =
Result.Nodes.getNodeAs<CXXConstructorDecl>("classRef")) {
- if (Decl->isImplicit())
- return;
addUsage(NamingCheckFailures, Decl->getParent(),
Decl->getNameInfo().getSourceRange());
@@ -730,8 +744,6 @@ void IdentifierNamingCheck::check(const MatchFinder::MatchResult &Result) {
if (const auto *Decl =
Result.Nodes.getNodeAs<CXXDestructorDecl>("classRef")) {
- if (Decl->isImplicit())
- return;
SourceRange Range = Decl->getNameInfo().getSourceRange();
if (Range.getBegin().isInvalid())
@@ -806,6 +818,14 @@ void IdentifierNamingCheck::check(const MatchFinder::MatchResult &Result) {
return;
}
+ if (const auto *MemberRef =
+ Result.Nodes.getNodeAs<MemberExpr>("memberExpr")) {
+ SourceRange Range = MemberRef->getMemberNameInfo().getSourceRange();
+ addUsage(NamingCheckFailures, MemberRef->getMemberDecl(), Range,
+ Result.SourceManager);
+ return;
+ }
+
if (const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>("decl")) {
if (!Decl->getIdentifier() || Decl->getName().empty() || Decl->isImplicit())
return;
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp
new file mode 100644
index 000000000000..caffc3283ca2
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp
@@ -0,0 +1,137 @@
+// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \
+// RUN: -config='{CheckOptions: [ \
+// RUN: {key: readability-identifier-naming.MemberCase, value: CamelCase}, \
+// RUN: {key: readability-identifier-naming.ParameterCase, value: CamelCase} \
+// RUN: ]}'
+
+int set_up(int);
+int clear(int);
+
+class Foo {
+public:
+ const int bar_baz; // comment-0
+ // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: invalid case style for member 'bar_baz'
+ // CHECK-FIXES: {{^}} const int BarBaz; // comment-0
+
+ Foo(int Val) : bar_baz(Val) { // comment-1
+ // CHECK-FIXES: {{^}} Foo(int Val) : BarBaz(Val) { // comment-1
+ set_up(bar_baz); // comment-2
+ // CHECK-FIXES: {{^}} set_up(BarBaz); // comment-2
+ }
+
+ Foo() : Foo(0) {}
+
+ ~Foo() {
+ clear(bar_baz); // comment-3
+ // CHECK-FIXES: {{^}} clear(BarBaz); // comment-3
+ }
+
+ int getBar() const { return bar_baz; } // comment-4
+ // CHECK-FIXES: {{^}} int getBar() const { return BarBaz; } // comment-4
+};
+
+class FooBar : public Foo {
+public:
+ int getFancyBar() const {
+ return this->bar_baz; // comment-5
+ // CHECK-FIXES: {{^}} return this->BarBaz; // comment-5
+ }
+};
+
+int getBar(const Foo &Foo) {
+ return Foo.bar_baz; // comment-6
+ // CHECK-FIXES: {{^}} return Foo.BarBaz; // comment-6
+}
+
+int getBar(const FooBar &Foobar) {
+ return Foobar.bar_baz; // comment-7
+ // CHECK-FIXES: {{^}} return Foobar.BarBaz; // comment-7
+}
+
+int getFancyBar(const FooBar &Foobar) {
+ return Foobar.getFancyBar();
+}
+
+template <typename Dummy>
+class TempTest : public Foo {
+public:
+ TempTest() = default;
+ TempTest(int Val) : Foo(Val) {}
+ int getBar() const { return Foo::bar_baz; } // comment-8
+ // CHECK-FIXES: {{^}} int getBar() const { return Foo::BarBaz; } // comment-8
+ int getBar2() const { return this->bar_baz; } // comment-9
+ // CHECK-FIXES: {{^}} int getBar2() const { return this->BarBaz; } // comment-9
+};
+
+TempTest<int> x; //force an instantiation
+
+int blah() {
+ return x.getBar2(); // gotta have a reference to the getBar2 so that the
+ // compiler will generate the function and resolve
+ // the DependantScopeMemberExpr
+}
+
+namespace Bug41122 {
+namespace std {
+
+// for this example we aren't bothered about how std::vector is treated
+template <typename T> //NOLINT
+class vector { //NOLINT
+public:
+ void push_back(bool); //NOLINT
+ void pop_back(); //NOLINT
+}; //NOLINT
+}; // namespace std
+
+class Foo {
+ std::vector<bool> &stack;
+ // CHECK-MESSAGES: :[[@LINE-1]]:22: warning: invalid case style for member 'stack' [readability-identifier-naming]
+public:
+ Foo(std::vector<bool> &stack)
+ // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: invalid case style for parameter 'stack' [readability-identifier-naming]
+ // CHECK-FIXES: {{^}} Foo(std::vector<bool> &Stack)
+ : stack(stack) {
+ // CHECK-FIXES: {{^}} : Stack(Stack) {
+ stack.push_back(true);
+ // CHECK-FIXES: {{^}} Stack.push_back(true);
+ }
+ ~Foo() {
+ stack.pop_back();
+ // CHECK-FIXES: {{^}} Stack.pop_back();
+ }
+};
+}; // namespace Bug41122
+
+namespace Bug29005 {
+class Foo {
+public:
+ int a_member_of_foo = 0;
+ // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for member 'a_member_of_foo'
+ // CHECK-FIXES: {{^}} int AMemberOfFoo = 0;
+};
+
+int main() {
+ Foo foo;
+ return foo.a_member_of_foo;
+ // CHECK-FIXES: {{^}} return foo.AMemberOfFoo;
+}
+}; // namespace Bug29005
+
+namespace CtorInits {
+template <typename T, unsigned N>
+class Container {
+ T storage[N];
+ // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for member 'storage'
+ // CHECK-FIXES: {{^}} T Storage[N];
+ T *pointer = &storage[0];
+ // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: invalid case style for member 'pointer'
+ // CHECK-FIXES: {{^}} T *Pointer = &Storage[0];
+public:
+ Container() : pointer(&storage[0]) {}
+ // CHECK-FIXES: {{^}} Container() : Pointer(&Storage[0]) {}
+};
+
+void foo() {
+ Container<int, 5> container;
+}
+}; // namespace CtorInits
More information about the cfe-commits
mailing list