mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
move logic from client to server.
This commit is contained in:
parent
b9d52444cf
commit
f7cb9e9fbe
2 changed files with 9 additions and 21 deletions
|
@ -435,7 +435,15 @@ pub(crate) fn handle_will_rename_files(
|
||||||
if from_path.is_dir() {
|
if from_path.is_dir() {
|
||||||
// This is a quick implement, try to use will_rename_file code.
|
// 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
|
// imitate change the older_folder/mod.rs to older_folder/new_folder.rs
|
||||||
let imitate_from_url = from.join("mod.rs").ok()?;
|
|
||||||
|
// add '/' to end of url -- from `file://path/to/folder` to `file://path/to/folder/`
|
||||||
|
let old_folder_name = from_path.file_stem()?;
|
||||||
|
let old_folder_name = old_folder_name.to_str()?;
|
||||||
|
let mut old_folder_name = old_folder_name.to_string();
|
||||||
|
old_folder_name.push('/');
|
||||||
|
let from_with_trailing_slash = from.join(&old_folder_name).ok()?;
|
||||||
|
|
||||||
|
let imitate_from_url = from_with_trailing_slash.join("mod.rs").ok()?;
|
||||||
let imite_new_file_name = to_path.file_name()?.to_str()?;
|
let imite_new_file_name = to_path.file_name()?.to_str()?;
|
||||||
Some((
|
Some((
|
||||||
snap.url_to_file_id(&imitate_from_url).ok()?,
|
snap.url_to_file_id(&imitate_from_url).ok()?,
|
||||||
|
|
|
@ -51,32 +51,12 @@ export function createClient(serverPath: string, cwd: string, extraEnv: Env): lc
|
||||||
'Rust Analyzer Language Server Trace',
|
'Rust Analyzer Language Server Trace',
|
||||||
);
|
);
|
||||||
|
|
||||||
const workspace: lc.WorkspaceMiddleware = {
|
|
||||||
willRenameFiles: function <P extends vscode.FileRenameEvent, R extends Thenable<vscode.WorkspaceEdit | null | undefined>>(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.
|
|
||||||
const newFiles = data.files.map((file) => {
|
|
||||||
const isFolder = !file.oldUri.path.endsWith(".rs");
|
|
||||||
return !isFolder ? file : {
|
|
||||||
oldUri: vscode.Uri.file(file.oldUri.path + '/'),
|
|
||||||
newUri: vscode.Uri.file(file.newUri.path + '/')
|
|
||||||
};
|
|
||||||
});
|
|
||||||
data = { ...data, files: newFiles };
|
|
||||||
return next(data);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const clientOptions: lc.LanguageClientOptions = {
|
const clientOptions: lc.LanguageClientOptions = {
|
||||||
documentSelector: [{ scheme: 'file', language: 'rust' }],
|
documentSelector: [{ scheme: 'file', language: 'rust' }],
|
||||||
initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"),
|
initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"),
|
||||||
diagnosticCollectionName: "rustc",
|
diagnosticCollectionName: "rustc",
|
||||||
traceOutputChannel,
|
traceOutputChannel,
|
||||||
middleware: {
|
middleware: {
|
||||||
workspace,
|
|
||||||
provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken, next: DocumentSemanticsTokensSignature): vscode.ProviderResult<vscode.SemanticTokens> {
|
provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken, next: DocumentSemanticsTokensSignature): vscode.ProviderResult<vscode.SemanticTokens> {
|
||||||
return semanticHighlightingWorkaround(next, document, token);
|
return semanticHighlightingWorkaround(next, document, token);
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in a new issue