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 {};
 


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to