From 0d86e222297233387ad4abc2796dfd27c5333aaa Mon Sep 17 00:00:00 2001 From: ShuiRuTian <158983297@qq.com> Date: Sun, 10 Jan 2021 01:29:08 +0800 Subject: beta version for folder rename --- crates/rust-analyzer/src/caps.rs | 3 ++- crates/rust-analyzer/src/handlers.rs | 23 ++++++++++++++++++++--- editors/code/src/client.ts | 12 ++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/crates/rust-analyzer/src/caps.rs b/crates/rust-analyzer/src/caps.rs index 5167a005f..406a93b10 100644 --- a/crates/rust-analyzer/src/caps.rs +++ b/crates/rust-analyzer/src/caps.rs @@ -85,8 +85,9 @@ pub fn server_capabilities(client_caps: &ClientCapabilities) -> ServerCapabiliti matches: Some(FileOperationPatternKind::File), options: None, }, + }, FileOperationFilter { - scheme: Some(String::from("untitled")), + scheme: Some(String::from("file")), pattern: FileOperationPattern { glob: String::from("**"), matches: Some(FileOperationPatternKind::Folder), diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index c13cdc4e3..176774a77 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -432,9 +432,26 @@ pub(crate) fn handle_will_rename_files( // Limit to single-level moves for now. match (from_path.parent(), to_path.parent()) { (Some(p1), Some(p2)) if p1 == p2 => { - let new_name = to_path.file_stem()?; - let new_name = new_name.to_str()?; - Some((snap.url_to_file_id(&from).ok()?, new_name.to_string())) + if from_path.is_dir() { + // This is a quick implement, try to use will_rename_file code. + // imitate change the older_folder/mod.rs to older_folder/new_folder.rs + let imitate_from_path = from_path.join("mod.rs"); + let new_from_url = imitate_from_path.to_str()?; + let new_from_url = Url::parse(new_from_url).ok()?; + + let new_folder_name = to_path.file_name()?.to_str()?; + let mut imite_new_file_name = new_folder_name.to_string(); + imite_new_file_name.push_str(".rs"); + let new_to = from_path.join(imite_new_file_name); + let new_to = new_to.to_str()?; + + Some((snap.url_to_file_id(&new_from_url).ok()?, new_to.to_string())) + } + else{ + let new_name = to_path.file_stem()?; + let new_name = new_name.to_str()?; + Some((snap.url_to_file_id(&from).ok()?, new_name.to_string())) + } } _ => None, } diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 539e487ec..2a8f2deb4 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts @@ -51,12 +51,24 @@ export function createClient(serverPath: string, cwd: string, extraEnv: Env): lc 'Rust Analyzer Language Server Trace', ); + const workspace:lc.WorkspaceMiddleware = { + willRenameFiles:function
>(this: void, data: P, next:(data: P) => R ){
+ // why add this function rather than default:
+ // 1. change `url` parameter to happy format for url crate. (folder should end with '/')
+ // 2. filter some change in here.
+ // 2.1 rename from or to `mod.rs` should be special.
+ // 2.2 not all folder change should be cared, only those have files with ".rs" postfix.
+ return next(data);
+ }
+ }
+
const clientOptions: lc.LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'rust' }],
initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"),
diagnosticCollectionName: "rustc",
traceOutputChannel,
middleware: {
+ workspace,
provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken, next: DocumentSemanticsTokensSignature): vscode.ProviderResult