njames93 updated this revision to Diff 239167. njames93 marked 4 inline comments as done. njames93 added a comment.
- Added not type template test case Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D73052/new/ https://reviews.llvm.org/D73052 Files: clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp +++ clang-tools-extra/test/clang-tidy/checkers/readability-identifier-naming-member-decl-usage.cpp @@ -134,4 +134,86 @@ void foo() { Container<int, 5> container; } -}; // namespace CtorInits +} // namespace CtorInits + +namespace resolved_dependance { +template <typename T> +struct A0 { + int value; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for member 'value' + A0 &operator=(const A0 &Other) { + value = Other.value; // A0 + this->value = Other.value; // A0 + // CHECK-FIXES: {{^}} Value = Other.Value; // A0 + // CHECK-FIXES-NEXT: {{^}} this->Value = Other.Value; // A0 + return *this; + } + void outOfLineReset(); +}; + +template <typename T> +void A0<T>::outOfLineReset() { + this->value -= value; // A0 + // CHECK-FIXES: {{^}} this->Value -= Value; // A0 +} + +template <typename T> +struct A1 { + int value; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for member 'value' + A1 &operator=(const A1 &Other) { + value = Other.value; // A1 + this->value = Other.value; // A1 + // CHECK-FIXES: {{^}} Value = Other.Value; // A1 + // CHECK-FIXES-NEXT: {{^}} this->Value = Other.Value; // A1 + return *this; + } + void outOfLineReset(); +}; + +template <typename T> +void A1<T>::outOfLineReset() { + this->value -= value; // A1 + // CHECK-FIXES: {{^}} this->Value -= Value; // A1 +} + +template <unsigned T> +struct A2 { + int value; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for member 'value' + A2 &operator=(const A2 &Other) { + value = Other.value; // A2 + this->value = Other.value; // A2 + // CHECK-FIXES: {{^}} Value = Other.Value; // A2 + // CHECK-FIXES-NEXT: {{^}} this->Value = Other.Value; // A2 + return *this; + } +}; + +//create some instances to check it works +A1<int> AInt{}; +A1<int> BInt = (AInt.outOfLineReset(), AInt); +A1<unsigned> AUnsigned{}; +A1<unsigned> BUnsigned = AUnsigned; +} //namespace resolved_dependance + +namespace unresolved_dependance { +template <typename T> +struct DependentBase { + int depValue; + // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for member 'depValue' +}; + +template <typename T> +struct Derived : DependentBase<T> { + Derived &operator=(const Derived &Other) { + this->depValue = Other.depValue; + // CHECK-FIXES-NOT: {{^}} this->DepValue = Other.DepValue; + return *this; + } +}; + +Derived<int> AInt{}; +Derived<int> BInt = AInt; + +} //namespace unresolved_dependance Index: clang-tools-extra/docs/ReleaseNotes.rst =================================================================== --- clang-tools-extra/docs/ReleaseNotes.rst +++ clang-tools-extra/docs/ReleaseNotes.rst @@ -97,6 +97,11 @@ Changes in existing checks ^^^^^^^^^^^^^^^^^^^^^^^^^^ +- Improved :doc:'readability-identifier-naming + <clang-tidy/checks/readability-identifier-naming>` check. + + Now able to rename member references in class template definitions with + explicit access. Renamed checks ^^^^^^^^^^^^^^ Index: clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp +++ clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp @@ -106,20 +106,22 @@ this); Finder->addMatcher(typeLoc().bind("typeLoc"), this); Finder->addMatcher(nestedNameSpecifierLoc().bind("nestedNameLoc"), this); + auto MemberOrDependent = + expr(eachOf(memberExpr().bind("memberExpr"), + cxxDependentScopeMemberExpr().bind("depMemberExpr"))); Finder->addMatcher( functionDecl(unless(cxxMethodDecl(isImplicit())), - hasBody(forEachDescendant(memberExpr().bind("memberExpr")))), + hasBody(forEachDescendant(MemberOrDependent))), this); Finder->addMatcher( - cxxConstructorDecl( - unless(isImplicit()), - forEachConstructorInitializer( - allOf(isWritten(), withInitializer(forEachDescendant( - memberExpr().bind("memberExpr")))))), + cxxConstructorDecl(unless(isImplicit()), + forEachConstructorInitializer(allOf( + isWritten(), withInitializer(forEachDescendant( + MemberOrDependent))))), + this); + Finder->addMatcher( + fieldDecl(hasInClassInitializer(forEachDescendant(MemberOrDependent))), this); - Finder->addMatcher(fieldDecl(hasInClassInitializer( - forEachDescendant(memberExpr().bind("memberExpr")))), - this); } void RenamerClangTidyCheck::registerPPCallbacks( @@ -271,6 +273,29 @@ return; } + if (const auto *DepMemberRef = + Result.Nodes.getNodeAs<CXXDependentScopeMemberExpr>( + "depMemberExpr")) { + QualType BaseType = DepMemberRef->isArrow() + ? DepMemberRef->getBaseType()->getPointeeType() + : DepMemberRef->getBaseType(); + const CXXRecordDecl *Base = BaseType.getTypePtr()->getAsCXXRecordDecl(); + if (!Base) + return; + StringRef DependentName = DepMemberRef->getMemberNameInfo() + .getName() + .getAsIdentifierInfo() + ->getName(); + for (const FieldDecl *Field : Base->fields()) { + if (Field->getParent() == Base && + Field->getName().equals(DependentName)) { + SourceRange Range = DepMemberRef->getMemberNameInfo().getSourceRange(); + addUsage(NamingCheckFailures, Field, Range, Result.SourceManager); + break; + } + } + } + if (const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>("decl")) { if (!Decl->getIdentifier() || Decl->getName().empty() || Decl->isImplicit()) return;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits