diff options
| -rw-r--r-- | clang-tools-extra/clang-rename/RenamingAction.cpp | 2 | ||||
| -rw-r--r-- | clang-tools-extra/clang-rename/USRLocFinder.cpp | 20 | ||||
| -rw-r--r-- | clang-tools-extra/clang-rename/USRLocFinder.h | 5 | 
3 files changed, 20 insertions, 7 deletions
diff --git a/clang-tools-extra/clang-rename/RenamingAction.cpp b/clang-tools-extra/clang-rename/RenamingAction.cpp index 2c924c7000c..ac04ae1633e 100644 --- a/clang-tools-extra/clang-rename/RenamingAction.cpp +++ b/clang-tools-extra/clang-rename/RenamingAction.cpp @@ -49,7 +49,7 @@ public:      std::vector<SourceLocation> NewCandidates;      for (const auto &USR : USRs) { -      NewCandidates = getLocationsOfUSR(USR, Context.getTranslationUnitDecl()); +      NewCandidates = getLocationsOfUSR(USR, PrevName, Context.getTranslationUnitDecl());        RenamingCandidates.insert(RenamingCandidates.end(), NewCandidates.begin(),                                  NewCandidates.end());        NewCandidates.clear(); diff --git a/clang-tools-extra/clang-rename/USRLocFinder.cpp b/clang-tools-extra/clang-rename/USRLocFinder.cpp index f2d154eb277..ca4cf25268b 100644 --- a/clang-tools-extra/clang-rename/USRLocFinder.cpp +++ b/clang-tools-extra/clang-rename/USRLocFinder.cpp @@ -20,6 +20,7 @@  #include "clang/AST/RecursiveASTVisitor.h"  #include "clang/Basic/SourceLocation.h"  #include "clang/Index/USRGeneration.h" +#include "clang/Lex/Lexer.h"  #include "llvm/ADT/SmallVector.h"  using namespace llvm; @@ -33,7 +34,7 @@ namespace {  class USRLocFindingASTVisitor      : public clang::RecursiveASTVisitor<USRLocFindingASTVisitor> {  public: -  explicit USRLocFindingASTVisitor(const std::string USR) : USR(USR) { +  explicit USRLocFindingASTVisitor(StringRef USR, StringRef PrevName) : USR(USR), PrevName(PrevName) {    }    // Declaration visitors: @@ -58,6 +59,7 @@ public:    }    bool VisitCXXConstructorDecl(clang::CXXConstructorDecl *ConstructorDecl) { +    const ASTContext &Context = ConstructorDecl->getASTContext();      for (clang::CXXConstructorDecl::init_const_iterator it = ConstructorDecl->init_begin(); it != ConstructorDecl->init_end(); ++it) {        const clang::CXXCtorInitializer* Initializer = *it;        if (Initializer->getSourceOrder() == -1) { @@ -68,7 +70,12 @@ public:        if (const clang::FieldDecl *FieldDecl = Initializer->getAnyMember()) {          if (getUSRForDecl(FieldDecl) == USR) {            // The initializer refers to a field that is to be renamed. -          LocationsFound.push_back(Initializer->getSourceLocation()); +          SourceLocation Location = Initializer->getSourceLocation(); +          StringRef TokenName = Lexer::getSourceText(CharSourceRange::getTokenRange(Location), Context.getSourceManager(), Context.getLangOpts()); +          if (TokenName == PrevName) { +            // The token of the source location we find actually has the old name. +            LocationsFound.push_back(Initializer->getSourceLocation()); +          }          }        }      } @@ -116,14 +123,17 @@ private:    }    // All the locations of the USR were found. -  const std::string USR; +  StringRef USR; +  // Old name that is renamed. +  StringRef PrevName;    std::vector<clang::SourceLocation> LocationsFound;  };  } // namespace -std::vector<SourceLocation> getLocationsOfUSR(const std::string USR, +std::vector<SourceLocation> getLocationsOfUSR(StringRef USR, +                                              StringRef PrevName,                                                Decl *Decl) { -  USRLocFindingASTVisitor visitor(USR); +  USRLocFindingASTVisitor visitor(USR, PrevName);    visitor.TraverseDecl(Decl);    return visitor.getLocationsFound(); diff --git a/clang-tools-extra/clang-rename/USRLocFinder.h b/clang-tools-extra/clang-rename/USRLocFinder.h index 7ed0e0f8267..d3782a9c45d 100644 --- a/clang-tools-extra/clang-rename/USRLocFinder.h +++ b/clang-tools-extra/clang-rename/USRLocFinder.h @@ -19,6 +19,8 @@  #include <string>  #include <vector> +#include "llvm/ADT/StringRef.h" +  namespace clang {  class Decl; @@ -27,7 +29,8 @@ class SourceLocation;  namespace rename {  // FIXME: make this an AST matcher. Wouldn't that be awesome??? I agree! -std::vector<SourceLocation> getLocationsOfUSR(const std::string usr, +std::vector<SourceLocation> getLocationsOfUSR(llvm::StringRef usr, +                                              llvm::StringRef PrevName,                                                Decl *decl);  }  }  | 

