Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 96cebca

Browse files
committed
Version 2
1 parent 1de842a commit 96cebca

File tree

2 files changed

+72
-91
lines changed

2 files changed

+72
-91
lines changed

crates/rust-analyzer/src/handlers/request.rs

Lines changed: 64 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ use std::{
88
};
99

1010
use anyhow::Context;
11+
1112
use ide::{
1213
AnnotationConfig, AssistKind, AssistResolveStrategy, Cancellable, FilePosition, FileRange,
13-
FileSystemEdit, HoverAction, HoverGotoTypeData, Query, RangeInfo, ReferenceCategory, Runnable,
14-
RunnableKind, SingleResolve, SourceChange, TextEdit,
14+
HoverAction, HoverGotoTypeData, Query, RangeInfo, ReferenceCategory, Runnable, RunnableKind,
15+
SingleResolve, SourceChange, TextEdit,
1516
};
1617
use ide_db::SymbolKind;
1718
use lsp_server::ErrorCode;
@@ -33,7 +34,7 @@ use vfs::{AbsPath, AbsPathBuf, VfsPath};
3334

3435
use crate::{
3536
cargo_target_spec::CargoTargetSpec,
36-
config::{RustfmtConfig, WorkspaceSymbolConfig},
37+
config::{Config, RustfmtConfig, WorkspaceSymbolConfig},
3738
diff::diff,
3839
from_proto,
3940
global_state::{GlobalState, GlobalStateSnapshot},
@@ -548,12 +549,8 @@ pub(crate) fn handle_will_rename_files(
548549
) -> anyhow::Result<Option<lsp_types::WorkspaceEdit>> {
549550
let _p = profile::span("handle_will_rename_files");
550551

551-
if !resource_ops_supported(&snap, &ResourceOperationKind::Rename) {
552-
return Err(LspError::new(
553-
ErrorCode::RequestFailed as i32,
554-
"Client does not support rename capability.".to_owned(),
555-
)
556-
.into());
552+
if let Err(err) = resource_ops_supported(&snap.config, &ResourceOperationKind::Rename) {
553+
return Err(err);
557554
}
558555

559556
let source_changes: Vec<SourceChange> = params
@@ -1037,33 +1034,29 @@ pub(crate) fn handle_rename(
10371034
// See https://github.com/microsoft/vscode-languageserver-node/issues/752 for more info
10381035
if !change.file_system_edits.is_empty() && snap.config.will_rename() {
10391036
change.source_file_edits.clear();
1040-
} else {
1041-
for edit in &change.file_system_edits {
1042-
match edit {
1043-
&FileSystemEdit::CreateFile { .. }
1044-
if !resource_ops_supported(&snap, &ResourceOperationKind::Create) =>
1045-
{
1046-
return Err(LspError::new(
1047-
ErrorCode::RequestFailed as i32,
1048-
"Client does not support create capability.".to_owned(),
1049-
)
1050-
.into())
1051-
}
1052-
&FileSystemEdit::MoveFile { .. } | &FileSystemEdit::MoveDir { .. }
1053-
if !resource_ops_supported(&snap, &ResourceOperationKind::Rename) =>
1054-
{
1055-
return Err(LspError::new(
1056-
ErrorCode::RequestFailed as i32,
1057-
"Client does not support move/rename capability.".to_owned(),
1058-
)
1059-
.into())
1037+
}
1038+
1039+
let workspace_edit = to_proto::workspace_edit(&snap, change)?;
1040+
1041+
if let Some(lsp_types::DocumentChanges::Operations(ops)) =
1042+
workspace_edit.document_changes.as_ref()
1043+
{
1044+
for op in ops {
1045+
if let lsp_types::DocumentChangeOperation::Op(doc_change_op) = op {
1046+
if let Err(err) = resource_ops_supported(
1047+
&snap.config,
1048+
match doc_change_op {
1049+
ResourceOp::Create(_) => &ResourceOperationKind::Create,
1050+
ResourceOp::Rename(_) => &ResourceOperationKind::Rename,
1051+
ResourceOp::Delete(_) => &ResourceOperationKind::Delete,
1052+
},
1053+
) {
1054+
return Err(err);
10601055
}
1061-
_ => (),
10621056
}
10631057
}
10641058
}
10651059

1066-
let workspace_edit = to_proto::workspace_edit(&snap, change)?;
10671060
Ok(Some(workspace_edit))
10681061
}
10691062

@@ -1174,35 +1167,17 @@ pub(crate) fn handle_code_action(
11741167
// Check if the client supports the necessary `ResourceOperation`s.
11751168
if let Some(changes) = &code_action.edit.as_ref().unwrap().document_changes {
11761169
for change in changes {
1177-
match change {
1178-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Create(_))
1179-
if !resource_ops_supported(&snap, &ResourceOperationKind::Create) =>
1180-
{
1181-
return Err(LspError::new(
1182-
ErrorCode::RequestFailed as i32,
1183-
"Client does not support create capability.".to_owned(),
1184-
)
1185-
.into());
1186-
}
1187-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Rename(_))
1188-
if !resource_ops_supported(&snap, &ResourceOperationKind::Rename) =>
1189-
{
1190-
return Err(LspError::new(
1191-
ErrorCode::RequestFailed as i32,
1192-
"Client does not support rename capability.".to_owned(),
1193-
)
1194-
.into());
1195-
}
1196-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Delete(_))
1197-
if !resource_ops_supported(&snap, &ResourceOperationKind::Delete) =>
1198-
{
1199-
return Err(LspError::new(
1200-
ErrorCode::RequestFailed as i32,
1201-
"Client does not support delete capability.".to_owned(),
1202-
)
1203-
.into());
1170+
if let lsp_ext::SnippetDocumentChangeOperation::Op(res_op) = change {
1171+
if let Err(err) = resource_ops_supported(
1172+
&snap.config,
1173+
match res_op {
1174+
ResourceOp::Create(_) => &ResourceOperationKind::Create,
1175+
ResourceOp::Rename(_) => &ResourceOperationKind::Rename,
1176+
ResourceOp::Delete(_) => &ResourceOperationKind::Delete,
1177+
},
1178+
) {
1179+
return Err(err);
12041180
}
1205-
_ => (),
12061181
}
12071182
}
12081183
}
@@ -1293,35 +1268,17 @@ pub(crate) fn handle_code_action_resolve(
12931268
if let Some(edit) = code_action.edit.as_ref() {
12941269
if let Some(changes) = edit.document_changes.as_ref() {
12951270
for change in changes {
1296-
match change {
1297-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Create(_))
1298-
if !resource_ops_supported(&snap, &ResourceOperationKind::Create) =>
1299-
{
1300-
return Err(LspError::new(
1301-
ErrorCode::RequestFailed as i32,
1302-
"Client does not support create capability.".to_owned(),
1303-
)
1304-
.into());
1271+
if let lsp_ext::SnippetDocumentChangeOperation::Op(res_op) = change {
1272+
if let Err(err) = resource_ops_supported(
1273+
&snap.config,
1274+
match res_op {
1275+
ResourceOp::Create(_) => &ResourceOperationKind::Create,
1276+
ResourceOp::Rename(_) => &ResourceOperationKind::Rename,
1277+
ResourceOp::Delete(_) => &ResourceOperationKind::Delete,
1278+
},
1279+
) {
1280+
return Err(err);
13051281
}
1306-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Rename(_))
1307-
if !resource_ops_supported(&snap, &ResourceOperationKind::Rename) =>
1308-
{
1309-
return Err(LspError::new(
1310-
ErrorCode::RequestFailed as i32,
1311-
"Client does not support rename capability.".to_owned(),
1312-
)
1313-
.into());
1314-
}
1315-
lsp_ext::SnippetDocumentChangeOperation::Op(ResourceOp::Delete(_))
1316-
if !resource_ops_supported(&snap, &ResourceOperationKind::Delete) =>
1317-
{
1318-
return Err(LspError::new(
1319-
ErrorCode::RequestFailed as i32,
1320-
"Client does not support delete capability.".to_owned(),
1321-
)
1322-
.into());
1323-
}
1324-
_ => (),
13251282
}
13261283
}
13271284
}
@@ -2099,9 +2056,8 @@ fn to_url(path: VfsPath) -> Option<Url> {
20992056
Url::from_file_path(str_path).ok()
21002057
}
21012058

2102-
fn resource_ops_supported(snap: &GlobalStateSnapshot, kind: &ResourceOperationKind) -> bool {
2103-
snap.config
2104-
.as_ref()
2059+
fn resource_ops_supported(config: &Config, kind: &ResourceOperationKind) -> anyhow::Result<()> {
2060+
let ctn = config
21052061
.caps()
21062062
.workspace
21072063
.as_ref()
@@ -2112,5 +2068,22 @@ fn resource_ops_supported(snap: &GlobalStateSnapshot, kind: &ResourceOperationKi
21122068
.resource_operations
21132069
.as_ref()
21142070
.unwrap()
2115-
.contains(kind)
2071+
.contains(kind);
2072+
2073+
if !ctn {
2074+
return Err(LspError::new(
2075+
ErrorCode::RequestFailed as i32,
2076+
format!(
2077+
"Client does not support {} capability.",
2078+
match kind {
2079+
ResourceOperationKind::Create => "create",
2080+
ResourceOperationKind::Rename => "rename",
2081+
ResourceOperationKind::Delete => "delete",
2082+
}
2083+
),
2084+
)
2085+
.into());
2086+
}
2087+
2088+
Ok(())
21162089
}

crates/rust-analyzer/tests/slow-tests/support.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,14 @@ impl<'a> Project<'a> {
113113
relative_pattern_support: None,
114114
},
115115
),
116+
workspace_edit: Some(lsp_types::WorkspaceEditClientCapabilities {
117+
resource_operations: Some(vec![
118+
lsp_types::ResourceOperationKind::Create,
119+
lsp_types::ResourceOperationKind::Delete,
120+
lsp_types::ResourceOperationKind::Rename,
121+
]),
122+
..Default::default()
123+
}),
116124
..Default::default()
117125
}),
118126
text_document: Some(lsp_types::TextDocumentClientCapabilities {

0 commit comments

Comments
 (0)