summaryrefslogtreecommitdiff
path: root/support/texlab/src/features/reference/string.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/features/reference/string.rs')
-rw-r--r--support/texlab/src/features/reference/string.rs186
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(())
}