diff --git a/Cargo.lock b/Cargo.lock index 98a9487..046f48b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,22 +9,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "form_urlencoded" -version = "1.2.1" +name = "fluent-uri" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" dependencies = [ - "percent-encoding", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", + "bitflags", ] [[package]] @@ -35,15 +25,15 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "lsp-types" -version = "0.93.2" +version = "0.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be6e9c7e2d18f651974370d7aff703f9513e0df6e464fd795660edc77e6ca51" +checksum = "53353550a17c04ac46c585feb189c2db82154fc84b79c7a66c96c2c644f66071" dependencies = [ "bitflags", + "fluent-uri", "serde", "serde_json", "serde_repr", - "url", ] [[package]] @@ -55,12 +45,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - [[package]] name = "proc-macro2" version = "1.0.75" @@ -138,50 +122,8 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "unicode-bidi" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] diff --git a/Cargo.toml b/Cargo.toml index 49114fb..fa6eac5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ debug = [] [dependencies] serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.85" -lsp-types = { version = "0.93.2", features = ["proposed"] } +lsp-types = { version = "0.97", features = ["proposed"] } [lib] path = "src/lib.rs" diff --git a/src/lib.rs b/src/lib.rs index b34849b..1cb7b48 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ use std::collections::HashMap; use std::fs::File; use std::io::{stdout, Read, Write}; use std::path::Path; +use std::str::FromStr; use std::sync::mpsc::{Receiver, Sender}; use std::time::Duration; @@ -13,19 +14,22 @@ use lsp_types::{ ClientCapabilities, CodeAction, CodeActionClientCapabilities, CodeActionContext, CodeActionParams, CodeActionResponse, CodeLens, CodeLensParams, CompletionClientCapabilities, CompletionContext, CompletionItem, CompletionParams, CompletionResponse, CompletionTriggerKind, - DidChangeTextDocumentParams, DidOpenTextDocumentParams, DidSaveTextDocumentParams, - DocumentLinkClientCapabilities, DocumentSymbolClientCapabilities, DocumentSymbolParams, - DocumentSymbolResponse, DynamicRegistrationClientCapabilities, FoldingRange, - FoldingRangeClientCapabilities, FoldingRangeParams, GotoCapability, GotoDefinitionParams, - GotoDefinitionResponse, Hover, HoverClientCapabilities, HoverParams, InitializeParams, - InitializeResult, InitializedParams, InlayHint, InlayHintClientCapabilities, InlayHintParams, - Location, MarkupKind, Position, PublishDiagnosticsClientCapabilities, PublishDiagnosticsParams, - Range, ReferenceContext, ReferenceParams, RenameClientCapabilities, RenameParams, - SelectionRangeClientCapabilities, SemanticTokensClientCapabilities, ServerCapabilities, - SignatureHelp, SignatureHelpClientCapabilities, SignatureHelpContext, SignatureHelpParams, - SignatureHelpTriggerKind, TextDocumentClientCapabilities, TextDocumentContentChangeEvent, - TextDocumentIdentifier, TextDocumentItem, TextDocumentPositionParams, - TextDocumentSyncClientCapabilities, Url, VersionedTextDocumentIdentifier, WorkspaceEdit, + DiagnosticClientCapabilities, DidChangeTextDocumentParams, DidOpenTextDocumentParams, + DidSaveTextDocumentParams, DocumentLinkClientCapabilities, DocumentSymbolClientCapabilities, + DocumentSymbolParams, DocumentSymbolResponse, DynamicRegistrationClientCapabilities, + FoldingRange, FoldingRangeClientCapabilities, FoldingRangeParams, GeneralClientCapabilities, + GotoCapability, GotoDefinitionParams, GotoDefinitionResponse, Hover, HoverClientCapabilities, + HoverParams, InitializeParams, InitializeResult, InitializedParams, InlayHint, + InlayHintClientCapabilities, InlayHintParams, InlineCompletionClientCapabilities, Location, + MarkupKind, NotebookDocumentClientCapabilities, Position, PublishDiagnosticsClientCapabilities, + PublishDiagnosticsParams, Range, ReferenceContext, ReferenceParams, RenameClientCapabilities, + RenameParams, SelectionRangeClientCapabilities, SemanticTokensClientCapabilities, + ServerCapabilities, SignatureHelp, SignatureHelpClientCapabilities, SignatureHelpContext, + SignatureHelpParams, SignatureHelpTriggerKind, TextDocumentClientCapabilities, + TextDocumentContentChangeEvent, TextDocumentIdentifier, TextDocumentItem, + TextDocumentPositionParams, TextDocumentSyncClientCapabilities, Uri, + VersionedTextDocumentIdentifier, WindowClientCapabilities, WorkspaceClientCapabilities, + WorkspaceEdit, }; use serde::de::Deserialize; use serde::Serialize; @@ -96,7 +100,7 @@ pub fn delete_line(line: u32) -> TextDocumentContentChangeEvent { } /// Indicates an absolute position in the document. -pub fn abs_pos(uri: Url, line: u32, col: u32) -> TextDocumentPositionParams { +pub fn abs_pos(uri: Uri, line: u32, col: u32) -> TextDocumentPositionParams { TextDocumentPositionParams { text_document: TextDocumentIdentifier::new(uri), position: Position { @@ -238,9 +242,7 @@ impl FakeClient { }), references: Some(DynamicRegistrationClientCapabilities::default()), document_highlight: Some(DynamicRegistrationClientCapabilities::default()), - document_symbol: Some(DocumentSymbolClientCapabilities { - ..Default::default() - }), + document_symbol: Some(DocumentSymbolClientCapabilities::default()), formatting: Some(DynamicRegistrationClientCapabilities::default()), range_formatting: Some(DynamicRegistrationClientCapabilities::default()), on_type_formatting: Some(DynamicRegistrationClientCapabilities::default()), @@ -278,23 +280,27 @@ impl FakeClient { related_information: Some(true), ..Default::default() }), - folding_range: Some(FoldingRangeClientCapabilities { - ..Default::default() - }), - selection_range: Some(SelectionRangeClientCapabilities { - ..Default::default() - }), + folding_range: Some(FoldingRangeClientCapabilities::default()), + selection_range: Some(SelectionRangeClientCapabilities::default()), linked_editing_range: Some(DynamicRegistrationClientCapabilities::default()), call_hierarchy: Some(DynamicRegistrationClientCapabilities::default()), - semantic_tokens: Some(SemanticTokensClientCapabilities { - ..Default::default() - }), + semantic_tokens: Some(SemanticTokensClientCapabilities::default()), moniker: Some(DynamicRegistrationClientCapabilities::default()), - inlay_hint: Some(InlayHintClientCapabilities { - ..Default::default() - }), + inlay_hint: Some(InlayHintClientCapabilities::default()), + type_hierarchy: Some(DynamicRegistrationClientCapabilities::default()), + inline_value: Some(DynamicRegistrationClientCapabilities::default()), + diagnostic: Some(DiagnosticClientCapabilities::default()), + inline_completion: Some(InlineCompletionClientCapabilities::default()), }), - ..Default::default() + workspace: Some(WorkspaceClientCapabilities { + workspace_folders: Some(true), + ..Default::default() + }), + notebook_document: Some(NotebookDocumentClientCapabilities::default()), + window: Some(WindowClientCapabilities::default()), + general: Some(GeneralClientCapabilities::default()), + offset_encoding: None, + experimental: None, }, server_capas: None, handlers: HashMap::new(), @@ -302,8 +308,15 @@ impl FakeClient { } } - pub fn with_capabilities(server: LS, receiver: Receiver, client_capas: ClientCapabilities) -> Self { - FakeClient { client_capas, ..FakeClient::new(server, receiver) } + pub fn with_capabilities( + server: LS, + receiver: Receiver, + client_capas: ClientCapabilities, + ) -> Self { + FakeClient { + client_capas, + ..FakeClient::new(server, receiver) + } } /// Adds a handler for the request/notification with the given method name. @@ -403,7 +416,10 @@ impl FakeClient { { let start = std::time::Instant::now(); loop { - if let Ok(msg) = self.receiver.recv_timeout(std::time::Duration::from_millis(10)) { + if let Ok(msg) = self + .receiver + .recv_timeout(std::time::Duration::from_millis(10)) + { if msg.get("method").is_some() { self.handle_server_message(&msg); } @@ -504,9 +520,15 @@ impl FakeClient { /// Send a `textDocument/didOpen` notification to the server. pub fn notify_open(&mut self, file: &str) -> Result<()> { - let uri = Url::from_file_path(Path::new(file).canonicalize().unwrap()).unwrap(); + let uri = Uri::from_str( + Path::new(file) + .canonicalize()? + .as_os_str() + .to_string_lossy() + .as_ref() + )?; let mut text = String::new(); - File::open(file).unwrap().read_to_string(&mut text)?; + File::open(file)?.read_to_string(&mut text)?; let params = DidOpenTextDocumentParams { text_document: TextDocumentItem::new(uri, "erg".to_string(), self.ver, text), }; @@ -523,7 +545,7 @@ impl FakeClient { /// Send a `textDocument/didChange` notification to the server. pub fn notify_change( &mut self, - uri: Url, + uri: Uri, change: TextDocumentContentChangeEvent, ) -> Result<()> { let params = DidChangeTextDocumentParams { @@ -541,7 +563,7 @@ impl FakeClient { } /// Send a `textDocument/didSave` notification to the server. - pub fn notify_save(&mut self, uri: Url) -> Result<()> { + pub fn notify_save(&mut self, uri: Uri) -> Result<()> { let params = DidSaveTextDocumentParams { text_document: TextDocumentIdentifier::new(uri), text: None, @@ -556,7 +578,7 @@ impl FakeClient { } /// Send a `textDocument/didClose` notification to the server. - pub fn notify_close(&mut self, uri: Url) -> Result<()> { + pub fn notify_close(&mut self, uri: Uri) -> Result<()> { let params = TextDocumentIdentifier::new(uri); let msg = json!({ "jsonrpc": "2.0", @@ -591,7 +613,7 @@ impl FakeClient { /// Send a `textDocument/completion` request to the server. pub fn request_completion( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, character: &str, @@ -643,7 +665,7 @@ impl FakeClient { /// Send a `textDocument/rename` request to the server. pub fn request_rename( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, new_name: &str, @@ -667,7 +689,7 @@ impl FakeClient { /// Send a `textDocument/signatureHelp` request to the server. pub fn request_signature_help( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, character: &str, @@ -695,7 +717,7 @@ impl FakeClient { } /// Send a `textDocument/hover` request to the server. - pub fn request_hover(&mut self, uri: Url, line: u32, col: u32) -> Result> { + pub fn request_hover(&mut self, uri: Uri, line: u32, col: u32) -> Result> { let params = HoverParams { text_document_position_params: abs_pos(uri, line, col), work_done_progress_params: Default::default(), @@ -713,7 +735,7 @@ impl FakeClient { /// Send a `textDocument/references` request to the server. pub fn request_references( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, ) -> Result>> { @@ -739,7 +761,7 @@ impl FakeClient { /// Send a `textDocument/definition` request to the server. pub fn request_goto_definition( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, ) -> Result> { @@ -759,7 +781,7 @@ impl FakeClient { } /// Send a `textDocument/foldingRange` request to the server. - pub fn request_folding_range(&mut self, uri: Url) -> Result>> { + pub fn request_folding_range(&mut self, uri: Uri) -> Result>> { let params = FoldingRangeParams { text_document: TextDocumentIdentifier::new(uri), work_done_progress_params: Default::default(), @@ -776,7 +798,7 @@ impl FakeClient { } /// Send a `textDocument/documentSymbol` request to the server. - pub fn request_document_symbols(&mut self, uri: Url) -> Result> { + pub fn request_document_symbols(&mut self, uri: Uri) -> Result> { let params = DocumentSymbolParams { text_document: TextDocumentIdentifier::new(uri), work_done_progress_params: Default::default(), @@ -793,7 +815,7 @@ impl FakeClient { } /// Send a `textDocument/inlayHint` request to the server. - pub fn request_inlay_hint(&mut self, uri: Url) -> Result>> { + pub fn request_inlay_hint(&mut self, uri: Uri) -> Result>> { let params = InlayHintParams { text_document: TextDocumentIdentifier::new(uri), range: Range { @@ -821,7 +843,7 @@ impl FakeClient { /// Send a `textDocument/codeAction` request to the server. pub fn request_code_action( &mut self, - uri: Url, + uri: Uri, line: u32, col: u32, ) -> Result> { @@ -839,6 +861,7 @@ impl FakeClient { }, context: CodeActionContext { diagnostics: vec![], + trigger_kind: None, only: None, }, work_done_progress_params: Default::default(), @@ -866,7 +889,7 @@ impl FakeClient { } /// Send a `textDocument/codeLens` request to the server. - pub fn request_code_lens(&mut self, uri: Url) -> Result>> { + pub fn request_code_lens(&mut self, uri: Uri) -> Result>> { let params = CodeLensParams { text_document: TextDocumentIdentifier::new(uri), work_done_progress_params: Default::default(),