diff --git a/Cargo.lock b/Cargo.lock index 5c7bcb17b06b..fe211b9b30fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -852,9 +852,9 @@ dependencies = [ [[package]] name = "lsp-types" -version = "0.82.0" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db895abb8527cf59e3de893ab2acf52cf904faeb65e60ea6f373e11fe86464e8" +checksum = "25e0bd4b95038f2c23bda332ba0ca684e8dda765db1f9bdb63dc4c3e01f3b456" dependencies = [ "base64", "bitflags", diff --git a/crates/rust-analyzer/Cargo.toml b/crates/rust-analyzer/Cargo.toml index 975b24aaf1b9..d25c4bf83747 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.82.0", features = ["proposed"] } +lsp-types = { version = "0.83.0", features = ["proposed"] } parking_lot = "0.11.0" pico-args = "0.3.1" oorandom = "11.1.2" diff --git a/crates/rust-analyzer/src/caps.rs b/crates/rust-analyzer/src/caps.rs index c589afeafcfc..ff1ae9575ffa 100644 --- a/crates/rust-analyzer/src/caps.rs +++ b/crates/rust-analyzer/src/caps.rs @@ -48,7 +48,7 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti references_provider: Some(OneOf::Left(true)), document_highlight_provider: Some(OneOf::Left(true)), document_symbol_provider: Some(OneOf::Left(true)), - workspace_symbol_provider: Some(true), + workspace_symbol_provider: Some(OneOf::Left(true)), code_action_provider: Some(code_action_provider), code_lens_provider: Some(CodeLensOptions { resolve_provider: Some(true) }), document_formatting_provider: Some(OneOf::Left(true)), @@ -113,6 +113,7 @@ fn code_action_capabilities(client_caps: &ClientCapabilities) -> CodeActionProvi CodeActionKind::REFACTOR_INLINE, CodeActionKind::REFACTOR_REWRITE, ]), + resolve_provider: None, work_done_progress_options: Default::default(), }) }) diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 1b9b24698a96..2ed6a0d82e21 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -47,6 +47,7 @@ pub struct Config { pub call_info_full: bool, pub lens: LensConfig, pub hover: HoverConfig, + pub semantic_tokens_refresh: bool, pub with_sysroot: bool, pub linked_projects: Vec, @@ -193,6 +194,7 @@ impl Config { call_info_full: true, lens: LensConfig::default(), hover: HoverConfig::default(), + semantic_tokens_refresh: false, linked_projects: Vec::new(), root_path, } @@ -402,6 +404,14 @@ impl Config { self.client_caps.hover_actions = get_bool("hoverActions"); self.client_caps.status_notification = get_bool("statusNotification"); } + + if let Some(workspace_caps) = caps.workspace.as_ref() { + if let Some(refresh_support) = + workspace_caps.semantic_tokens.as_ref().and_then(|it| it.refresh_support) + { + self.semantic_tokens_refresh = refresh_support; + } + } } } diff --git a/crates/rust-analyzer/src/diagnostics/test_data/clippy_pass_by_ref.txt b/crates/rust-analyzer/src/diagnostics/test_data/clippy_pass_by_ref.txt index d0651712607d..58d47d32a422 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/clippy_pass_by_ref.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/clippy_pass_by_ref.txt @@ -20,6 +20,7 @@ "trivially_copy_pass_by_ref", ), ), + code_description: None, source: Some( "clippy", ), @@ -61,6 +62,7 @@ ], ), tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/handles_macro_location.txt b/crates/rust-analyzer/src/diagnostics/test_data/handles_macro_location.txt index f5de2f07f3a0..6aa26bf63ab2 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/handles_macro_location.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/handles_macro_location.txt @@ -20,12 +20,14 @@ "E0277", ), ), + code_description: None, source: Some( "rustc", ), message: "can\'t compare `{integer}` with `&str`\nthe trait `std::cmp::PartialEq<&str>` is not implemented for `{integer}`", related_information: None, tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/macro_compiler_error.txt b/crates/rust-analyzer/src/diagnostics/test_data/macro_compiler_error.txt index 00e8da8a70c8..7aaffaba251d 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/macro_compiler_error.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/macro_compiler_error.txt @@ -16,6 +16,7 @@ Error, ), code: None, + code_description: None, source: Some( "rustc", ), @@ -41,6 +42,7 @@ ], ), tags: None, + data: None, }, fixes: [], }, @@ -61,6 +63,7 @@ Error, ), code: None, + code_description: None, source: Some( "rustc", ), @@ -86,6 +89,7 @@ ], ), tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_incompatible_type_for_trait.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_incompatible_type_for_trait.txt index fc54440be238..584213420016 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_incompatible_type_for_trait.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_incompatible_type_for_trait.txt @@ -20,12 +20,14 @@ "E0053", ), ), + code_description: None, source: Some( "rustc", ), message: "method `next` has an incompatible type for trait\nexpected type `fn(&mut ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&ty::Ref>`\n found type `fn(&ty::list_iter::ListIterator<\'list, M>) -> std::option::Option<&\'list ty::Ref>`", related_information: None, tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_mismatched_type.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_mismatched_type.txt index c269af218ce8..2610e4e209ad 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_mismatched_type.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_mismatched_type.txt @@ -20,12 +20,14 @@ "E0308", ), ), + code_description: None, source: Some( "rustc", ), message: "mismatched types\nexpected usize, found u32", related_information: None, tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable.txt index 74d91bc77c81..8dc53391e941 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable.txt @@ -20,6 +20,7 @@ "unused_variables", ), ), + code_description: None, source: Some( "rustc", ), @@ -30,6 +31,7 @@ Unnecessary, ], ), + data: None, }, fixes: [ CodeAction { diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_hint.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_hint.txt index 8a420c9495c1..c8703194c838 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_hint.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_hint.txt @@ -20,6 +20,7 @@ "unused_variables", ), ), + code_description: None, source: Some( "rustc", ), @@ -30,6 +31,7 @@ Unnecessary, ], ), + data: None, }, fixes: [ CodeAction { diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_info.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_info.txt index 79910660b7f8..dc93227adf44 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_info.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_unused_variable_as_info.txt @@ -20,6 +20,7 @@ "unused_variables", ), ), + code_description: None, source: Some( "rustc", ), @@ -30,6 +31,7 @@ Unnecessary, ], ), + data: None, }, fixes: [ CodeAction { diff --git a/crates/rust-analyzer/src/diagnostics/test_data/rustc_wrong_number_of_parameters.txt b/crates/rust-analyzer/src/diagnostics/test_data/rustc_wrong_number_of_parameters.txt index efe37261db3a..ba1b98b335e1 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/rustc_wrong_number_of_parameters.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/rustc_wrong_number_of_parameters.txt @@ -20,6 +20,7 @@ "E0061", ), ), + code_description: None, source: Some( "rustc", ), @@ -45,6 +46,7 @@ ], ), tags: None, + data: None, }, fixes: [], }, diff --git a/crates/rust-analyzer/src/diagnostics/test_data/snap_multi_line_fix.txt b/crates/rust-analyzer/src/diagnostics/test_data/snap_multi_line_fix.txt index 4f811ab64bf7..81f752672f03 100644 --- a/crates/rust-analyzer/src/diagnostics/test_data/snap_multi_line_fix.txt +++ b/crates/rust-analyzer/src/diagnostics/test_data/snap_multi_line_fix.txt @@ -20,6 +20,7 @@ "let_and_return", ), ), + code_description: None, source: Some( "clippy", ), @@ -45,6 +46,7 @@ ], ), tags: None, + data: None, }, fixes: [ CodeAction { diff --git a/crates/rust-analyzer/src/diagnostics/to_proto.rs b/crates/rust-analyzer/src/diagnostics/to_proto.rs index 33606edda4b0..b949577c13d6 100644 --- a/crates/rust-analyzer/src/diagnostics/to_proto.rs +++ b/crates/rust-analyzer/src/diagnostics/to_proto.rs @@ -248,10 +248,12 @@ pub(crate) fn map_rust_diagnostic_to_lsp( range: in_macro_location.range, severity, code: code.clone().map(lsp_types::NumberOrString::String), + code_description: None, source: Some(source.clone()), message: message.clone(), related_information: Some(information_for_additional_diagnostic), tags: if tags.is_empty() { None } else { Some(tags.clone()) }, + data: None, }; Some(MappedRustDiagnostic { @@ -267,6 +269,7 @@ pub(crate) fn map_rust_diagnostic_to_lsp( range: location.range, severity, code: code.clone().map(lsp_types::NumberOrString::String), + code_description: None, source: Some(source.clone()), message, related_information: if related_information.is_empty() { @@ -275,6 +278,7 @@ pub(crate) fn map_rust_diagnostic_to_lsp( Some(related_information.clone()) }, tags: if tags.is_empty() { None } else { Some(tags.clone()) }, + data: None, }; let main_diagnostic = diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 2680e5f08bce..049c583a42cb 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -1121,10 +1121,12 @@ pub(crate) fn publish_diagnostics( range: to_proto::range(&line_index, d.range), severity: Some(to_proto::diagnostic_severity(d.severity)), code: None, + code_description: None, source: Some("rust-analyzer".to_string()), message: d.message, related_information: None, tags: if d.unused { Some(vec![DiagnosticTag::Unnecessary]) } else { None }, + data: None, }) .collect(); Ok(diagnostics) diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs index ed5292733043..ff855fe1a642 100644 --- a/crates/rust-analyzer/src/main_loop.rs +++ b/crates/rust-analyzer/src/main_loop.rs @@ -330,6 +330,12 @@ impl GlobalState { .collect::>(); self.update_file_notifications_on_threadpool(subscriptions); + + // Refresh semantic tokens if the client supports it. + if self.config.semantic_tokens_refresh { + self.semantic_tokens_cache.lock().clear(); + self.send_request::((), |_, _| ()); + } } if let Some(diagnostic_changes) = self.diagnostics.take_changes() { diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 24a658fc653d..92b7c7b68107 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -709,7 +709,16 @@ pub(crate) fn call_hierarchy_item( let detail = target.description.clone(); let kind = symbol_kind(target.kind); let (uri, range, selection_range) = location_info(snap, target)?; - Ok(lsp_types::CallHierarchyItem { name, kind, tags: None, detail, uri, range, selection_range }) + Ok(lsp_types::CallHierarchyItem { + name, + kind, + tags: None, + detail, + uri, + range, + selection_range, + data: None, + }) } pub(crate) fn code_action_kind(kind: AssistKind) -> lsp_types::CodeActionKind { diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json index 33d60d4ddff6..83ef00058e45 100644 --- a/editors/code/package-lock.json +++ b/editors/code/package-lock.json @@ -2409,32 +2409,32 @@ } }, "vscode-jsonrpc": { - "version": "6.0.0-next.5", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.5.tgz", - "integrity": "sha512-IAgsltQPwg/pXOPsdXgbUTCaO9VSKZwirZN5SGtkdYQ/R3VjeC4v00WTVvoNayWMZpoC3O9u0ogqmsKzKhVasQ==" + "version": "6.0.0-next.7", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.7.tgz", + "integrity": "sha512-1nG+6cuTtpzmXe7yYfO9GCkYlyV6Ai+jDnwidHiT2T7zhc+bJM+VTtc0T/CdTlDyTNTqIcCj0V1nD4TcVjJ7Ug==" }, "vscode-languageclient": { - "version": "7.0.0-next.9", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0-next.9.tgz", - "integrity": "sha512-lFO+rN/i72CM2va6iKXq1lD7pJg8J93KEXf0w0boWVqU+DJhWzLrV3pXl8Xk1nCv//qOAyhlc/nx2KZCTeRF/A==", + "version": "7.0.0-next.12", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0-next.12.tgz", + "integrity": "sha512-OrzvOvhS5o26C0KctTJC7hkwh3avCwkVhllzy42AqwpIUZ3p2aVqkSG2uVxaeodq8ThBb3TLgtg50vxyWs6FEg==", "requires": { "semver": "^6.3.0", - "vscode-languageserver-protocol": "3.16.0-next.7" + "vscode-languageserver-protocol": "3.16.0-next.10" } }, "vscode-languageserver-protocol": { - "version": "3.16.0-next.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.7.tgz", - "integrity": "sha512-tOjrg+K3RddJ547zpC9/LAgTbzadkPuHlqJFFWIcKjVhiJOh73XyY+Ngcu9wukGaTsuSGjJ0W8rlmwanixa0FQ==", + "version": "3.16.0-next.10", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.10.tgz", + "integrity": "sha512-YRTctHUZvts0Z1xXKNYU0ha0o+Tlgtwr+6O8OmDquM086N8exiSKBMwMC+Ra1QtIE+1mfW43Wxsme2FnMkAS9A==", "requires": { - "vscode-jsonrpc": "6.0.0-next.5", - "vscode-languageserver-types": "3.16.0-next.3" + "vscode-jsonrpc": "6.0.0-next.7", + "vscode-languageserver-types": "3.16.0-next.4" } }, "vscode-languageserver-types": { - "version": "3.16.0-next.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.3.tgz", - "integrity": "sha512-s/z5ZqSe7VpoXJ6JQcvwRiPPA3nG0nAcJ/HH03zoU6QaFfnkcgPK+HshC3WKPPnC2G08xA0iRB6h7kmyBB5Adg==" + "version": "3.16.0-next.4", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.4.tgz", + "integrity": "sha512-NlKJyGcET/ZBCCLBYIPaGo2c37R03bPYeWXozUtnjyye7+9dhlbMSODyoG2INcQf8zFmB4qhm2UOJjgYEgPCNA==" }, "vscode-test": { "version": "1.4.0", diff --git a/editors/code/package.json b/editors/code/package.json index af845d7bc429..eccafccdd9e6 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "node-fetch": "^2.6.1", - "vscode-languageclient": "7.0.0-next.9" + "vscode-languageclient": "7.0.0-next.12" }, "devDependencies": { "@rollup/plugin-commonjs": "^13.0.2", diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts index 08159b43c3e1..53492a445c4e 100644 --- a/editors/code/src/util.ts +++ b/editors/code/src/util.ts @@ -75,12 +75,11 @@ export async function sendRequestWithRetry( log.warn("LSP request timed out", { method: reqType.method, param, error }); throw error; } - - if (error.code === lc.ErrorCodes.RequestCancelled) { + if (error.code === lc.LSPErrorCodes.RequestCancelled) { throw error; } - if (error.code !== lc.ErrorCodes.ContentModified) { + if (error.code !== lc.LSPErrorCodes.ContentModified) { log.warn("LSP request failed", { method: reqType.method, param, error }); throw error; }