diff options
Diffstat (limited to 'support/texlab/src/features/reference/label.rs')
-rw-r--r-- | support/texlab/src/features/reference/label.rs | 181 |
1 files changed, 12 insertions, 169 deletions
diff --git a/support/texlab/src/features/reference/label.rs b/support/texlab/src/features/reference/label.rs index 2fc3efc398..3dadada08b 100644 --- a/support/texlab/src/features/reference/label.rs +++ b/support/texlab/src/features/reference/label.rs @@ -1,10 +1,14 @@ -use lsp_types::{Location, ReferenceParams}; +use std::sync::Arc; -use crate::{features::cursor::CursorContext, LineIndexExt}; +use lsp_types::ReferenceParams; -pub fn find_label_references( +use crate::features::cursor::CursorContext; + +use super::ReferenceResult; + +pub(super) fn find_label_references( context: &CursorContext<ReferenceParams>, - references: &mut Vec<Location>, + results: &mut Vec<ReferenceResult>, ) -> Option<()> { let (name_text, _) = context .find_label_name_key() @@ -21,174 +25,13 @@ pub fn find_label_references( !name.is_definition || context.request.params.context.include_declaration }) { - references.push(Location::new( - document.uri.as_ref().clone(), - document.line_index.line_col_lsp_range(name.range), - )); + results.push(ReferenceResult { + uri: Arc::clone(&document.uri), + range: name.range, + }); } } } Some(()) } - -#[cfg(test)] -mod tests { - use lsp_types::Range; - - use crate::{features::testing::FeatureTester, RangeExt}; - - use super::*; - - fn sort_references(actual_references: &mut [Location]) { - actual_references.sort_by(|a, b| { - a.uri - .cmp(&b.uri) - .then_with(|| a.range.start.cmp(&b.range.start)) - }); - } - - #[test] - fn test_definition() { - let tester = FeatureTester::builder() - .files(vec![ - ("foo.tex", r#"\label{foo}"#), - ("bar.tex", r#"\ref{foo}\input{foo.tex}"#), - ]) - .main("foo.tex") - .line(0) - .character(8) - .build(); - let uri = tester.uri("bar.tex"); - let mut actual_references = Vec::new(); - - let request = tester.reference(); - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - sort_references(&mut actual_references); - let expected_references = vec![Location::new( - uri.as_ref().clone(), - Range::new_simple(0, 5, 0, 8), - )]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_definition_include_declaration() { - let tester = FeatureTester::builder() - .files(vec![ - ("foo.tex", r#"\label{foo}\input{bar.tex}"#), - ("bar.tex", r#"\ref{foo}"#), - ]) - .main("foo.tex") - .line(0) - .character(9) - .include_declaration(true) - .build(); - let uri1 = tester.uri("bar.tex"); - let uri2 = tester.uri("foo.tex"); - let mut actual_references = Vec::new(); - - let request = tester.reference(); - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - sort_references(&mut actual_references); - let expected_references = vec![ - Location::new(uri1.as_ref().clone(), Range::new_simple(0, 5, 0, 8)), - Location::new(uri2.as_ref().clone(), Range::new_simple(0, 7, 0, 10)), - ]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_reference() { - let tester = FeatureTester::builder() - .files(vec![ - ("foo.tex", r#"\label{foo}\input{bar.tex}"#), - ("bar.tex", r#"\ref{foo}"#), - ("baz.tex", r#"\ref{foo}\input{bar.tex}"#), - ]) - .main("bar.tex") - .line(0) - .character(7) - .build(); - let uri1 = tester.uri("bar.tex"); - let uri2 = tester.uri("baz.tex"); - let mut actual_references = Vec::new(); - - let request = tester.reference(); - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - sort_references(&mut actual_references); - let expected_references = vec![ - Location::new(uri1.as_ref().clone(), Range::new_simple(0, 5, 0, 8)), - Location::new(uri2.as_ref().clone(), Range::new_simple(0, 5, 0, 8)), - ]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_reference_include_declaration() { - let tester = FeatureTester::builder() - .files(vec![ - ("foo.tex", r#"\label{foo}"#), - ("bar.tex", r#"\ref{foo}\input{foo.tex}"#), - ]) - .main("bar.tex") - .line(0) - .character(7) - .include_declaration(true) - .build(); - let uri1 = tester.uri("bar.tex"); - let uri2 = tester.uri("foo.tex"); - let mut actual_references = Vec::new(); - - let request = tester.reference(); - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - sort_references(&mut actual_references); - let expected_references = vec![ - Location::new(uri1.as_ref().clone(), Range::new_simple(0, 5, 0, 8)), - Location::new(uri2.as_ref().clone(), Range::new_simple(0, 7, 0, 10)), - ]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_empty_latex_document() { - let request = FeatureTester::builder() - .files(vec![("main.tex", "")]) - .main("main.tex") - .line(0) - .character(0) - .build() - .reference(); - let mut actual_references = Vec::new(); - - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - assert!(actual_references.is_empty()); - } - - #[test] - fn test_empty_bibtex_document() { - let request = FeatureTester::builder() - .files(vec![("main.bib", "")]) - .main("main.bib") - .line(0) - .character(0) - .build() - .reference(); - let mut actual_references = Vec::new(); - - let context = CursorContext::new(request); - find_label_references(&context, &mut actual_references); - - assert!(actual_references.is_empty()); - } -} |