vmiklos created this revision.
vmiklos added a reviewer: klimek.
vmiklos added a subscriber: cfe-commits.

This is similar to -offset with the following differences:
    
1) -offset can refer to local variables as well.
    
2) -old-name makes it easier to refer to e.g. ClassName::MemberName by
spelling out the fully qualified name, instead of having to use e.g.
grep to look up the exact offset.
    
In other words, -offset is great when clang-rename is invoked by e.g. an
IDE, but not really user-friendly when the tool is invoked by the user
from commandline.  That's the use case where -old-name is supposed to
improve the situation.

http://reviews.llvm.org/D21517

Files:
  clang-rename/USRFinder.cpp
  clang-rename/USRFinder.h
  clang-rename/USRFindingAction.cpp
  clang-rename/USRFindingAction.h
  clang-rename/tool/ClangRename.cpp
  test/clang-rename/ClassTestByName.cpp

Index: test/clang-rename/ClassTestByName.cpp
===================================================================
--- /dev/null
+++ test/clang-rename/ClassTestByName.cpp
@@ -0,0 +1,10 @@
+// RUN: cat %s > %t.cpp
+// RUN: clang-rename -old-name=Cla -new-name=Hector %t.cpp -i --
+// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s
+class Cla { // CHECK: class Hector
+};
+
+int main() {
+  Cla *Pointer = 0; // CHECK: Hector *Pointer = 0;
+  return 0;
+}
Index: clang-rename/tool/ClangRename.cpp
===================================================================
--- clang-rename/tool/ClangRename.cpp
+++ clang-rename/tool/ClangRename.cpp
@@ -52,6 +52,11 @@
     "offset",
     cl::desc("Locates the symbol by offset as opposed to <line>:<column>."),
     cl::cat(ClangRenameCategory));
+static cl::opt<std::string>
+OldName(
+    "old-name",
+    cl::desc("The fully qualified name of the symbol, if -offset is not used."),
+    cl::cat(ClangRenameCategory));
 static cl::opt<bool>
 Inplace(
     "i",
@@ -96,7 +101,7 @@
   // Get the USRs.
   auto Files = OP.getSourcePathList();
   tooling::RefactoringTool Tool(OP.getCompilations(), Files);
-  rename::USRFindingAction USRAction(SymbolOffset);
+  rename::USRFindingAction USRAction(SymbolOffset, OldName);
 
   // Find the USRs.
   Tool.run(tooling::newFrontendActionFactory(&USRAction).get());
Index: clang-rename/USRFindingAction.h
===================================================================
--- clang-rename/USRFindingAction.h
+++ clang-rename/USRFindingAction.h
@@ -25,7 +25,7 @@
 namespace rename {
 
 struct USRFindingAction {
-  USRFindingAction(unsigned Offset) : SymbolOffset(Offset) {
+  USRFindingAction(unsigned Offset, const std::string &Name) : SymbolOffset(Offset), OldName(Name) {
   }
   std::unique_ptr<ASTConsumer> newASTConsumer();
 
@@ -40,6 +40,7 @@
 
 private:
   unsigned SymbolOffset;
+  std::string OldName;
   std::string SpellingName;
   std::vector<std::string> USRs;
 };
Index: clang-rename/USRFindingAction.cpp
===================================================================
--- clang-rename/USRFindingAction.cpp
+++ clang-rename/USRFindingAction.cpp
@@ -68,7 +68,7 @@
         SourceMgr.getMainFileID()).getLocWithOffset(SymbolOffset);
     if (!Point.isValid())
       return;
-    const NamedDecl *FoundDecl = getNamedDeclAt(Context, Point);
+    const NamedDecl *FoundDecl = getNamedDeclAt(Context, Point, OldName);
     if (FoundDecl == nullptr) {
       FullSourceLoc FullLoc(Point, SourceMgr);
       errs() << "clang-rename: could not find symbol at "
@@ -96,6 +96,7 @@
   }
 
   unsigned SymbolOffset;
+  std::string OldName;
   std::string *SpellingName;
   std::vector<std::string> *USRs;
 };
@@ -106,6 +107,7 @@
       new NamedDeclFindingConsumer);
   SpellingName = "";
   Consumer->SymbolOffset = SymbolOffset;
+  Consumer->OldName = OldName;
   Consumer->USRs = &USRs;
   Consumer->SpellingName = &SpellingName;
   return std::move(Consumer);
Index: clang-rename/USRFinder.h
===================================================================
--- clang-rename/USRFinder.h
+++ clang-rename/USRFinder.h
@@ -25,10 +25,12 @@
 
 namespace rename {
 
-// Given an AST context and a point, returns a NamedDecl identifying the symbol
-// at the point. Returns null if nothing is found at the point.
+// Given an AST context and a point (or fully qualified name), returns a
+// NamedDecl identifying the symbol at the point. Returns null if nothing is
+// found at the point.
 const NamedDecl *getNamedDeclAt(const ASTContext &Context,
-                                const SourceLocation Point);
+                                const SourceLocation Point,
+                                const std::string &Name);
 
 // Converts a Decl into a USR.
 std::string getUSRForDecl(const Decl *Decl);
Index: clang-rename/USRFinder.cpp
===================================================================
--- clang-rename/USRFinder.cpp
+++ clang-rename/USRFinder.cpp
@@ -35,9 +35,10 @@
   // \brief Finds the NamedDecl at a point in the source.
   // \param Point the location in the source to search for the NamedDecl.
   explicit NamedDeclFindingASTVisitor(const SourceManager &SourceMgr,
-                                      const SourceLocation Point)
+                                      const SourceLocation Point,
+                                      const std::string &Name)
       : Result(nullptr), SourceMgr(SourceMgr),
-        Point(Point) {
+        Point(Point), Name(Name) {
   }
 
   // Declaration visitors:
@@ -93,9 +94,17 @@
   // \returns false on success.
   bool setResult(const NamedDecl *Decl, SourceLocation Start,
                  SourceLocation End) {
-    if (!Start.isValid() || !Start.isFileID() || !End.isValid() ||
-        !End.isFileID() || !isPointWithin(Start, End)) {
-      return true;
+    if (Name.empty()) {
+      // Offset is used to find the declaration.
+      if (!Start.isValid() || !Start.isFileID() || !End.isValid() ||
+          !End.isFileID() || !isPointWithin(Start, End)) {
+        return true;
+      }
+    } else {
+      // Fully qualified name is used to find the declaration.
+      if (Name != Decl->getQualifiedNameAsString()) {
+        return true;
+      }
     }
     Result = Decl;
     return false;
@@ -121,15 +130,17 @@
   const NamedDecl *Result;
   const SourceManager &SourceMgr;
   const SourceLocation Point; // The location to find the NamedDecl.
+  const std::string &Name;
 };
 }
 
 const NamedDecl *getNamedDeclAt(const ASTContext &Context,
-                                const SourceLocation Point) {
+                                const SourceLocation Point,
+                                const std::string &Name) {
   const auto &SourceMgr = Context.getSourceManager();
   const auto SearchFile = SourceMgr.getFilename(Point);
 
-  NamedDeclFindingASTVisitor Visitor(SourceMgr, Point);
+  NamedDeclFindingASTVisitor Visitor(SourceMgr, Point, Name);
 
   // We only want to search the decls that exist in the same file as the point.
   auto Decls = Context.getTranslationUnitDecl()->decls();
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to