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_REFACTOR_RENAME_RENAMING_ACTION_H 15#define LLVM_CLANG_TOOLING_REFACTOR_RENAME_RENAMING_ACTION_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 24namespace clang { 25class ASTConsumer; 26class CompilerInstance; 27 28namespace tooling { 29 30class RenamingAction { 31public: 32 RenamingAction(const std::vector<std::string> &NewNames, 33 const std::vector<std::string> &PrevNames, 34 const std::vector<std::vector<std::string>> &USRList, 35 std::map<std::string, tooling::Replacements> &FileToReplaces, 36 bool PrintLocations = false) 37 : NewNames(NewNames), PrevNames(PrevNames), USRList(USRList), 38 FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {} 39 40 std::unique_ptr<ASTConsumer> newASTConsumer(); 41 42private: 43 const std::vector<std::string> &NewNames, &PrevNames; 44 const std::vector<std::vector<std::string>> &USRList; 45 std::map<std::string, tooling::Replacements> &FileToReplaces; 46 bool PrintLocations; 47}; 48 49class RenameOccurrences final : public SourceChangeRefactoringRule { 50public: 51 static Expected<RenameOccurrences> initiate(RefactoringRuleContext &Context, 52 SourceRange SelectionRange, 53 std::string NewName); 54 55 static const RefactoringDescriptor &describe(); 56 57 const NamedDecl *getRenameDecl() const; 58 59private: 60 RenameOccurrences(const NamedDecl *ND, std::string NewName) 61 : ND(ND), NewName(std::move(NewName)) {} 62 63 Expected<AtomicChanges> 64 createSourceReplacements(RefactoringRuleContext &Context) override; 65 66 const NamedDecl *ND; 67 std::string NewName; 68}; 69 70class QualifiedRenameRule final : public SourceChangeRefactoringRule { 71public: 72 static Expected<QualifiedRenameRule> initiate(RefactoringRuleContext &Context, 73 std::string OldQualifiedName, 74 std::string NewQualifiedName); 75 76 static const RefactoringDescriptor &describe(); 77 78private: 79 QualifiedRenameRule(const NamedDecl *ND, 80 std::string NewQualifiedName) 81 : ND(ND), NewQualifiedName(std::move(NewQualifiedName)) {} 82 83 Expected<AtomicChanges> 84 createSourceReplacements(RefactoringRuleContext &Context) override; 85 86 // A NamedDecl which identifies the symbol being renamed. 87 const NamedDecl *ND; 88 // The new qualified name to change the symbol to. 89 std::string NewQualifiedName; 90}; 91 92/// Returns source replacements that correspond to the rename of the given 93/// symbol occurrences. 94llvm::Expected<std::vector<AtomicChange>> 95createRenameReplacements(const SymbolOccurrences &Occurrences, 96 const SourceManager &SM, const SymbolName &NewName); 97 98/// Rename all symbols identified by the given USRs. 99class QualifiedRenamingAction { 100public: 101 QualifiedRenamingAction( 102 const std::vector<std::string> &NewNames, 103 const std::vector<std::vector<std::string>> &USRList, 104 std::map<std::string, tooling::Replacements> &FileToReplaces) 105 : NewNames(NewNames), USRList(USRList), FileToReplaces(FileToReplaces) {} 106 107 std::unique_ptr<ASTConsumer> newASTConsumer(); 108 109private: 110 /// New symbol names. 111 const std::vector<std::string> &NewNames; 112 113 /// A list of USRs. Each element represents USRs of a symbol being renamed. 114 const std::vector<std::vector<std::string>> &USRList; 115 116 /// A file path to replacements map. 117 std::map<std::string, tooling::Replacements> &FileToReplaces; 118}; 119 120} // end namespace tooling 121} // end namespace clang 122 123#endif // LLVM_CLANG_TOOLING_REFACTOR_RENAME_RENAMING_ACTION_H 124