1use serde::{Deserialize, Serialize};
2
3use crate::{
4 Documentation, MarkupKind, TextDocumentPositionParams, TextDocumentRegistrationOptions,
5 WorkDoneProgressOptions, WorkDoneProgressParams,
6};
7
8#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct SignatureInformationSettings {
11 /// Client supports the follow content formats for the documentation
12 /// property. The order describes the preferred format of the client.
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub documentation_format: Option<Vec<MarkupKind>>,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
17 pub parameter_information: Option<ParameterInformationSettings>,
18
19 /// The client support the `activeParameter` property on `SignatureInformation`
20 /// literal.
21 ///
22 /// @since 3.16.0
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub active_parameter_support: Option<bool>,
25}
26
27#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
28#[serde(rename_all = "camelCase")]
29pub struct ParameterInformationSettings {
30 /// The client supports processing label offsets instead of a
31 /// simple label string.
32 ///
33 /// @since 3.14.0
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub label_offset_support: Option<bool>,
36}
37
38#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
39#[serde(rename_all = "camelCase")]
40pub struct SignatureHelpClientCapabilities {
41 /// Whether completion supports dynamic registration.
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub dynamic_registration: Option<bool>,
44
45 /// The client supports the following `SignatureInformation`
46 /// specific properties.
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub signature_information: Option<SignatureInformationSettings>,
49
50 /// The client supports to send additional context information for a
51 /// `textDocument/signatureHelp` request. A client that opts into
52 /// contextSupport will also support the `retriggerCharacters` on
53 /// `SignatureHelpOptions`.
54 ///
55 /// @since 3.15.0
56 #[serde(skip_serializing_if = "Option::is_none")]
57 pub context_support: Option<bool>,
58}
59
60/// Signature help options.
61#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
62#[serde(rename_all = "camelCase")]
63pub struct SignatureHelpOptions {
64 /// The characters that trigger signature help automatically.
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub trigger_characters: Option<Vec<String>>,
67
68 /// List of characters that re-trigger signature help.
69 /// These trigger characters are only active when signature help is already showing. All trigger characters
70 /// are also counted as re-trigger characters.
71 #[serde(skip_serializing_if = "Option::is_none")]
72 pub retrigger_characters: Option<Vec<String>>,
73
74 #[serde(flatten)]
75 pub work_done_progress_options: WorkDoneProgressOptions,
76}
77
78/// Signature help options.
79#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
80pub struct SignatureHelpRegistrationOptions {
81 #[serde(flatten)]
82 pub text_document_registration_options: TextDocumentRegistrationOptions,
83}
84
85/// Signature help options.
86#[derive(Eq, PartialEq, Clone, Deserialize, Serialize)]
87#[serde(transparent)]
88pub struct SignatureHelpTriggerKind(i32);
89lsp_enum! {
90impl SignatureHelpTriggerKind {
91 /// Signature help was invoked manually by the user or by a command.
92 pub const INVOKED: SignatureHelpTriggerKind = SignatureHelpTriggerKind(1);
93 /// Signature help was triggered by a trigger character.
94 pub const TRIGGER_CHARACTER: SignatureHelpTriggerKind = SignatureHelpTriggerKind(2);
95 /// Signature help was triggered by the cursor moving or by the document content changing.
96 pub const CONTENT_CHANGE: SignatureHelpTriggerKind = SignatureHelpTriggerKind(3);
97}
98}
99
100#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
101#[serde(rename_all = "camelCase")]
102pub struct SignatureHelpParams {
103 /// The signature help context. This is only available if the client specifies
104 /// to send this using the client capability `textDocument.signatureHelp.contextSupport === true`
105 #[serde(skip_serializing_if = "Option::is_none")]
106 pub context: Option<SignatureHelpContext>,
107
108 #[serde(flatten)]
109 pub text_document_position_params: TextDocumentPositionParams,
110
111 #[serde(flatten)]
112 pub work_done_progress_params: WorkDoneProgressParams,
113}
114
115#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
116#[serde(rename_all = "camelCase")]
117pub struct SignatureHelpContext {
118 /// Action that caused signature help to be triggered.
119 pub trigger_kind: SignatureHelpTriggerKind,
120
121 /// Character that caused signature help to be triggered.
122 /// This is undefined when `triggerKind !== SignatureHelpTriggerKind.TriggerCharacter`
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub trigger_character: Option<String>,
125
126 /// `true` if signature help was already showing when it was triggered.
127 /// Retriggers occur when the signature help is already active and can be caused by actions such as
128 /// typing a trigger character, a cursor move, or document content changes.
129 pub is_retrigger: bool,
130
131 /// The currently active `SignatureHelp`.
132 /// The `activeSignatureHelp` has its `SignatureHelp.activeSignature` field updated based on
133 /// the user navigating through available signatures.
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub active_signature_help: Option<SignatureHelp>,
136}
137
138/// Signature help represents the signature of something
139/// callable. There can be multiple signature but only one
140/// active and only one active parameter.
141#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
142#[serde(rename_all = "camelCase")]
143pub struct SignatureHelp {
144 /// One or more signatures.
145 pub signatures: Vec<SignatureInformation>,
146
147 /// The active signature.
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub active_signature: Option<u32>,
150
151 /// The active parameter of the active signature.
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub active_parameter: Option<u32>,
154}
155
156/// Represents the signature of something callable. A signature
157/// can have a label, like a function-name, a doc-comment, and
158/// a set of parameters.
159#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
160#[serde(rename_all = "camelCase")]
161pub struct SignatureInformation {
162 /// The label of this signature. Will be shown in
163 /// the UI.
164 pub label: String,
165
166 /// The human-readable doc-comment of this signature. Will be shown
167 /// in the UI but can be omitted.
168 #[serde(skip_serializing_if = "Option::is_none")]
169 pub documentation: Option<Documentation>,
170
171 /// The parameters of this signature.
172 #[serde(skip_serializing_if = "Option::is_none")]
173 pub parameters: Option<Vec<ParameterInformation>>,
174
175 /// The index of the active parameter.
176 ///
177 /// If provided, this is used in place of `SignatureHelp.activeParameter`.
178 ///
179 /// @since 3.16.0
180 #[serde(skip_serializing_if = "Option::is_none")]
181 pub active_parameter: Option<u32>,
182}
183
184/// Represents a parameter of a callable-signature. A parameter can
185/// have a label and a doc-comment.
186#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
187#[serde(rename_all = "camelCase")]
188pub struct ParameterInformation {
189 /// The label of this parameter information.
190 ///
191 /// Either a string or an inclusive start and exclusive end offsets within its containing
192 /// signature label. (see SignatureInformation.label). *Note*: A label of type string must be
193 /// a substring of its containing signature label.
194 pub label: ParameterLabel,
195
196 /// The human-readable doc-comment of this parameter. Will be shown
197 /// in the UI but can be omitted.
198 #[serde(skip_serializing_if = "Option::is_none")]
199 pub documentation: Option<Documentation>,
200}
201
202#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
203#[serde(untagged)]
204pub enum ParameterLabel {
205 Simple(String),
206 LabelOffsets([u32; 2]),
207}
208