Index: include/clang/Tooling/Refactoring/RefactoringActionRegistry.def =================================================================== --- include/clang/Tooling/Refactoring/RefactoringActionRegistry.def +++ include/clang/Tooling/Refactoring/RefactoringActionRegistry.def @@ -3,6 +3,7 @@ #endif REFACTORING_ACTION(LocalRename) +REFACTORING_ACTION(LocalQualifiedRename) REFACTORING_ACTION(Extract) #undef REFACTORING_ACTION Index: lib/Tooling/Refactoring/Rename/RenamingAction.cpp =================================================================== --- lib/Tooling/Refactoring/Rename/RenamingAction.cpp +++ lib/Tooling/Refactoring/Rename/RenamingAction.cpp @@ -114,12 +114,68 @@ } }; +class OldNameOption : public RequiredRefactoringOption { + public: + StringRef getName() const override { return "old-name"; } + StringRef getDescription() const override { + return "The old qualified name to be renamed"; + } +}; + +class QualifiedRenameOccurrences : public SourceChangeRefactoringRule { +public: + QualifiedRenameOccurrences(std::string OldName, std::string NewName) + : OldName(OldName), NewName(NewName) {} + + Expected + createSourceReplacements(RefactoringRuleContext &Context) override { + const NamedDecl* ND = getNamedDeclFor(Context.getASTContext(), OldName); + if (!ND) + return Context.createDiagnosticError( + SourceLocation(), diag::err_refactor_selection_no_symbol); + + auto USRs = getUSRsForDeclaration(ND, Context.getASTContext()); + return tooling::createRenameAtomicChanges( + USRs, NewName, Context.getASTContext().getTranslationUnitDecl()); + } + +private: + std::string OldName; + std::string NewName; +}; + +class LocalQualifiedRename final : public RefactoringAction { +public: + StringRef getCommand() const override { + return "local-qualified-rename"; + } + + StringRef getDescription() const override { + return "Finds and rename qualified symbol in code with no indexer support"; + } + + /// Returns a set of refactoring actions rules that are defined by this + /// action. + RefactoringActionRules createActionRules() const override { + RefactoringActionRules Rules; + Rules.push_back(createRefactoringActionRule( + OptionRequirement(), + OptionRequirement())); + return Rules; + } +}; + + } // end anonymous namespace std::unique_ptr createLocalRenameAction() { return llvm::make_unique(); } +std::unique_ptr createLocalQualifiedRenameAction() { + return llvm::make_unique(); +} + Expected> createRenameReplacements(const SymbolOccurrences &Occurrences, const SourceManager &SM, const SymbolName &NewName) {