<div dir="ltr">Hi Miklos,<br><br>This revision broke one of builders:<br><a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/7435">http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/7435</a><br><br>Please have a look at it.<br><br>Thanks<br><br>Galina <br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 21, 2016 at 12:48 PM, Miklos Vajna via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: vmiklos<br>
Date: Tue Jun 21 14:48:57 2016<br>
New Revision: 273304<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=273304&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=273304&view=rev</a><br>
Log:<br>
clang-rename: add a -old-name option<br>
<br>
This is similar to -offset with the following differences:<br>
<br>
1) -offset can refer to local variables as well.<br>
<br>
2) -old-name makes it easier to refer to e.g. ClassName::MemberName by<br>
spelling out the fully qualified name, instead of having to use e.g.<br>
grep to look up the exact offset.<br>
<br>
In other words, -offset is great when clang-rename is invoked by e.g. an<br>
IDE, but not really user-friendly when the tool is invoked by the user<br>
from commandline.  That's the use case where -old-name is supposed to<br>
improve the situation.<br>
<br>
Reviewers: klimek<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D21517" rel="noreferrer" target="_blank">http://reviews.llvm.org/D21517</a><br>
<br>
Added:<br>
    clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp<br>
Modified:<br>
    clang-tools-extra/trunk/clang-rename/USRFinder.cpp<br>
    clang-tools-extra/trunk/clang-rename/USRFinder.h<br>
    clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp<br>
    clang-tools-extra/trunk/clang-rename/USRFindingAction.h<br>
    clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp<br>
<br>
Modified: clang-tools-extra/trunk/clang-rename/USRFinder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFinder.cpp?rev=273304&r1=273303&r2=273304&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFinder.cpp?rev=273304&r1=273303&r2=273304&view=diff</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/clang-rename/USRFinder.cpp (original)<br>
+++ clang-tools-extra/trunk/clang-rename/USRFinder.cpp Tue Jun 21 14:48:57 2016<br>
@@ -40,6 +40,14 @@ public:<br>
         Point(Point) {<br>
   }<br>
<br>
+  // \brief Finds the NamedDecl for a name in the source.<br>
+  // \param Name the fully qualified name.<br>
+  explicit NamedDeclFindingASTVisitor(const SourceManager &SourceMgr,<br>
+                                      const std::string &Name)<br>
+      : Result(nullptr), SourceMgr(SourceMgr),<br>
+        Name(Name) {<br>
+  }<br>
+<br>
   // Declaration visitors:<br>
<br>
   // \brief Checks if the point falls within the NameDecl. This covers every<br>
@@ -93,9 +101,17 @@ private:<br>
   // \returns false on success.<br>
   bool setResult(const NamedDecl *Decl, SourceLocation Start,<br>
                  SourceLocation End) {<br>
-    if (!Start.isValid() || !Start.isFileID() || !End.isValid() ||<br>
-        !End.isFileID() || !isPointWithin(Start, End)) {<br>
-      return true;<br>
+    if (Name.empty()) {<br>
+      // Offset is used to find the declaration.<br>
+      if (!Start.isValid() || !Start.isFileID() || !End.isValid() ||<br>
+          !End.isFileID() || !isPointWithin(Start, End)) {<br>
+        return true;<br>
+      }<br>
+    } else {<br>
+      // Fully qualified name is used to find the declaration.<br>
+      if (Name != Decl->getQualifiedNameAsString()) {<br>
+        return true;<br>
+      }<br>
     }<br>
     Result = Decl;<br>
     return false;<br>
@@ -121,6 +137,7 @@ private:<br>
   const NamedDecl *Result;<br>
   const SourceManager &SourceMgr;<br>
   const SourceLocation Point; // The location to find the NamedDecl.<br>
+  const std::string Name;<br>
 };<br>
 }<br>
<br>
@@ -145,6 +162,22 @@ const NamedDecl *getNamedDeclAt(const AS<br>
     }<br>
   }<br>
<br>
+  return nullptr;<br>
+}<br>
+<br>
+const NamedDecl *getNamedDeclFor(const ASTContext &Context,<br>
+                                 const std::string &Name) {<br>
+  const auto &SourceMgr = Context.getSourceManager();<br>
+  NamedDeclFindingASTVisitor Visitor(SourceMgr, Name);<br>
+  auto Decls = Context.getTranslationUnitDecl()->decls();<br>
+<br>
+  for (auto &CurrDecl : Decls) {<br>
+    Visitor.TraverseDecl(CurrDecl);<br>
+    if (const NamedDecl *Result = Visitor.getNamedDecl()) {<br>
+      return Result;<br>
+    }<br>
+  }<br>
+<br>
   return nullptr;<br>
 }<br>
<br>
<br>
Modified: clang-tools-extra/trunk/clang-rename/USRFinder.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFinder.h?rev=273304&r1=273303&r2=273304&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFinder.h?rev=273304&r1=273303&r2=273304&view=diff</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/clang-rename/USRFinder.h (original)<br>
+++ clang-tools-extra/trunk/clang-rename/USRFinder.h Tue Jun 21 14:48:57 2016<br>
@@ -30,6 +30,12 @@ namespace rename {<br>
 const NamedDecl *getNamedDeclAt(const ASTContext &Context,<br>
                                 const SourceLocation Point);<br>
<br>
+// Given an AST context and a fully qualified name, returns a NamedDecl<br>
+// identifying the symbol with a matching name. Returns null if nothing is<br>
+// found for the name.<br>
+const NamedDecl *getNamedDeclFor(const ASTContext &Context,<br>
+                                 const std::string &Name);<br>
+<br>
 // Converts a Decl into a USR.<br>
 std::string getUSRForDecl(const Decl *Decl);<br>
<br>
<br>
Modified: clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp?rev=273304&r1=273303&r2=273304&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp?rev=273304&r1=273303&r2=273304&view=diff</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp (original)<br>
+++ clang-tools-extra/trunk/clang-rename/USRFindingAction.cpp Tue Jun 21 14:48:57 2016<br>
@@ -68,7 +68,12 @@ struct NamedDeclFindingConsumer : public<br>
         SourceMgr.getMainFileID()).getLocWithOffset(SymbolOffset);<br>
     if (!Point.isValid())<br>
       return;<br>
-    const NamedDecl *FoundDecl = getNamedDeclAt(Context, Point);<br>
+    const NamedDecl *FoundDecl = nullptr;<br>
+    if (OldName.empty()) {<br>
+      FoundDecl = getNamedDeclAt(Context, Point);<br>
+    } else {<br>
+      FoundDecl = getNamedDeclFor(Context, OldName);<br>
+    }<br>
     if (FoundDecl == nullptr) {<br>
       FullSourceLoc FullLoc(Point, SourceMgr);<br>
       errs() << "clang-rename: could not find symbol at "<br>
@@ -96,6 +101,7 @@ struct NamedDeclFindingConsumer : public<br>
   }<br>
<br>
   unsigned SymbolOffset;<br>
+  std::string OldName;<br>
   std::string *SpellingName;<br>
   std::vector<std::string> *USRs;<br>
 };<br>
@@ -106,6 +112,7 @@ USRFindingAction::newASTConsumer() {<br>
       new NamedDeclFindingConsumer);<br>
   SpellingName = "";<br>
   Consumer->SymbolOffset = SymbolOffset;<br>
+  Consumer->OldName = OldName;<br>
   Consumer->USRs = &USRs;<br>
   Consumer->SpellingName = &SpellingName;<br>
   return std::move(Consumer);<br>
<br>
Modified: clang-tools-extra/trunk/clang-rename/USRFindingAction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFindingAction.h?rev=273304&r1=273303&r2=273304&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRFindingAction.h?rev=273304&r1=273303&r2=273304&view=diff</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/clang-rename/USRFindingAction.h (original)<br>
+++ clang-tools-extra/trunk/clang-rename/USRFindingAction.h Tue Jun 21 14:48:57 2016<br>
@@ -25,7 +25,7 @@ class NamedDecl;<br>
 namespace rename {<br>
<br>
 struct USRFindingAction {<br>
-  USRFindingAction(unsigned Offset) : SymbolOffset(Offset) {<br>
+  USRFindingAction(unsigned Offset, const std::string &Name) : SymbolOffset(Offset), OldName(Name) {<br>
   }<br>
   std::unique_ptr<ASTConsumer> newASTConsumer();<br>
<br>
@@ -40,6 +40,7 @@ struct USRFindingAction {<br>
<br>
 private:<br>
   unsigned SymbolOffset;<br>
+  std::string OldName;<br>
   std::string SpellingName;<br>
   std::vector<std::string> USRs;<br>
 };<br>
<br>
Modified: clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp?rev=273304&r1=273303&r2=273304&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp?rev=273304&r1=273303&r2=273304&view=diff</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp (original)<br>
+++ clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp Tue Jun 21 14:48:57 2016<br>
@@ -52,6 +52,11 @@ SymbolOffset(<br>
     "offset",<br>
     cl::desc("Locates the symbol by offset as opposed to <line>:<column>."),<br>
     cl::cat(ClangRenameCategory));<br>
+static cl::opt<std::string><br>
+OldName(<br>
+    "old-name",<br>
+    cl::desc("The fully qualified name of the symbol, if -offset is not used."),<br>
+    cl::cat(ClangRenameCategory));<br>
 static cl::opt<bool><br>
 Inplace(<br>
     "i",<br>
@@ -96,7 +101,7 @@ int main(int argc, const char **argv) {<br>
   // Get the USRs.<br>
   auto Files = OP.getSourcePathList();<br>
   tooling::RefactoringTool Tool(OP.getCompilations(), Files);<br>
-  rename::USRFindingAction USRAction(SymbolOffset);<br>
+  rename::USRFindingAction USRAction(SymbolOffset, OldName);<br>
<br>
   // Find the USRs.<br>
   Tool.run(tooling::newFrontendActionFactory(&USRAction).get());<br>
<br>
Added: clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp?rev=273304&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp?rev=273304&view=auto</a><br>
==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp (added)<br>
+++ clang-tools-extra/trunk/test/clang-rename/ClassTestByName.cpp Tue Jun 21 14:48:57 2016<br>
@@ -0,0 +1,10 @@<br>
+// RUN: cat %s > %t.cpp<br>
+// RUN: clang-rename -old-name=Cla -new-name=Hector %t.cpp -i --<br>
+// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s<br>
+class Cla { // CHECK: class Hector<br>
+};<br>
+<br>
+int main() {<br>
+  Cla *Pointer = 0; // CHECK: Hector *Pointer = 0;<br>
+  return 0;<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>