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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits