diff options
Diffstat (limited to 'support/texlab/src/features/reference/string.rs')
-rw-r--r-- | support/texlab/src/features/reference/string.rs | 186 |
1 files changed, 14 insertions, 172 deletions
diff --git a/support/texlab/src/features/reference/string.rs b/support/texlab/src/features/reference/string.rs index c957244a53..c00cf93546 100644 --- a/support/texlab/src/features/reference/string.rs +++ b/support/texlab/src/features/reference/string.rs @@ -1,23 +1,26 @@ -use lsp_types::{Location, ReferenceParams}; +use std::sync::Arc; + +use lsp_types::ReferenceParams; use rowan::ast::AstNode; use crate::{ features::cursor::CursorContext, syntax::bibtex::{self, HasName}, - LineIndexExt, }; -pub fn find_string_references( +use super::ReferenceResult; + +pub(super) fn find_string_references( context: &CursorContext<ReferenceParams>, - items: &mut Vec<Location>, + results: &mut Vec<ReferenceResult>, ) -> Option<()> { let name_text = context .cursor .as_bibtex() + .filter(|token| token.kind() == bibtex::NAME) .filter(|token| { let parent = token.parent().unwrap(); - (token.kind() == bibtex::NAME && bibtex::Value::can_cast(parent.kind())) - || (token.kind() == bibtex::NAME && bibtex::StringDef::can_cast(parent.kind())) + bibtex::Value::can_cast(parent.kind()) || bibtex::StringDef::can_cast(parent.kind()) })? .text(); @@ -35,173 +38,12 @@ pub fn find_string_references( .filter(|name| name.text() == name_text) }) { - items.push(Location::new( - document.uri.as_ref().clone(), - document.line_index.line_col_lsp_range(name.text_range()), - )); + results.push(ReferenceResult { + uri: Arc::clone(&document.uri), + range: name.text_range(), + }); } } - Some(()) -} - -#[cfg(test)] -mod tests { - use indoc::indoc; - use lsp_types::Range; - - use crate::{features::testing::FeatureTester, RangeExt}; - - use super::*; - - #[test] - fn test_definition() { - let tester = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = {Foo}} - @string{bar = {Bar}} - @article{baz, author = foo} - "# }, - )]) - .main("main.bib") - .line(2) - .character(24) - .build(); - let uri = tester.uri("main.bib"); - - let mut actual_references = Vec::new(); - let request = tester.reference(); - let context = CursorContext::new(request); - find_string_references(&context, &mut actual_references); - - let expected_references = vec![Location::new( - uri.as_ref().clone(), - Range::new_simple(2, 23, 2, 26), - )]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_definition_include_declaration() { - let tester = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = {Foo}} - @string{bar = {Bar}} - @article{baz, author = foo} - "# }, - )]) - .main("main.bib") - .line(2) - .character(24) - .include_declaration(true) - .build(); - let uri = tester.uri("main.bib"); - - let mut actual_references = Vec::new(); - let request = tester.reference(); - let context = CursorContext::new(request); - find_string_references(&context, &mut actual_references); - - let expected_references = vec![ - Location::new(uri.as_ref().clone(), Range::new_simple(0, 8, 0, 11)), - Location::new(uri.as_ref().clone(), Range::new_simple(2, 23, 2, 26)), - ]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_reference() { - let tester = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = {Foo}} - @string{bar = {Bar}} - @article{baz, author = foo} - "# }, - )]) - .main("main.bib") - .line(0) - .character(10) - .build(); - let uri = tester.uri("main.bib"); - let mut actual_references = Vec::new(); - let request = tester.reference(); - let context = CursorContext::new(request); - find_string_references(&context, &mut actual_references); - - let expected_references = vec![Location::new( - uri.as_ref().clone(), - Range::new_simple(2, 23, 2, 26), - )]; - assert_eq!(actual_references, expected_references); - } - - #[test] - fn test_reference_include_declaration() { - let tester = FeatureTester::builder() - .files(vec![( - "main.bib", - indoc! { r#" - @string{foo = {Foo}} - @string{bar = {Bar}} - @article{baz, author = foo} - "# }, - )]) - .main("main.bib") - .line(0) - .character(10) - .include_declaration(true) - .build(); - let uri = tester.uri("main.bib"); - - let mut actual_references = Vec::new(); - let request = tester.reference(); - let context = CursorContext::new(request); - find_string_references(&context, &mut actual_references); - - let expected_references = vec![ - Location::new(uri.as_ref().clone(), Range::new_simple(0, 8, 0, 11)), - Location::new(uri.as_ref().clone(), Range::new_simple(2, 23, 2, 26)), - ]; - 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_string_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_string_references(&context, &mut actual_references); - - assert!(actual_references.is_empty()); - } + Some(()) } |