sync_lsp/text_document/
mod.rs

1//! A module containing all text document related functionality.
2
3use 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}