diff options
Diffstat (limited to 'support/texlab/src/features/rename/entry.rs')
-rw-r--r-- | support/texlab/src/features/rename/entry.rs | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/support/texlab/src/features/rename/entry.rs b/support/texlab/src/features/rename/entry.rs index 35a77d926e..4861b63570 100644 --- a/support/texlab/src/features/rename/entry.rs +++ b/support/texlab/src/features/rename/entry.rs @@ -1,18 +1,18 @@ 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::{bibtex, latex, CstNode}, + syntax::{ + bibtex::{self, HasName}, + latex, + }, DocumentData, LineIndexExt, }; -pub fn prepare_entry_rename<P: HasPosition>( - context: &CursorContext<P>, - _cancellation_token: &CancellationToken, -) -> Option<Range> { +pub fn prepare_entry_rename<P: HasPosition>(context: &CursorContext<P>) -> Option<Range> { let (_, range) = context .find_citation_key_word() .or_else(|| context.find_entry_key())?; @@ -26,44 +26,41 @@ pub fn prepare_entry_rename<P: HasPosition>( ) } -pub fn rename_entry( - context: &CursorContext<RenameParams>, - cancellation_token: &CancellationToken, -) -> Option<WorkspaceEdit> { - cancellation_token.result().ok()?; - prepare_entry_rename(context, cancellation_token)?; +pub fn rename_entry(context: &CursorContext<RenameParams>) -> Option<WorkspaceEdit> { + prepare_entry_rename(context)?; let (key_text, _) = context .find_citation_key_word() .or_else(|| context.find_entry_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() { match &document.data { DocumentData::Latex(data) => { - let edits: Vec<_> = data - .root + let edits: Vec<_> = latex::SyntaxNode::new_root(data.green.clone()) .descendants() .filter_map(latex::Citation::cast) .filter_map(|citation| citation.key_list()) .flat_map(|keys| keys.keys()) .filter(|key| key.to_string() == key_text) - .map(|key| document.line_index.line_col_lsp_range(key.small_range())) + .map(|key| { + document + .line_index + .line_col_lsp_range(latex::small_range(&key)) + }) .map(|range| TextEdit::new(range, context.request.params.new_name.clone())) .collect(); - changes.insert(document.uri.as_ref().clone().into(), edits); + changes.insert(document.uri.as_ref().clone(), edits); } DocumentData::Bibtex(data) => { - let edits: Vec<_> = data - .root + let edits: Vec<_> = bibtex::SyntaxNode::new_root(data.green.clone()) .descendants() .filter_map(bibtex::Entry::cast) - .filter_map(|entry| entry.key()) - .filter(|key| key.to_string() == key_text) - .map(|key| document.line_index.line_col_lsp_range(key.small_range())) + .filter_map(|entry| entry.name_token()) + .filter(|key| key.text() == key_text) + .map(|key| document.line_index.line_col_lsp_range(key.text_range())) .map(|range| TextEdit::new(range, context.request.params.new_name.clone())) .collect(); - changes.insert(document.uri.as_ref().clone().into(), edits); + changes.insert(document.uri.as_ref().clone(), edits); } DocumentData::BuildLog(_) => {} } @@ -98,15 +95,15 @@ mod tests { let request = tester.rename(); let context = CursorContext::new(request); - let actual_edit = rename_entry(&context, CancellationToken::none()).unwrap(); + let actual_edit = rename_entry(&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, 9, 0, 12), "qux".into())], ); expected_changes.insert( - uri2.as_ref().clone().into(), + uri2.as_ref().clone(), vec![TextEdit::new(Range::new_simple(1, 6, 1, 9), "qux".into())], ); let expected_edit = WorkspaceEdit::new(expected_changes); @@ -132,15 +129,15 @@ mod tests { let request = tester.rename(); let context = CursorContext::new(request); - let actual_edit = rename_entry(&context, CancellationToken::none()).unwrap(); + let actual_edit = rename_entry(&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, 9, 0, 12), "qux".into())], ); expected_changes.insert( - uri2.as_ref().clone().into(), + uri2.as_ref().clone(), vec![TextEdit::new(Range::new_simple(1, 6, 1, 9), "qux".into())], ); let expected_edit = WorkspaceEdit::new(expected_changes); |