From 233fdb12cee6aa160579cfded171fa4c2f82b29c Mon Sep 17 00:00:00 2001 From: kjeremy Date: Mon, 16 Nov 2020 15:10:13 -0500 Subject: Latest LSP 3.16 protocol Pulls in https://github.com/gluon-lang/lsp-types/pull/186 --- Cargo.lock | 8 ++++---- crates/rust-analyzer/Cargo.toml | 4 ++-- crates/rust-analyzer/src/caps.rs | 1 + crates/rust-analyzer/src/diagnostics/to_proto.rs | 4 ++-- crates/rust-analyzer/src/document.rs | 6 +++--- crates/rust-analyzer/src/global_state.rs | 4 ++-- crates/rust-analyzer/src/lsp_ext.rs | 2 +- crates/rust-analyzer/src/lsp_utils.rs | 6 +++--- crates/rust-analyzer/src/main_loop.rs | 4 ++-- crates/rust-analyzer/src/to_proto.rs | 18 ++++++++---------- crates/rust-analyzer/tests/rust-analyzer/support.rs | 4 ++-- docs/dev/lsp-extensions.md | 4 ++-- 12 files changed, 32 insertions(+), 33 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 715a80978..09215a37a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -852,9 +852,9 @@ dependencies = [ [[package]] name = "lsp-server" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c85acaf36c53bf15da2b8b35afeea56747707261f59eb0b77229081dd72b04e" +checksum = "69b18dfe0e4a380b872aa79d8e0ee6c3d7a9682466e84b83ad807c88b3545f79" dependencies = [ "crossbeam-channel 0.5.0", "log", @@ -864,9 +864,9 @@ dependencies = [ [[package]] name = "lsp-types" -version = "0.83.0" +version = "0.83.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e0bd4b95038f2c23bda332ba0ca684e8dda765db1f9bdb63dc4c3e01f3b456" +checksum = "c4e79f39834b97271f9f5ecec573e42c7d9c5bdbd2620b30a851054ece6aab6d" dependencies = [ "base64", "bitflags", diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml index d25c4bf83..56c51486f 100644 --- a/crates/rust-analyzer/Cargo.toml +++ b/crates/rust-analyzer/Cargo.toml @@ -21,7 +21,7 @@ env_logger = { version = "0.8.1", default-features = false } itertools = "0.9.0" jod-thread = "0.1.0" log = "0.4.8" -lsp-types = { version = "0.83.0", features = ["proposed"] } +lsp-types = { version = "0.83.1", features = ["proposed"] } parking_lot = "0.11.0" pico-args = "0.3.1" oorandom = "11.1.2" @@ -31,7 +31,7 @@ serde_json = "1.0.48" threadpool = "1.7.1" rayon = "1.5" mimalloc = { version = "0.1.19", default-features = false, optional = true } -lsp-server = "0.4.0" +lsp-server = "0.5.0" tracing = "0.1" tracing-subscriber = { version = "0.2", default-features = false, features = ["env-filter", "registry"] } tracing-tree = { version = "0.1.4" } diff --git a/crates/rust-analyzer/src/caps.rs b/crates/rust-analyzer/src/caps.rs index 9a8870053..c7203451c 100644 --- a/crates/rust-analyzer/src/caps.rs +++ b/crates/rust-analyzer/src/caps.rs @@ -62,6 +62,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti prepare_provider: Some(true), work_done_progress_options: WorkDoneProgressOptions { work_done_progress: None }, })), + on_type_rename_provider: None, document_link_provider: None, color_provider: None, execute_command_provider: None, diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs index 15145415b..93bef5c8b 100644 --- a/crates/rust-analyzer/src/diagnostics/to_proto.rs +++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs @@ -55,8 +55,8 @@ fn location_naive(workspace_root: &Path, span: &DiagnosticSpan) -> lsp_types::Lo // FIXME: this doesn't handle UTF16 offsets correctly let range = lsp_types::Range::new( - lsp_types::Position::new(span.line_start as u64 - 1, span.column_start as u64 - 1), - lsp_types::Position::new(span.line_end as u64 - 1, span.column_end as u64 - 1), + lsp_types::Position::new(span.line_start as u32 - 1, span.column_start as u32 - 1), + lsp_types::Position::new(span.line_end as u32 - 1, span.column_end as u32 - 1), ); lsp_types::Location { uri, range } diff --git a/crates/rust-analyzer/src/document.rs b/crates/rust-analyzer/src/document.rs index 04c7ee150..cf091510f 100644 --- a/crates/rust-analyzer/src/document.rs +++ b/crates/rust-analyzer/src/document.rs @@ -6,11 +6,11 @@ /// client notifications. #[derive(Debug, Clone)] pub(crate) struct DocumentData { - pub(crate) version: Option, + pub(crate) version: i32, } impl DocumentData { - pub(crate) fn new(version: i64) -> Self { - DocumentData { version: Some(version) } + pub(crate) fn new(version: i32) -> Self { + DocumentData { version } } } diff --git a/crates/rust-analyzer/src/global_state.rs b/crates/rust-analyzer/src/global_state.rs index 63c70a09d..defe11c55 100644 --- a/crates/rust-analyzer/src/global_state.rs +++ b/crates/rust-analyzer/src/global_state.rs @@ -263,9 +263,9 @@ impl GlobalStateSnapshot { self.vfs.read().1[&id] } - pub(crate) fn url_file_version(&self, url: &Url) -> Option { + pub(crate) fn url_file_version(&self, url: &Url) -> Option { let path = from_proto::vfs_path(&url).ok()?; - self.mem_docs.get(&path)?.version + Some(self.mem_docs.get(&path)?.version) } pub(crate) fn anchored_path(&self, file_id: FileId, path: &str) -> Url { diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs index a5c65fa3e..93ac45415 100644 --- a/crates/rust-analyzer/src/lsp_ext.rs +++ b/crates/rust-analyzer/src/lsp_ext.rs @@ -302,7 +302,7 @@ pub enum SnippetDocumentChangeOperation { #[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct SnippetTextDocumentEdit { - pub text_document: lsp_types::VersionedTextDocumentIdentifier, + pub text_document: lsp_types::OptionalVersionedTextDocumentIdentifier, pub edits: Vec, } diff --git a/crates/rust-analyzer/src/lsp_utils.rs b/crates/rust-analyzer/src/lsp_utils.rs index 1d271a9d8..6427c7367 100644 --- a/crates/rust-analyzer/src/lsp_utils.rs +++ b/crates/rust-analyzer/src/lsp_utils.rs @@ -51,7 +51,7 @@ impl GlobalState { } let percentage = fraction.map(|f| { assert!(0.0 <= f && f <= 1.0); - f * 100.0 + (f * 100.0) as u32 }); let token = lsp_types::ProgressToken::String(format!("rustAnalyzer/{}", title)); let work_done_progress = match state { @@ -98,11 +98,11 @@ pub(crate) fn apply_document_changes( // The VFS will normalize the end of lines to `\n`. enum IndexValid { All, - UpToLineExclusive(u64), + UpToLineExclusive(u32), } impl IndexValid { - fn covers(&self, line: u64) -> bool { + fn covers(&self, line: u32) -> bool { match *self { IndexValid::UpToLineExclusive(to) => to > line, _ => true, diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index 68a53bbcb..6ea08adce 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -368,7 +368,7 @@ impl GlobalState { let url = file_id_to_url(&self.vfs.read().0, file_id); let diagnostics = self.diagnostics.diagnostics_for(file_id).cloned().collect(); let version = from_proto::vfs_path(&url) - .map(|path| self.mem_docs.get(&path)?.version) + .map(|path| self.mem_docs.get(&path).map(|it| it.version)) .unwrap_or_default(); self.send_notification::( @@ -521,7 +521,7 @@ impl GlobalState { let mut version = None; if let Ok(path) = from_proto::vfs_path(¶ms.text_document.uri) { match this.mem_docs.remove(&path) { - Some(doc) => version = doc.version, + Some(doc) => version = Some(doc.version), None => log::error!("orphan DidCloseTextDocument: {}", path), } diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 4bdf4bf0f..2f35425bb 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -21,9 +21,7 @@ use crate::{ pub(crate) fn position(line_index: &LineIndex, offset: TextSize) -> lsp_types::Position { let line_col = line_index.line_col(offset); - let line = u64::from(line_col.line); - let character = u64::from(line_col.col_utf16); - lsp_types::Position::new(line, character) + lsp_types::Position::new(line_col.line, line_col.col_utf16) } pub(crate) fn range(line_index: &LineIndex, range: TextRange) -> lsp_types::Range { @@ -278,9 +276,9 @@ pub(crate) fn signature_help( label.push_str(", "); } first = false; - let start = label.len() as u64; + let start = label.len() as u32; label.push_str(param); - let end = label.len() as u64; + let end = label.len() as u32; params.push(lsp_types::ParameterInformation { label: lsp_types::ParameterLabel::LabelOffsets([start, end]), documentation: None, @@ -302,7 +300,7 @@ pub(crate) fn signature_help( }) }; - let active_parameter = call_info.active_parameter.map(|it| it as i64); + let active_parameter = call_info.active_parameter.map(|it| it as u32); let signature = lsp_types::SignatureInformation { label, @@ -518,13 +516,13 @@ pub(crate) fn url_from_abs_path(path: &Path) -> lsp_types::Url { lsp_types::Url::parse(&url).unwrap() } -pub(crate) fn versioned_text_document_identifier( +pub(crate) fn optional_versioned_text_document_identifier( snap: &GlobalStateSnapshot, file_id: FileId, -) -> lsp_types::VersionedTextDocumentIdentifier { +) -> lsp_types::OptionalVersionedTextDocumentIdentifier { let url = url(snap, file_id); let version = snap.url_file_version(&url); - lsp_types::VersionedTextDocumentIdentifier { uri: url, version } + lsp_types::OptionalVersionedTextDocumentIdentifier { uri: url, version } } pub(crate) fn location( @@ -613,7 +611,7 @@ pub(crate) fn snippet_text_document_edit( is_snippet: bool, source_file_edit: SourceFileEdit, ) -> Result { - let text_document = versioned_text_document_identifier(snap, source_file_edit.file_id); + let text_document = optional_versioned_text_document_identifier(snap, source_file_edit.file_id); let line_index = snap.analysis.file_line_index(source_file_edit.file_id)?; let line_endings = snap.file_line_endings(source_file_edit.file_id); let edits = source_file_edit diff --git a/crates/rust-analyzer/tests/rust-analyzer/support.rs b/crates/rust-analyzer/tests/rust-analyzer/support.rs index b210b98f0..456125789 100644 --- a/crates/rust-analyzer/tests/rust-analyzer/support.rs +++ b/crates/rust-analyzer/tests/rust-analyzer/support.rs @@ -108,7 +108,7 @@ pub(crate) fn project(fixture: &str) -> Server { } pub(crate) struct Server { - req_id: Cell, + req_id: Cell, messages: RefCell>, _thread: jod_thread::JoinHandle<()>, client: Connection, @@ -165,7 +165,7 @@ impl Server { R::Params: Serialize, { let id = self.req_id.get(); - self.req_id.set(id + 1); + self.req_id.set(id.wrapping_add(1)); let r = Request::new(id.into(), R::METHOD.to_string(), params); self.send_request_(r) diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md index db9727bee..8c01db07c 100644 --- a/docs/dev/lsp-extensions.md +++ b/docs/dev/lsp-extensions.md @@ -1,5 +1,5 @@