summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/rename/label.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/rename/label.rs')
-rw-r--r--support/texlab/src/features/rename/label.rs122
1 files changed, 32 insertions, 90 deletions
diff --git a/support/texlab/src/features/rename/label.rs b/support/texlab/src/features/rename/label.rs
index f24b86810b..30a99c3b36 100644
--- a/support/texlab/src/features/rename/label.rs
+++ b/support/texlab/src/features/rename/label.rs
@@ -1,31 +1,28 @@
-use std::collections::HashMap;
+use std::sync::Arc;
-use lsp_types::{Range, RenameParams, TextEdit, WorkspaceEdit};
-use rowan::ast::AstNode;
+use lsp_types::RenameParams;
+use rowan::{ast::AstNode, TextRange};
+use rustc_hash::FxHashMap;
use crate::{
features::cursor::{CursorContext, HasPosition},
syntax::latex,
- LineIndexExt,
};
-pub fn prepare_label_rename<P: HasPosition>(context: &CursorContext<P>) -> Option<Range> {
- let (_, range) = context.find_label_name_key()?;
+use super::{Indel, RenameResult};
- Some(
- context
- .request
- .main_document()
- .line_index
- .line_col_lsp_range(range),
- )
+pub(super) fn prepare_label_rename<P: HasPosition>(
+ context: &CursorContext<P>,
+) -> Option<TextRange> {
+ let (_, range) = context.find_label_name_key()?;
+ Some(range)
}
-pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEdit> {
+pub(super) fn rename_label(context: &CursorContext<RenameParams>) -> Option<RenameResult> {
prepare_label_rename(context)?;
let (name_text, _) = context.find_label_name_key()?;
- let mut changes = HashMap::new();
+ let mut changes = FxHashMap::default();
for document in context.request.workspace.documents_by_uri.values() {
if let Some(data) = document.data.as_latex() {
let mut edits = Vec::new();
@@ -34,16 +31,12 @@ pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEd
.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(latex::small_range(&name))
- })
+ .map(|name| latex::small_range(&name))
{
- edits.push(TextEdit::new(
- range,
- context.request.params.new_name.clone(),
- ));
+ edits.push(Indel {
+ delete: range,
+ insert: context.request.params.new_name.clone(),
+ });
}
latex::LabelReference::cast(node.clone())
@@ -51,16 +44,11 @@ pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEd
.into_iter()
.flat_map(|label| label.keys())
.filter(|name| name.to_string() == name_text)
- .map(|name| {
- document
- .line_index
- .line_col_lsp_range(latex::small_range(&name))
- })
- .for_each(|range| {
- edits.push(TextEdit::new(
- range,
- context.request.params.new_name.clone(),
- ));
+ .for_each(|name| {
+ edits.push(Indel {
+ delete: latex::small_range(&name),
+ insert: context.request.params.new_name.clone(),
+ });
});
if let Some(label) = latex::LabelReferenceRange::cast(node.clone()) {
@@ -69,12 +57,10 @@ pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEd
.and_then(|name| name.key())
.filter(|name| name.to_string() == name_text)
{
- edits.push(TextEdit::new(
- document
- .line_index
- .line_col_lsp_range(latex::small_range(&name1)),
- context.request.params.new_name.clone(),
- ));
+ edits.push(Indel {
+ delete: latex::small_range(&name1),
+ insert: context.request.params.new_name.clone(),
+ });
}
if let Some(name2) = label
@@ -82,61 +68,17 @@ pub fn rename_label(context: &CursorContext<RenameParams>) -> Option<WorkspaceEd
.and_then(|name| name.key())
.filter(|name| name.to_string() == name_text)
{
- edits.push(TextEdit::new(
- document
- .line_index
- .line_col_lsp_range(latex::small_range(&name2)),
- context.request.params.new_name.clone(),
- ));
+ edits.push(Indel {
+ delete: latex::small_range(&name2),
+ insert: context.request.params.new_name.clone(),
+ });
}
}
}
- changes.insert(document.uri.as_ref().clone(), edits);
+ changes.insert(Arc::clone(&document.uri), edits);
}
}
- Some(WorkspaceEdit::new(changes))
-}
-
-#[cfg(test)]
-mod tests {
- use crate::{features::testing::FeatureTester, RangeExt};
-
- use super::*;
-
- #[test]
- fn test_label() {
- let tester = FeatureTester::builder()
- .files(vec![
- ("foo.tex", r#"\label{foo}\include{bar}"#),
- ("bar.tex", r#"\ref{foo}"#),
- ("baz.tex", r#"\ref{foo}"#),
- ])
- .main("foo.tex")
- .line(0)
- .character(7)
- .new_name("bar")
- .build();
-
- let uri1 = tester.uri("foo.tex");
- let uri2 = tester.uri("bar.tex");
- let request = tester.rename();
-
- let context = CursorContext::new(request);
- let actual_edit = rename_label(&context).unwrap();
-
- let mut expected_changes = HashMap::new();
- expected_changes.insert(
- uri1.as_ref().clone(),
- vec![TextEdit::new(Range::new_simple(0, 7, 0, 10), "bar".into())],
- );
- expected_changes.insert(
- uri2.as_ref().clone(),
- vec![TextEdit::new(Range::new_simple(0, 5, 0, 8), "bar".into())],
- );
- let expected_edit = WorkspaceEdit::new(expected_changes);
-
- assert_eq!(actual_edit, expected_edit);
- }
+ Some(RenameResult { changes })
}