diff options
Diffstat (limited to 'support/texlab/src/features/rename/label.rs')
-rw-r--r-- | support/texlab/src/features/rename/label.rs | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/support/texlab/src/features/rename/label.rs b/support/texlab/src/features/rename/label.rs index a73a0064bf..f24b86810b 100644 --- a/support/texlab/src/features/rename/label.rs +++ b/support/texlab/src/features/rename/label.rs @@ -1,18 +1,15 @@ use std::collections::HashMap; -use cancellation::CancellationToken; use lsp_types::{Range, RenameParams, TextEdit, WorkspaceEdit}; +use rowan::ast::AstNode; use crate::{ features::cursor::{CursorContext, HasPosition}, - syntax::{latex, CstNode}, + syntax::latex, LineIndexExt, }; -pub fn prepare_label_rename<P: HasPosition>( - context: &CursorContext<P>, - _cancellation_token: &CancellationToken, -) -> Option<Range> { +pub fn prepare_label_rename<P: HasPosition>(context: &CursorContext<P>) -> Option<Range> { let (_, range) = context.find_label_name_key()?; Some( @@ -24,24 +21,24 @@ pub fn prepare_label_rename<P: HasPosition>( ) } -pub fn rename_label( - context: &CursorContext<RenameParams>, - cancellation_token: &CancellationToken, -) -> Option<WorkspaceEdit> { - prepare_label_rename(context, cancellation_token)?; +pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEdit> { + prepare_label_rename(context)?; let (name_text, _) = context.find_label_name_key()?; let mut changes = HashMap::new(); - for document in &context.request.subset.documents { - cancellation_token.result().ok()?; + for document in context.request.workspace.documents_by_uri.values() { if let Some(data) = document.data.as_latex() { let mut edits = Vec::new(); - for node in data.root.descendants() { - if let Some(range) = latex::LabelDefinition::cast(node) + for node in latex::SyntaxNode::new_root(data.green.clone()).descendants() { + if let Some(range) = latex::LabelDefinition::cast(node.clone()) .and_then(|label| label.name()) .and_then(|name| name.key()) .filter(|name| name.to_string() == name_text) - .map(|name| document.line_index.line_col_lsp_range(name.small_range())) + .map(|name| { + document + .line_index + .line_col_lsp_range(latex::small_range(&name)) + }) { edits.push(TextEdit::new( range, @@ -49,12 +46,16 @@ pub fn rename_label( )); } - latex::LabelReference::cast(node) + latex::LabelReference::cast(node.clone()) .and_then(|label| label.name_list()) .into_iter() .flat_map(|label| label.keys()) .filter(|name| name.to_string() == name_text) - .map(|name| document.line_index.line_col_lsp_range(name.small_range())) + .map(|name| { + document + .line_index + .line_col_lsp_range(latex::small_range(&name)) + }) .for_each(|range| { edits.push(TextEdit::new( range, @@ -62,14 +63,16 @@ pub fn rename_label( )); }); - if let Some(label) = latex::LabelReferenceRange::cast(node) { + if let Some(label) = latex::LabelReferenceRange::cast(node.clone()) { if let Some(name1) = label .from() .and_then(|name| name.key()) .filter(|name| name.to_string() == name_text) { edits.push(TextEdit::new( - document.line_index.line_col_lsp_range(name1.small_range()), + document + .line_index + .line_col_lsp_range(latex::small_range(&name1)), context.request.params.new_name.clone(), )); } @@ -80,14 +83,16 @@ pub fn rename_label( .filter(|name| name.to_string() == name_text) { edits.push(TextEdit::new( - document.line_index.line_col_lsp_range(name2.small_range()), + document + .line_index + .line_col_lsp_range(latex::small_range(&name2)), context.request.params.new_name.clone(), )); } } } - changes.insert(document.uri.as_ref().clone().into(), edits); + changes.insert(document.uri.as_ref().clone(), edits); } } @@ -119,15 +124,15 @@ mod tests { let request = tester.rename(); let context = CursorContext::new(request); - let actual_edit = rename_label(&context, CancellationToken::none()).unwrap(); + let actual_edit = rename_label(&context).unwrap(); let mut expected_changes = HashMap::new(); expected_changes.insert( - uri1.as_ref().clone().into(), + uri1.as_ref().clone(), vec![TextEdit::new(Range::new_simple(0, 7, 0, 10), "bar".into())], ); expected_changes.insert( - uri2.as_ref().clone().into(), + uri2.as_ref().clone(), vec![TextEdit::new(Range::new_simple(0, 5, 0, 8), "bar".into())], ); let expected_edit = WorkspaceEdit::new(expected_changes); |