/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Expression/REPL.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===-- REPL.h --------------------------------------------------*- C++ -*-===// |
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 LLDB_EXPRESSION_REPL_H |
10 | | #define LLDB_EXPRESSION_REPL_H |
11 | | |
12 | | #include <string> |
13 | | |
14 | | #include "lldb/Core/IOHandler.h" |
15 | | #include "lldb/Interpreter/OptionGroupFormat.h" |
16 | | #include "lldb/Interpreter/OptionGroupValueObjectDisplay.h" |
17 | | #include "lldb/Target/Target.h" |
18 | | #include "llvm/Support/ExtensibleRTTI.h" |
19 | | |
20 | | namespace lldb_private { |
21 | | |
22 | | class REPL : public IOHandlerDelegate, |
23 | | public llvm::RTTIExtends<REPL, llvm::RTTIRoot> { |
24 | | public: |
25 | | /// LLVM RTTI support |
26 | | static char ID; |
27 | | |
28 | | REPL(Target &target); |
29 | | |
30 | | ~REPL() override; |
31 | | |
32 | | /// Get a REPL with an existing target (or, failing that, a debugger to use), |
33 | | /// and (optional) extra arguments for the compiler. |
34 | | /// |
35 | | /// \param[out] Status |
36 | | /// If this language is supported but the REPL couldn't be created, this |
37 | | /// error is populated with the reason. |
38 | | /// |
39 | | /// \param[in] language |
40 | | /// The language to create a REPL for. |
41 | | /// |
42 | | /// \param[in] debugger |
43 | | /// If provided, and target is nullptr, the debugger to use when setting |
44 | | /// up a top-level REPL. |
45 | | /// |
46 | | /// \param[in] target |
47 | | /// If provided, the target to put the REPL inside. |
48 | | /// |
49 | | /// \param[in] repl_options |
50 | | /// If provided, additional options for the compiler when parsing REPL |
51 | | /// expressions. |
52 | | /// |
53 | | /// \return |
54 | | /// The range of the containing object in the target process. |
55 | | static lldb::REPLSP Create(Status &Status, lldb::LanguageType language, |
56 | | Debugger *debugger, Target *target, |
57 | | const char *repl_options); |
58 | | |
59 | 0 | void SetFormatOptions(const OptionGroupFormat &options) { |
60 | 0 | m_format_options = options; |
61 | 0 | } |
62 | | |
63 | | void |
64 | 0 | SetValueObjectDisplayOptions(const OptionGroupValueObjectDisplay &options) { |
65 | 0 | m_varobj_options = options; |
66 | 0 | } |
67 | | |
68 | 0 | void SetEvaluateOptions(const EvaluateExpressionOptions &options) { |
69 | 0 | m_expr_options = options; |
70 | 0 | } |
71 | | |
72 | 0 | void SetCompilerOptions(const char *options) { |
73 | 0 | if (options) |
74 | 0 | m_compiler_options = options; |
75 | 0 | } |
76 | | |
77 | | lldb::IOHandlerSP GetIOHandler(); |
78 | | |
79 | | Status RunLoop(); |
80 | | |
81 | | // IOHandler::Delegate functions |
82 | | void IOHandlerActivated(IOHandler &io_handler, bool interactive) override; |
83 | | |
84 | | bool IOHandlerInterrupt(IOHandler &io_handler) override; |
85 | | |
86 | | void IOHandlerInputInterrupted(IOHandler &io_handler, |
87 | | std::string &line) override; |
88 | | |
89 | | const char *IOHandlerGetFixIndentationCharacters() override; |
90 | | |
91 | | llvm::StringRef IOHandlerGetControlSequence(char ch) override; |
92 | | |
93 | | const char *IOHandlerGetCommandPrefix() override; |
94 | | |
95 | | const char *IOHandlerGetHelpPrologue() override; |
96 | | |
97 | | bool IOHandlerIsInputComplete(IOHandler &io_handler, |
98 | | StringList &lines) override; |
99 | | |
100 | | int IOHandlerFixIndentation(IOHandler &io_handler, const StringList &lines, |
101 | | int cursor_position) override; |
102 | | |
103 | | void IOHandlerInputComplete(IOHandler &io_handler, |
104 | | std::string &line) override; |
105 | | |
106 | | void IOHandlerComplete(IOHandler &io_handler, |
107 | | CompletionRequest &request) override; |
108 | | |
109 | | protected: |
110 | | /// Method that can be optionally overriden by subclasses to get notified |
111 | | /// whenever an expression has been evaluated. The params of this method |
112 | | /// include the inputs and outputs of the expression evaluation. |
113 | | /// |
114 | | /// Note: meta commands that start with : are not covered by this method. |
115 | | /// |
116 | | /// \return |
117 | | /// An \a Error object that, if it is a failure, aborts the regular |
118 | | /// REPL expression result handling. |
119 | | virtual llvm::Error |
120 | | OnExpressionEvaluated(const ExecutionContext &exe_ctx, llvm::StringRef code, |
121 | | const EvaluateExpressionOptions &expr_options, |
122 | | lldb::ExpressionResults execution_results, |
123 | | const lldb::ValueObjectSP &result_valobj_sp, |
124 | 0 | const Status &error) { |
125 | 0 | return llvm::Error::success(); |
126 | 0 | } |
127 | | |
128 | | static int CalculateActualIndentation(const StringList &lines); |
129 | | |
130 | | // Subclasses should override these functions to implement a functional REPL. |
131 | | |
132 | | virtual Status DoInitialization() = 0; |
133 | | |
134 | | virtual llvm::StringRef GetSourceFileBasename() = 0; |
135 | | |
136 | | virtual const char *GetAutoIndentCharacters() = 0; |
137 | | |
138 | | virtual bool SourceIsComplete(const std::string &source) = 0; |
139 | | |
140 | | virtual lldb::offset_t GetDesiredIndentation( |
141 | | const StringList &lines, int cursor_position, |
142 | | int tab_size) = 0; // LLDB_INVALID_OFFSET means no change |
143 | | |
144 | | virtual lldb::LanguageType GetLanguage() = 0; |
145 | | |
146 | | virtual bool PrintOneVariable(Debugger &debugger, |
147 | | lldb::StreamFileSP &output_sp, |
148 | | lldb::ValueObjectSP &valobj_sp, |
149 | | ExpressionVariable *var = nullptr) = 0; |
150 | | |
151 | | virtual void CompleteCode(const std::string ¤t_code, |
152 | | CompletionRequest &request) = 0; |
153 | | |
154 | | OptionGroupFormat m_format_options = OptionGroupFormat(lldb::eFormatDefault); |
155 | | OptionGroupValueObjectDisplay m_varobj_options; |
156 | | EvaluateExpressionOptions m_expr_options; |
157 | | std::string m_compiler_options; |
158 | | |
159 | | bool m_enable_auto_indent = true; |
160 | | std::string m_indent_str; // Use this string for each level of indentation |
161 | | std::string m_current_indent_str; |
162 | | uint32_t m_current_indent_level = 0; |
163 | | |
164 | | std::string m_repl_source_path; |
165 | | bool m_dedicated_repl_mode = false; |
166 | | |
167 | | StringList m_code; // All accumulated REPL statements are saved here |
168 | | |
169 | | Target &m_target; |
170 | | lldb::IOHandlerSP m_io_handler_sp; |
171 | | |
172 | | private: |
173 | | std::string GetSourcePath(); |
174 | | }; |
175 | | |
176 | | } // namespace lldb_private |
177 | | |
178 | | #endif // LLDB_EXPRESSION_REPL_H |