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