Skip to content
Snippets Groups Projects
Commit 440d6c02 authored by Miklos Vajna's avatar Miklos Vajna
Browse files

clang-rename: let -force handle multiple renames

Summary:
The use case is that renaming multiple symbols in a large enough codebase is
much faster if all of these can be done with a single invocation, but
there will be multiple translation units where one or more symbols are
not found.

Old behavior was to exit with an error (default) or exit without
reporting an error (-force). New behavior is that -force results in a
best-effort rename: rename symbols which are found and just ignore the
rest.

The existing help for -force sort of already implies this behavior.

Reviewers: cfe-commits, klimek, arphaman

Reviewed By: klimek

Differential Revision: https://reviews.llvm.org/D37634

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@312942 91177308-0d34-0410-b5e6-96231b3b80d8
parent 13258ab9
No related branches found
No related tags found
No related merge requests found
...@@ -84,8 +84,13 @@ public: ...@@ -84,8 +84,13 @@ public:
FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {} FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {}
void HandleTranslationUnit(ASTContext &Context) override { void HandleTranslationUnit(ASTContext &Context) override {
for (unsigned I = 0; I < NewNames.size(); ++I) for (unsigned I = 0; I < NewNames.size(); ++I) {
// If the previous name was not found, ignore this rename request.
if (PrevNames[I].empty())
continue;
HandleOneRename(Context, NewNames[I], PrevNames[I], USRList[I]); HandleOneRename(Context, NewNames[I], PrevNames[I], USRList[I]);
}
} }
void HandleOneRename(ASTContext &Context, const std::string &NewName, void HandleOneRename(ASTContext &Context, const std::string &NewName,
......
...@@ -198,8 +198,11 @@ private: ...@@ -198,8 +198,11 @@ private:
return false; return false;
} }
if (Force) if (Force) {
SpellingNames.push_back(std::string());
USRList.push_back(std::vector<std::string>());
return true; return true;
}
unsigned CouldNotFindSymbolNamed = Engine.getCustomDiagID( unsigned CouldNotFindSymbolNamed = Engine.getCustomDiagID(
DiagnosticsEngine::Error, "clang-rename could not find symbol %0"); DiagnosticsEngine::Error, "clang-rename could not find symbol %0");
......
class B /* Test 1 */ { // CHECK: class B2 /* Test 1 */ {
};
class D : public B /* Test 1 */ { // CHECK: class D : public B2 /* Test 1 */ {
};
// Test 1.
// RUN: clang-rename -force -qualified-name B -new-name B2 -qualified-name E -new-name E2 %s -- | sed 's,//.*,,' | FileCheck %s
...@@ -175,12 +175,6 @@ int main(int argc, const char **argv) { ...@@ -175,12 +175,6 @@ int main(int argc, const char **argv) {
return 1; return 1;
} }
if (Force && PrevNames.size() < NewNames.size()) {
// No matching PrevName for all NewNames. Without Force this is an error
// above already.
return 0;
}
// Perform the renaming. // Perform the renaming.
tooling::RenamingAction RenameAction(NewNames, PrevNames, USRList, tooling::RenamingAction RenameAction(NewNames, PrevNames, USRList,
Tool.getReplacements(), PrintLocations); Tool.getReplacements(), PrintLocations);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment