[clang-tools-extra] r277356 - [clang-rename] handle overridden functions correctly
Kirill Bobyrev via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 1 10:15:57 PDT 2016
Author: omtcyfz
Date: Mon Aug 1 12:15:57 2016
New Revision: 277356
URL: http://llvm.org/viewvc/llvm-project?rev=277356&view=rev
Log:
[clang-rename] handle overridden functions correctly
1. Renaming overridden functions only works for two levels of "overriding
hierarchy". clang-rename should recursively add overridden methods.
2. Make use of forEachOverridden AST Matcher.
3. Fix two tests.
Reviewers: alexfh
Differential Revision: https://reviews.llvm.org/D23009
Added:
clang-tools-extra/trunk/test/clang-rename/FunctionOverride.cpp
Modified:
clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp
clang-tools-extra/trunk/test/clang-rename/FunctionWithClassFindByName.cpp
clang-tools-extra/trunk/test/clang-rename/UserDefinedConversion.cpp
Modified: clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp?rev=277356&r1=277355&r2=277356&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp (original)
+++ clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp Mon Aug 1 12:15:57 2016
@@ -54,7 +54,12 @@ public:
void Find() {
USRSet.insert(getUSRForDecl(FoundDecl));
- addUSRsFromOverrideSetsAndCtorDtors();
+ if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FoundDecl)) {
+ addUSRsFromOverrideSets(MethodDecl);
+ }
+ if (const auto *RecordDecl = dyn_cast<CXXRecordDecl>(FoundDecl)) {
+ addUSRsOfCtorDtors(RecordDecl);
+ }
addMatchers();
Finder.matchAST(Context);
USRs->insert(USRs->end(), USRSet.begin(), USRSet.end());
@@ -63,12 +68,11 @@ public:
private:
void addMatchers() {
const auto CXXMethodDeclMatcher =
- cxxMethodDecl(isVirtual()).bind("cxxMethodDecl");
+ cxxMethodDecl(forEachOverridden(cxxMethodDecl().bind("cxxMethodDecl")));
Finder.addMatcher(CXXMethodDeclMatcher, this);
}
- // FIXME: Implement hasOverriddenMethod and matchesUSR matchers to make
- // lookups more efficient.
+ // FIXME: Implement matchesUSR matchers to make lookups more efficient.
virtual void run(const MatchFinder::MatchResult &Result) {
const auto *VirtualMethod =
Result.Nodes.getNodeAs<CXXMethodDecl>("cxxMethodDecl");
@@ -83,20 +87,19 @@ private:
}
}
- void addUSRsFromOverrideSetsAndCtorDtors() {
- // If D is CXXRecordDecl we should add all USRs of its constructors.
- if (const auto *RecordDecl = dyn_cast<CXXRecordDecl>(FoundDecl)) {
- RecordDecl = RecordDecl->getDefinition();
- for (const auto *CtorDecl : RecordDecl->ctors()) {
- USRSet.insert(getUSRForDecl(CtorDecl));
- }
- USRSet.insert(getUSRForDecl(RecordDecl->getDestructor()));
+ void addUSRsOfCtorDtors(const CXXRecordDecl *RecordDecl) {
+ RecordDecl = RecordDecl->getDefinition();
+ for (const auto *CtorDecl : RecordDecl->ctors()) {
+ USRSet.insert(getUSRForDecl(CtorDecl));
}
- // If D is CXXMethodDecl we should add all USRs of its overriden methods.
- if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FoundDecl)) {
- for (auto &OverriddenMethod : MethodDecl->overridden_methods()) {
- USRSet.insert(getUSRForDecl(OverriddenMethod));
- }
+ USRSet.insert(getUSRForDecl(RecordDecl->getDestructor()));
+ }
+
+ void addUSRsFromOverrideSets(const CXXMethodDecl *MethodDecl) {
+ USRSet.insert(getUSRForDecl(MethodDecl));
+ for (auto &OverriddenMethod : MethodDecl->overridden_methods()) {
+ // Recursively visit each OverridenMethod.
+ addUSRsFromOverrideSets(OverriddenMethod);
}
}
Added: clang-tools-extra/trunk/test/clang-rename/FunctionOverride.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/FunctionOverride.cpp?rev=277356&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/FunctionOverride.cpp (added)
+++ clang-tools-extra/trunk/test/clang-rename/FunctionOverride.cpp Mon Aug 1 12:15:57 2016
@@ -0,0 +1,10 @@
+// RUN: cat %s > %t.cpp
+// RUN: clang-rename -offset=318 -new-name=bar %t.cpp -i --
+// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s
+
+class A { virtual void foo(); }; // CHECK: class A { virtual void bar(); };
+class B : public A { void foo(); }; // CHECK: class B : public A { void bar(); };
+class C : public B { void foo(); }; // CHECK: class C : public B { void bar(); };
+
+// Use grep -FUbo 'Foo' <file> to get the correct offset of Foo when changing
+// this file.
Modified: clang-tools-extra/trunk/test/clang-rename/FunctionWithClassFindByName.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/FunctionWithClassFindByName.cpp?rev=277356&r1=277355&r2=277356&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/FunctionWithClassFindByName.cpp (original)
+++ clang-tools-extra/trunk/test/clang-rename/FunctionWithClassFindByName.cpp Mon Aug 1 12:15:57 2016
@@ -1,4 +1,6 @@
-// RUN: clang-rename -old-name=Foo -new-name=Bar %s -- | FileCheck %s
+// RUN: cat %s > %t.cpp
+// RUN: clang-rename -old-name=Foo -new-name=Bar %t.cpp -i --
+// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s
void foo() {
}
Modified: clang-tools-extra/trunk/test/clang-rename/UserDefinedConversion.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/UserDefinedConversion.cpp?rev=277356&r1=277355&r2=277356&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/UserDefinedConversion.cpp (original)
+++ clang-tools-extra/trunk/test/clang-rename/UserDefinedConversion.cpp Mon Aug 1 12:15:57 2016
@@ -1,4 +1,6 @@
-// RUN: clang-rename -offset=143 -new-name=Bar %s -- | FileCheck %s
+// RUN: cat %s > %t.cpp
+// RUN: clang-rename -offset=205 -new-name=Bar %t.cpp -i --
+// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s
class Foo {}; // CHECK: class Bar {};
More information about the cfe-commits
mailing list