1use crate::TypeProvider;
4use crate::connection::Endpoint;
5use crate::{connection::Callback, Server};
6use self::code_action::CodeActionOptions;
7use self::code_lens::{CodeLensOptions, CodeLensResolveOptions};
8use self::completion::{CompletionOptions, ResolveCompletionOptions, CompletionCapabilities};
9use self::definition::DefinitionOptions;
10use self::document_highlight::DocumentHighlightOptions;
11use self::document_link::{DocumentLinkOptions, DocumentLinkResolveOptions};
12use self::document_symbol::DocumentSymbolOptions;
13use self::formatting::DocumentFormattingOptions;
14use self::hover::HoverOptions;
15use self::on_type_formatting::DocumentOnTypeFormattingOptions;
16use self::publish_diagnostics::PublishDiagnostics;
17use self::range_formatting::RangeFormattingOptions;
18use self::references::ReferenceOptions;
19use self::rename::RenameOptions;
20use self::signature_help::SignatureHelpOptions;
21use self::{
22 did_open::DidOpenOptions,
23 did_change::DidChangeOptions,
24 will_save::WillSaveOptions,
25 will_save_wait_until::WillSaveWaitUntilOptions,
26 did_save::DidSaveOptions,
27 did_close::DidCloseOptions
28};
29use serde::{Serialize, Deserialize};
30use serde_repr::Serialize_repr;
31
32pub mod did_open;
33pub mod did_change;
34pub mod will_save;
35pub mod will_save_wait_until;
36pub mod did_save;
37pub mod did_close;
38pub mod publish_diagnostics;
39pub mod completion;
40pub mod hover;
41pub mod signature_help;
42pub mod references;
43pub mod document_highlight;
44pub mod document_symbol;
45pub mod formatting;
46pub mod range_formatting;
47pub mod on_type_formatting;
48pub mod definition;
49pub mod code_action;
50pub mod code_lens;
51pub mod document_link;
52pub mod rename;
53
54pub type DocumentUri = String;
55
56#[derive(Deserialize, Debug)]
57#[serde(rename_all = "camelCase")]
58struct TextDocumentPositionParams {
59 pub text_document: TextDocumentIdentifer,
60 pub position: Position,
61}
62
63#[derive(Serialize, Deserialize, Debug)]
64#[serde(rename_all = "camelCase")]
65pub struct TextEdit {
66 pub range: Range,
67 pub new_text: String,
68}
69
70#[derive(Serialize, Debug)]
71pub struct Location {
72 pub uri: DocumentUri,
73 pub range: Range,
74}
75
76#[derive(Serialize, Deserialize, Debug)]
77pub struct TextDocumentIdentifer {
78 pub uri: DocumentUri,
79}
80
81#[derive(Deserialize, Serialize, Debug)]
82pub struct Position {
83 pub line: i32,
84 pub character: i32,
85}
86
87#[derive(Deserialize, Serialize, Debug)]
88pub struct Range {
89 pub start: Position,
90 pub end: Position,
91}
92
93#[derive(Deserialize, Debug)]
94pub struct VersionedTextDocumentIdentifier {
95 pub uri: DocumentUri,
96 pub version: i32,
97}
98
99#[derive(Deserialize, Default)]
100#[serde(default, rename_all = "camelCase")]
101pub(super) struct TextDocumentClientCapabilities {
102 completion: CompletionCapabilities
103}
104
105pub(super) struct TextDocumentService<T: TypeProvider> {
106 pub(super) sync_kind: TextDocumentSyncKind,
107 pub(super) did_open: Endpoint<T, DidOpenOptions>,
108 pub(super) did_change: Endpoint<T, DidChangeOptions>,
109 pub(super) will_save: Endpoint<T, WillSaveOptions>,
110 pub(super) will_save_wait_until: Endpoint<T, WillSaveWaitUntilOptions>,
111 pub(super) did_save: Endpoint<T, DidSaveOptions>,
112 pub(super) did_close: Endpoint<T, DidCloseOptions>,
113 #[allow(unused)]
114 publish_diagnostics: PublishDiagnostics,
115 pub(super) completion: Endpoint<T, CompletionOptions>,
116 pub(super) resolve_completion: Endpoint<T, ResolveCompletionOptions>,
117 pub(super) hover: Endpoint<T, HoverOptions>,
118 pub(super) signature_help: Endpoint<T, SignatureHelpOptions>,
119 pub(super) references: Endpoint<T, ReferenceOptions>,
120 pub(super) document_highlight: Endpoint<T, DocumentHighlightOptions>,
121 pub(super) document_symbol: Endpoint<T, DocumentSymbolOptions>,
122 pub(super) formatting: Endpoint<T, DocumentFormattingOptions>,
123 pub(super) range_formatting: Endpoint<T, RangeFormattingOptions>,
124 pub(super) on_type_formatting: Endpoint<T, DocumentOnTypeFormattingOptions>,
125 pub(super) definition: Endpoint<T, DefinitionOptions>,
126 pub(super) code_action: Endpoint<T, CodeActionOptions>,
127 pub(super) code_lens: Endpoint<T, CodeLensOptions>,
128 pub(super) resolve_code_lens: Endpoint<T, CodeLensResolveOptions>,
129 pub(super) document_link: Endpoint<T, DocumentLinkOptions>,
130 pub(super) resolve_document_link: Endpoint<T, DocumentLinkResolveOptions>,
131 pub(super) rename: Endpoint<T, RenameOptions>
132}
133
134#[repr(i32)]
135#[derive(Serialize_repr, Default, Clone, Copy)]
136pub enum TextDocumentSyncKind {
137 None = 0,
138 Full = 1,
139 #[default]
140 Incremental = 2
141}
142
143#[derive(Serialize)]
144#[serde(rename_all = "camelCase")]
145pub(crate) struct TextDocumentSyncOptions {
146 pub open_close: bool,
147 pub change: TextDocumentSyncKind,
148 pub will_save: bool,
149 pub will_save_wait_until: bool,
150 pub save: DidSaveOptions
151}
152
153impl<T: TypeProvider> TextDocumentService<T> {
154 pub(super) fn resolve(&self, method: &str) -> Option<Callback<Server<T>>> {
155 match method {
156 DidOpenOptions::METHOD => Some(self.did_open.callback()),
157 DidChangeOptions::METHOD => Some(self.did_change.callback()),
158 WillSaveOptions::METHOD => Some(self.will_save.callback()),
159 WillSaveWaitUntilOptions::METHOD => Some(self.will_save_wait_until.callback()),
160 DidSaveOptions::METHOD => Some(self.did_save.callback()),
161 DidCloseOptions::METHOD => Some(self.did_close.callback()),
162 CompletionOptions::METHOD => Some(self.completion.callback()),
163 ResolveCompletionOptions::METHOD => Some(self.resolve_completion.callback()),
164 HoverOptions::METHOD => Some(self.hover.callback()),
165 SignatureHelpOptions::METHOD => Some(self.signature_help.callback()),
166 ReferenceOptions::METHOD => Some(self.references.callback()),
167 DocumentHighlightOptions::METHOD => Some(self.document_highlight.callback()),
168 DocumentSymbolOptions::METHOD => Some(self.document_symbol.callback()),
169 DocumentFormattingOptions::METHOD => Some(self.formatting.callback()),
170 RangeFormattingOptions::METHOD => Some(self.range_formatting.callback()),
171 DocumentOnTypeFormattingOptions::METHOD => Some(self.on_type_formatting.callback()),
172 DefinitionOptions::METHOD => Some(self.definition.callback()),
173 CodeActionOptions::METHOD => Some(self.code_action.callback()),
174 CodeLensOptions::METHOD => Some(self.code_lens.callback()),
175 CodeLensResolveOptions::METHOD => Some(self.resolve_code_lens.callback()),
176 DocumentLinkOptions::METHOD => Some(self.document_link.callback()),
177 DocumentLinkResolveOptions::METHOD => Some(self.resolve_document_link.callback()),
178 RenameOptions::METHOD => Some(self.rename.callback()),
179 _ => None
180 }
181 }
182}
183
184impl<T: TypeProvider> Default for TextDocumentService<T> {
185 fn default() -> Self {
186 TextDocumentService {
187 sync_kind: Default::default(),
188 did_open: DidOpenOptions::endpoint(),
189 did_change: DidChangeOptions::endpoint(),
190 will_save: WillSaveOptions::endpoint(),
191 will_save_wait_until: WillSaveWaitUntilOptions::endpoint(),
192 did_save: DidSaveOptions::endpoint(),
193 did_close: DidCloseOptions::endpoint(),
194 publish_diagnostics: Default::default(),
195 completion: CompletionOptions::endpoint(),
196 resolve_completion: ResolveCompletionOptions::endpoint(),
197 hover: HoverOptions::endpoint(),
198 signature_help: SignatureHelpOptions::endpoint(),
199 references: ReferenceOptions::endpoint(),
200 document_highlight: DocumentHighlightOptions::endpoint(),
201 document_symbol: DocumentSymbolOptions::endpoint(),
202 formatting: DocumentFormattingOptions::endpoint(),
203 range_formatting: RangeFormattingOptions::endpoint(),
204 on_type_formatting: DocumentOnTypeFormattingOptions::endpoint(),
205 definition: DefinitionOptions::endpoint(),
206 code_action: CodeActionOptions::endpoint(),
207 code_lens: CodeLensOptions::endpoint(),
208 resolve_code_lens: CodeLensResolveOptions::endpoint(),
209 document_link: DocumentLinkOptions::endpoint(),
210 resolve_document_link: DocumentLinkResolveOptions::endpoint(),
211 rename: RenameOptions::endpoint()
212 }
213 }
214}
215
216impl<T: TypeProvider> Server<T> {
217 pub fn set_document_sync(&mut self, sync_kind: TextDocumentSyncKind) {
218 self.text_document.sync_kind = sync_kind;
219 }
220}