vmiklos created this revision. 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. https://reviews.llvm.org/D37634 Files: lib/Tooling/Refactoring/Rename/RenamingAction.cpp lib/Tooling/Refactoring/Rename/USRFindingAction.cpp test/clang-rename/ForceMulti.cpp tools/clang-rename/ClangRename.cpp Index: tools/clang-rename/ClangRename.cpp =================================================================== --- tools/clang-rename/ClangRename.cpp +++ tools/clang-rename/ClangRename.cpp @@ -175,12 +175,6 @@ 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. tooling::RenamingAction RenameAction(NewNames, PrevNames, USRList, Tool.getReplacements(), PrintLocations); Index: test/clang-rename/ForceMulti.cpp =================================================================== --- /dev/null +++ test/clang-rename/ForceMulti.cpp @@ -0,0 +1,8 @@ +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 Index: lib/Tooling/Refactoring/Rename/USRFindingAction.cpp =================================================================== --- lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ lib/Tooling/Refactoring/Rename/USRFindingAction.cpp @@ -198,8 +198,11 @@ return false; } - if (Force) + if (Force) { + SpellingNames.push_back(std::string()); + USRList.push_back(std::vector<std::string>()); return true; + } unsigned CouldNotFindSymbolNamed = Engine.getCustomDiagID( DiagnosticsEngine::Error, "clang-rename could not find symbol %0"); Index: lib/Tooling/Refactoring/Rename/RenamingAction.cpp =================================================================== --- lib/Tooling/Refactoring/Rename/RenamingAction.cpp +++ lib/Tooling/Refactoring/Rename/RenamingAction.cpp @@ -84,8 +84,13 @@ FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {} 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]); + } } void HandleOneRename(ASTContext &Context, const std::string &NewName,
Index: tools/clang-rename/ClangRename.cpp =================================================================== --- tools/clang-rename/ClangRename.cpp +++ tools/clang-rename/ClangRename.cpp @@ -175,12 +175,6 @@ 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. tooling::RenamingAction RenameAction(NewNames, PrevNames, USRList, Tool.getReplacements(), PrintLocations); Index: test/clang-rename/ForceMulti.cpp =================================================================== --- /dev/null +++ test/clang-rename/ForceMulti.cpp @@ -0,0 +1,8 @@ +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 Index: lib/Tooling/Refactoring/Rename/USRFindingAction.cpp =================================================================== --- lib/Tooling/Refactoring/Rename/USRFindingAction.cpp +++ lib/Tooling/Refactoring/Rename/USRFindingAction.cpp @@ -198,8 +198,11 @@ return false; } - if (Force) + if (Force) { + SpellingNames.push_back(std::string()); + USRList.push_back(std::vector<std::string>()); return true; + } unsigned CouldNotFindSymbolNamed = Engine.getCustomDiagID( DiagnosticsEngine::Error, "clang-rename could not find symbol %0"); Index: lib/Tooling/Refactoring/Rename/RenamingAction.cpp =================================================================== --- lib/Tooling/Refactoring/Rename/RenamingAction.cpp +++ lib/Tooling/Refactoring/Rename/RenamingAction.cpp @@ -84,8 +84,13 @@ FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {} 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]); + } } void HandleOneRename(ASTContext &Context, const std::string &NewName,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits