summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/rename.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/rename.rs')
-rw-r--r--support/texlab/src/features/rename.rs48
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>>,
}