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: |
35 | RefactoringRuleContext(const SourceManager &SM) : SM(SM) {} |
36 | |
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. |
41 | SourceRange getSelectionRange() const { return SelectionRange; } |
42 | |
43 | void setSelectionRange(SourceRange R) { SelectionRange = R; } |
44 | |
45 | bool hasASTContext() const { return AST; } |
46 | |
47 | ASTContext &getASTContext() const { |
48 | assert(AST && "no AST!" ); |
49 | return *AST; |
50 | } |
51 | |
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. |
57 | llvm::Error createDiagnosticError(SourceLocation Loc, unsigned DiagID) { |
58 | return DiagnosticError::create(Loc, Diag: PartialDiagnostic(DiagID, DiagStorage)); |
59 | } |
60 | |
61 | llvm::Error createDiagnosticError(unsigned DiagID) { |
62 | return createDiagnosticError(Loc: SourceLocation(), DiagID); |
63 | } |
64 | |
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 | |