1 | use crate::{ |
2 | DynamicRegistrationClientCapabilities, Range, StaticRegistrationOptions, |
3 | TextDocumentIdentifier, TextDocumentRegistrationOptions, WorkDoneProgressOptions, |
4 | WorkDoneProgressParams, |
5 | }; |
6 | use serde::{Deserialize, Serialize}; |
7 | |
8 | pub type InlineValueClientCapabilities = DynamicRegistrationClientCapabilities; |
9 | |
10 | #[derive (Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] |
11 | #[serde(untagged)] |
12 | pub enum InlineValueServerCapabilities { |
13 | Options(InlineValueOptions), |
14 | RegistrationOptions(InlineValueRegistrationOptions), |
15 | } |
16 | |
17 | /// Inline value options used during static registration. |
18 | /// |
19 | /// @since 3.17.0 |
20 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
21 | pub struct InlineValueOptions { |
22 | #[serde(flatten)] |
23 | pub work_done_progress_options: WorkDoneProgressOptions, |
24 | } |
25 | |
26 | /// Inline value options used during static or dynamic registration. |
27 | /// |
28 | /// @since 3.17.0 |
29 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
30 | pub struct InlineValueRegistrationOptions { |
31 | #[serde(flatten)] |
32 | pub inline_value_options: InlineValueOptions, |
33 | |
34 | #[serde(flatten)] |
35 | pub text_document_registration_options: TextDocumentRegistrationOptions, |
36 | |
37 | #[serde(flatten)] |
38 | pub static_registration_options: StaticRegistrationOptions, |
39 | } |
40 | |
41 | /// A parameter literal used in inline value requests. |
42 | /// |
43 | /// @since 3.17.0 |
44 | #[derive (Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] |
45 | #[serde(rename_all = "camelCase" )] |
46 | pub struct InlineValueParams { |
47 | #[serde(flatten)] |
48 | pub work_done_progress_params: WorkDoneProgressParams, |
49 | |
50 | /// The text document. |
51 | pub text_document: TextDocumentIdentifier, |
52 | |
53 | /// The document range for which inline values should be computed. |
54 | pub range: Range, |
55 | |
56 | /// Additional information about the context in which inline values were |
57 | /// requested. |
58 | pub context: InlineValueContext, |
59 | } |
60 | |
61 | /// @since 3.17.0 |
62 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
63 | #[serde(rename_all = "camelCase" )] |
64 | pub struct InlineValueContext { |
65 | /// The stack frame (as a DAP Id) where the execution has stopped. |
66 | pub frame_id: i32, |
67 | |
68 | /// The document range where execution has stopped. |
69 | /// Typically the end position of the range denotes the line where the |
70 | /// inline values are shown. |
71 | pub stopped_location: Range, |
72 | } |
73 | |
74 | /// Provide inline value as text. |
75 | /// |
76 | /// @since 3.17.0 |
77 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
78 | pub struct InlineValueText { |
79 | /// The document range for which the inline value applies. |
80 | pub range: Range, |
81 | |
82 | /// The text of the inline value. |
83 | pub text: String, |
84 | } |
85 | |
86 | /// Provide inline value through a variable lookup. |
87 | /// |
88 | /// If only a range is specified, the variable name will be extracted from |
89 | /// the underlying document. |
90 | /// |
91 | /// An optional variable name can be used to override the extracted name. |
92 | /// |
93 | /// @since 3.17.0 |
94 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
95 | #[serde(rename_all = "camelCase" )] |
96 | pub struct InlineValueVariableLookup { |
97 | /// The document range for which the inline value applies. |
98 | /// The range is used to extract the variable name from the underlying |
99 | /// document. |
100 | pub range: Range, |
101 | |
102 | /// If specified the name of the variable to look up. |
103 | #[serde(skip_serializing_if = "Option::is_none" )] |
104 | pub variable_name: Option<String>, |
105 | |
106 | /// How to perform the lookup. |
107 | pub case_sensitive_lookup: bool, |
108 | } |
109 | |
110 | /// Provide an inline value through an expression evaluation. |
111 | /// |
112 | /// If only a range is specified, the expression will be extracted from the |
113 | /// underlying document. |
114 | /// |
115 | /// An optional expression can be used to override the extracted expression. |
116 | /// |
117 | /// @since 3.17.0 |
118 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
119 | #[serde(rename_all = "camelCase" )] |
120 | pub struct InlineValueEvaluatableExpression { |
121 | /// The document range for which the inline value applies. |
122 | /// The range is used to extract the evaluatable expression from the |
123 | /// underlying document. |
124 | pub range: Range, |
125 | |
126 | /// If specified the expression overrides the extracted expression. |
127 | #[serde(skip_serializing_if = "Option::is_none" )] |
128 | pub expression: Option<String>, |
129 | } |
130 | |
131 | /// Inline value information can be provided by different means: |
132 | /// - directly as a text value (class InlineValueText). |
133 | /// - as a name to use for a variable lookup (class InlineValueVariableLookup) |
134 | /// - as an evaluatable expression (class InlineValueEvaluatableExpression) |
135 | /// The InlineValue types combines all inline value types into one type. |
136 | /// |
137 | /// @since 3.17.0 |
138 | #[derive (Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] |
139 | #[serde(untagged)] |
140 | pub enum InlineValue { |
141 | Text(InlineValueText), |
142 | VariableLookup(InlineValueVariableLookup), |
143 | EvaluatableExpression(InlineValueEvaluatableExpression), |
144 | } |
145 | |
146 | impl From<InlineValueText> for InlineValue { |
147 | #[inline ] |
148 | fn from(from: InlineValueText) -> Self { |
149 | Self::Text(from) |
150 | } |
151 | } |
152 | |
153 | impl From<InlineValueVariableLookup> for InlineValue { |
154 | #[inline ] |
155 | fn from(from: InlineValueVariableLookup) -> Self { |
156 | Self::VariableLookup(from) |
157 | } |
158 | } |
159 | |
160 | impl From<InlineValueEvaluatableExpression> for InlineValue { |
161 | #[inline ] |
162 | fn from(from: InlineValueEvaluatableExpression) -> Self { |
163 | Self::EvaluatableExpression(from) |
164 | } |
165 | } |
166 | |
167 | /// Client workspace capabilities specific to inline values. |
168 | #[derive (Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)] |
169 | /// |
170 | /// @since 3.17.0 |
171 | #[serde(rename_all = "camelCase" )] |
172 | pub struct InlineValueWorkspaceClientCapabilities { |
173 | /// Whether the client implementation supports a refresh request sent from |
174 | /// the server to the client. |
175 | /// |
176 | /// Note that this event is global and will force the client to refresh all |
177 | /// inline values currently shown. It should be used with absolute care and |
178 | /// is useful for situation where a server for example detect a project wide |
179 | /// change that requires such a calculation. |
180 | #[serde(skip_serializing_if = "Option::is_none" )] |
181 | pub refresh_support: Option<bool>, |
182 | } |
183 | |
184 | #[cfg (test)] |
185 | mod tests { |
186 | use super::*; |
187 | use crate::tests::test_serialization; |
188 | use crate::Position; |
189 | |
190 | #[test ] |
191 | fn inline_values() { |
192 | test_serialization( |
193 | &InlineValueText { |
194 | range: Range::new(Position::new(0, 0), Position::new(0, 4)), |
195 | text: "one" .to_owned(), |
196 | }, |
197 | r#"{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":4}},"text":"one"}"# , |
198 | ); |
199 | |
200 | test_serialization( |
201 | &InlineValue::VariableLookup(InlineValueVariableLookup { |
202 | range: Range::new(Position::new(1, 0), Position::new(1, 4)), |
203 | variable_name: None, |
204 | case_sensitive_lookup: false, |
205 | }), |
206 | r#"{"range":{"start":{"line":1,"character":0},"end":{"line":1,"character":4}},"caseSensitiveLookup":false}"# , |
207 | ); |
208 | |
209 | test_serialization( |
210 | &InlineValue::EvaluatableExpression(InlineValueEvaluatableExpression { |
211 | range: Range::new(Position::new(2, 0), Position::new(2, 4)), |
212 | expression: None, |
213 | }), |
214 | r#"{"range":{"start":{"line":2,"character":0},"end":{"line":2,"character":4}}}"# , |
215 | ); |
216 | } |
217 | } |
218 | |