Author: vmiklos Date: Fri May 13 04:17:32 2016 New Revision: 269402 URL: http://llvm.org/viewvc/llvm-project?rev=269402&view=rev Log: clang-rename: check that the source location we find actually has the old name
This more general check could have prevented the specific problem "getSourceOrder() == -1" guards. Reviewers: cfe-commits, klimek Differential Revision: http://reviews.llvm.org/D20216 Modified: clang-tools-extra/trunk/clang-rename/RenamingAction.cpp clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp clang-tools-extra/trunk/clang-rename/USRLocFinder.h Modified: clang-tools-extra/trunk/clang-rename/RenamingAction.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/RenamingAction.cpp?rev=269402&r1=269401&r2=269402&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-rename/RenamingAction.cpp (original) +++ clang-tools-extra/trunk/clang-rename/RenamingAction.cpp Fri May 13 04:17:32 2016 @@ -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(); Modified: clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp?rev=269402&r1=269401&r2=269402&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp (original) +++ clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp Fri May 13 04:17:32 2016 @@ -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(); Modified: clang-tools-extra/trunk/clang-rename/USRLocFinder.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/USRLocFinder.h?rev=269402&r1=269401&r2=269402&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-rename/USRLocFinder.h (original) +++ clang-tools-extra/trunk/clang-rename/USRLocFinder.h Fri May 13 04:17:32 2016 @@ -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); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits