1 //===--- RefactoringRuleContext.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 #ifndef LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGRULECONTEXT_H 10 #define LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGRULECONTEXT_H 11 12 #include "clang/Basic/DiagnosticError.h" 13 #include "clang/Basic/SourceManager.h" 14 #include "clang/Tooling/Refactoring/ASTSelection.h" 15 16 namespace clang { 17 18 class ASTContext; 19 20 namespace tooling { 21 22 /// The refactoring rule context stores all of the inputs that might be needed 23 /// by a refactoring action rule. It can create the specialized 24 /// \c ASTRefactoringOperation or \c PreprocessorRefactoringOperation values 25 /// that can be used by the refactoring action rules. 26 /// 27 /// The following inputs are stored by the operation: 28 /// 29 /// - SourceManager: a reference to a valid source manager. 30 /// 31 /// - SelectionRange: an optional source selection ranges that can be used 32 /// to represent a selection in an editor. 33 class RefactoringRuleContext { 34 public: RefactoringRuleContext(const SourceManager & SM)35 RefactoringRuleContext(const SourceManager &SM) : SM(SM) {} 36 getSources()37 const SourceManager &getSources() const { return SM; } 38 39 /// Returns the current source selection range as set by the 40 /// refactoring engine. Can be invalid. getSelectionRange()41 SourceRange getSelectionRange() const { return SelectionRange; } 42 setSelectionRange(SourceRange R)43 void setSelectionRange(SourceRange R) { SelectionRange = R; } 44 hasASTContext()45 bool hasASTContext() const { return AST; } 46 getASTContext()47 ASTContext &getASTContext() const { 48 assert(AST && "no AST!"); 49 return *AST; 50 } 51 setASTContext(ASTContext & Context)52 void setASTContext(ASTContext &Context) { AST = &Context; } 53 54 /// Creates an llvm::Error value that contains a diagnostic. 55 /// 56 /// The errors should not outlive the context. createDiagnosticError(SourceLocation Loc,unsigned DiagID)57 llvm::Error createDiagnosticError(SourceLocation Loc, unsigned DiagID) { 58 return DiagnosticError::create(Loc, PartialDiagnostic(DiagID, DiagStorage)); 59 } 60 createDiagnosticError(unsigned DiagID)61 llvm::Error createDiagnosticError(unsigned DiagID) { 62 return createDiagnosticError(SourceLocation(), DiagID); 63 } 64 setASTSelection(std::unique_ptr<SelectedASTNode> Node)65 void setASTSelection(std::unique_ptr<SelectedASTNode> Node) { 66 ASTNodeSelection = std::move(Node); 67 } 68 69 private: 70 /// The source manager for the translation unit / file on which a refactoring 71 /// action might operate on. 72 const SourceManager &SM; 73 /// An optional source selection range that's commonly used to represent 74 /// a selection in an editor. 75 SourceRange SelectionRange; 76 /// An optional AST for the translation unit on which a refactoring action 77 /// might operate on. 78 ASTContext *AST = nullptr; 79 /// The allocator for diagnostics. 80 PartialDiagnostic::DiagStorageAllocator DiagStorage; 81 82 // FIXME: Remove when memoized. 83 std::unique_ptr<SelectedASTNode> ASTNodeSelection; 84 }; 85 86 } // end namespace tooling 87 } // end namespace clang 88 89 #endif // LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGRULECONTEXT_H 90