diff options
Diffstat (limited to 'support/texlab/src/features/rename.rs')
-rw-r--r-- | support/texlab/src/features/rename.rs | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/support/texlab/src/features/rename.rs b/support/texlab/src/features/rename.rs index a9a6732d04..c21faf262e 100644 --- a/support/texlab/src/features/rename.rs +++ b/support/texlab/src/features/rename.rs @@ -2,7 +2,13 @@ mod command; mod entry; mod label; -use lsp_types::{Range, RenameParams, TextDocumentPositionParams, WorkspaceEdit}; +use std::sync::Arc; + +use lsp_types::{Range, RenameParams, TextDocumentPositionParams, TextEdit, Url, WorkspaceEdit}; +use rowan::TextRange; +use rustc_hash::FxHashMap; + +use crate::LineIndexExt; use self::{ command::{prepare_command_rename, rename_command}, @@ -14,14 +20,46 @@ use super::{cursor::CursorContext, FeatureRequest}; pub fn prepare_rename_all(request: FeatureRequest<TextDocumentPositionParams>) -> Option<Range> { let context = CursorContext::new(request); - prepare_entry_rename(&context) + let range = prepare_entry_rename(&context) .or_else(|| prepare_label_rename(&context)) - .or_else(|| prepare_command_rename(&context)) + .or_else(|| prepare_command_rename(&context))?; + + let line_index = &context.request.main_document().line_index; + Some(line_index.line_col_lsp_range(range)) } pub fn rename_all(request: FeatureRequest<RenameParams>) -> Option<WorkspaceEdit> { let context = CursorContext::new(request); - rename_entry(&context) + let result = rename_entry(&context) .or_else(|| rename_label(&context)) - .or_else(|| rename_command(&context)) + .or_else(|| rename_command(&context))?; + + let changes = result + .changes + .into_iter() + .map(|(uri, old_edits)| { + let document = &context.request.workspace.documents_by_uri[&uri]; + let new_edits = old_edits + .into_iter() + .map(|Indel { delete, insert }| { + TextEdit::new(document.line_index.line_col_lsp_range(delete), insert) + }) + .collect(); + + (uri.as_ref().clone(), new_edits) + }) + .collect(); + + Some(WorkspaceEdit::new(changes)) +} + +#[derive(Debug, PartialEq, Eq, Clone)] +struct Indel { + delete: TextRange, + insert: String, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +struct RenameResult { + changes: FxHashMap<Arc<Url>, Vec<Indel>>, } |