summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-rename
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clang-rename')
-rw-r--r--clang-tools-extra/clang-rename/USRFinder.cpp39
-rw-r--r--clang-tools-extra/clang-rename/USRFinder.h6
-rw-r--r--clang-tools-extra/clang-rename/USRFindingAction.cpp9
-rw-r--r--clang-tools-extra/clang-rename/USRFindingAction.h3
-rw-r--r--clang-tools-extra/clang-rename/tool/ClangRename.cpp7
5 files changed, 58 insertions, 6 deletions
diff --git a/clang-tools-extra/clang-rename/USRFinder.cpp b/clang-tools-extra/clang-rename/USRFinder.cpp
index 2c73c879b0a..01f7278dea9 100644
--- a/clang-tools-extra/clang-rename/USRFinder.cpp
+++ b/clang-tools-extra/clang-rename/USRFinder.cpp
@@ -40,6 +40,14 @@ public:
Point(Point) {
}
+ // \brief Finds the NamedDecl for a name in the source.
+ // \param Name the fully qualified name.
+ explicit NamedDeclFindingASTVisitor(const SourceManager &SourceMgr,
+ const std::string &Name)
+ : Result(nullptr), SourceMgr(SourceMgr),
+ Name(Name) {
+ }
+
// Declaration visitors:
// \brief Checks if the point falls within the NameDecl. This covers every
@@ -93,9 +101,17 @@ private:
// \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,6 +137,7 @@ private:
const NamedDecl *Result;
const SourceManager &SourceMgr;
const SourceLocation Point; // The location to find the NamedDecl.
+ const std::string Name;
};
}
@@ -148,6 +165,22 @@ const NamedDecl *getNamedDeclAt(const ASTContext &Context,
return nullptr;
}
+const NamedDecl *getNamedDeclFor(const ASTContext &Context,
+ const std::string &Name) {
+ const auto &SourceMgr = Context.getSourceManager();
+ NamedDeclFindingASTVisitor Visitor(SourceMgr, Name);
+ auto Decls = Context.getTranslationUnitDecl()->decls();
+
+ for (auto &CurrDecl : Decls) {
+ Visitor.TraverseDecl(CurrDecl);
+ if (const NamedDecl *Result = Visitor.getNamedDecl()) {
+ return Result;
+ }
+ }
+
+ return nullptr;
+}
+
std::string getUSRForDecl(const Decl *Decl) {
llvm::SmallVector<char, 128> Buff;
diff --git a/clang-tools-extra/clang-rename/USRFinder.h b/clang-tools-extra/clang-rename/USRFinder.h
index 2de6f4272af..78985b6fc12 100644
--- a/clang-tools-extra/clang-rename/USRFinder.h
+++ b/clang-tools-extra/clang-rename/USRFinder.h
@@ -30,6 +30,12 @@ namespace rename {
const NamedDecl *getNamedDeclAt(const ASTContext &Context,
const SourceLocation Point);
+// Given an AST context and a fully qualified name, returns a NamedDecl
+// identifying the symbol with a matching name. Returns null if nothing is
+// found for the name.
+const NamedDecl *getNamedDeclFor(const ASTContext &Context,
+ const std::string &Name);
+
// Converts a Decl into a USR.
std::string getUSRForDecl(const Decl *Decl);
diff --git a/clang-tools-extra/clang-rename/USRFindingAction.cpp b/clang-tools-extra/clang-rename/USRFindingAction.cpp
index 54b7a38a7c7..0ff0be652b3 100644
--- a/clang-tools-extra/clang-rename/USRFindingAction.cpp
+++ b/clang-tools-extra/clang-rename/USRFindingAction.cpp
@@ -68,7 +68,12 @@ struct NamedDeclFindingConsumer : public ASTConsumer {
SourceMgr.getMainFileID()).getLocWithOffset(SymbolOffset);
if (!Point.isValid())
return;
- const NamedDecl *FoundDecl = getNamedDeclAt(Context, Point);
+ const NamedDecl *FoundDecl = nullptr;
+ if (OldName.empty()) {
+ FoundDecl = getNamedDeclAt(Context, Point);
+ } else {
+ FoundDecl = getNamedDeclFor(Context, OldName);
+ }
if (FoundDecl == nullptr) {
FullSourceLoc FullLoc(Point, SourceMgr);
errs() << "clang-rename: could not find symbol at "
@@ -96,6 +101,7 @@ struct NamedDeclFindingConsumer : public ASTConsumer {
}
unsigned SymbolOffset;
+ std::string OldName;
std::string *SpellingName;
std::vector<std::string> *USRs;
};
@@ -106,6 +112,7 @@ USRFindingAction::newASTConsumer() {
new NamedDeclFindingConsumer);
SpellingName = "";
Consumer->SymbolOffset = SymbolOffset;
+ Consumer->OldName = OldName;
Consumer->USRs = &USRs;
Consumer->SpellingName = &SpellingName;
return std::move(Consumer);
diff --git a/clang-tools-extra/clang-rename/USRFindingAction.h b/clang-tools-extra/clang-rename/USRFindingAction.h
index 4c059a56184..a38b37e57db 100644
--- a/clang-tools-extra/clang-rename/USRFindingAction.h
+++ b/clang-tools-extra/clang-rename/USRFindingAction.h
@@ -25,7 +25,7 @@ class NamedDecl;
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 @@ struct USRFindingAction {
private:
unsigned SymbolOffset;
+ std::string OldName;
std::string SpellingName;
std::vector<std::string> USRs;
};
diff --git a/clang-tools-extra/clang-rename/tool/ClangRename.cpp b/clang-tools-extra/clang-rename/tool/ClangRename.cpp
index 92cc9063475..88c25da2f13 100644
--- a/clang-tools-extra/clang-rename/tool/ClangRename.cpp
+++ b/clang-tools-extra/clang-rename/tool/ClangRename.cpp
@@ -52,6 +52,11 @@ SymbolOffset(
"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 @@ int main(int argc, const char **argv) {
// 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());
OpenPOWER on IntegriCloud