1 //===--- RenamingAction.h - Clang refactoring library ---------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// Provides an action to rename every symbol at a point. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_TOOLING_REFACTORING_RENAME_RENAMINGACTION_H 15 #define LLVM_CLANG_TOOLING_REFACTORING_RENAME_RENAMINGACTION_H 16 17 #include "clang/Tooling/Refactoring.h" 18 #include "clang/Tooling/Refactoring/AtomicChange.h" 19 #include "clang/Tooling/Refactoring/RefactoringActionRules.h" 20 #include "clang/Tooling/Refactoring/RefactoringOptions.h" 21 #include "clang/Tooling/Refactoring/Rename/SymbolOccurrences.h" 22 #include "llvm/Support/Error.h" 23 24 namespace clang { 25 class ASTConsumer; 26 27 namespace tooling { 28 29 class RenamingAction { 30 public: 31 RenamingAction(const std::vector<std::string> &NewNames, 32 const std::vector<std::string> &PrevNames, 33 const std::vector<std::vector<std::string>> &USRList, 34 std::map<std::string, tooling::Replacements> &FileToReplaces, 35 bool PrintLocations = false) NewNames(NewNames)36 : NewNames(NewNames), PrevNames(PrevNames), USRList(USRList), 37 FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {} 38 39 std::unique_ptr<ASTConsumer> newASTConsumer(); 40 41 private: 42 const std::vector<std::string> &NewNames, &PrevNames; 43 const std::vector<std::vector<std::string>> &USRList; 44 std::map<std::string, tooling::Replacements> &FileToReplaces; 45 bool PrintLocations; 46 }; 47 48 class RenameOccurrences final : public SourceChangeRefactoringRule { 49 public: 50 static Expected<RenameOccurrences> initiate(RefactoringRuleContext &Context, 51 SourceRange SelectionRange, 52 std::string NewName); 53 54 static const RefactoringDescriptor &describe(); 55 56 const NamedDecl *getRenameDecl() const; 57 58 private: RenameOccurrences(const NamedDecl * ND,std::string NewName)59 RenameOccurrences(const NamedDecl *ND, std::string NewName) 60 : ND(ND), NewName(std::move(NewName)) {} 61 62 Expected<AtomicChanges> 63 createSourceReplacements(RefactoringRuleContext &Context) override; 64 65 const NamedDecl *ND; 66 std::string NewName; 67 }; 68 69 class QualifiedRenameRule final : public SourceChangeRefactoringRule { 70 public: 71 static Expected<QualifiedRenameRule> initiate(RefactoringRuleContext &Context, 72 std::string OldQualifiedName, 73 std::string NewQualifiedName); 74 75 static const RefactoringDescriptor &describe(); 76 77 private: QualifiedRenameRule(const NamedDecl * ND,std::string NewQualifiedName)78 QualifiedRenameRule(const NamedDecl *ND, 79 std::string NewQualifiedName) 80 : ND(ND), NewQualifiedName(std::move(NewQualifiedName)) {} 81 82 Expected<AtomicChanges> 83 createSourceReplacements(RefactoringRuleContext &Context) override; 84 85 // A NamedDecl which identifies the symbol being renamed. 86 const NamedDecl *ND; 87 // The new qualified name to change the symbol to. 88 std::string NewQualifiedName; 89 }; 90 91 /// Returns source replacements that correspond to the rename of the given 92 /// symbol occurrences. 93 llvm::Expected<std::vector<AtomicChange>> 94 createRenameReplacements(const SymbolOccurrences &Occurrences, 95 const SourceManager &SM, const SymbolName &NewName); 96 97 /// Rename all symbols identified by the given USRs. 98 class QualifiedRenamingAction { 99 public: QualifiedRenamingAction(const std::vector<std::string> & NewNames,const std::vector<std::vector<std::string>> & USRList,std::map<std::string,tooling::Replacements> & FileToReplaces)100 QualifiedRenamingAction( 101 const std::vector<std::string> &NewNames, 102 const std::vector<std::vector<std::string>> &USRList, 103 std::map<std::string, tooling::Replacements> &FileToReplaces) 104 : NewNames(NewNames), USRList(USRList), FileToReplaces(FileToReplaces) {} 105 106 std::unique_ptr<ASTConsumer> newASTConsumer(); 107 108 private: 109 /// New symbol names. 110 const std::vector<std::string> &NewNames; 111 112 /// A list of USRs. Each element represents USRs of a symbol being renamed. 113 const std::vector<std::vector<std::string>> &USRList; 114 115 /// A file path to replacements map. 116 std::map<std::string, tooling::Replacements> &FileToReplaces; 117 }; 118 119 } // end namespace tooling 120 } // end namespace clang 121 122 #endif // LLVM_CLANG_TOOLING_REFACTORING_RENAME_RENAMINGACTION_H 123