diff options
Diffstat (limited to 'support/texlab/src/completion/latex/theorem.rs')
-rw-r--r-- | support/texlab/src/completion/latex/theorem.rs | 163 |
1 files changed, 104 insertions, 59 deletions
diff --git a/support/texlab/src/completion/latex/theorem.rs b/support/texlab/src/completion/latex/theorem.rs index 993ef5c7e8..a8706bed0b 100644 --- a/support/texlab/src/completion/latex/theorem.rs +++ b/support/texlab/src/completion/latex/theorem.rs @@ -1,70 +1,115 @@ use super::combinators; -use crate::completion::factory::{self, LatexComponentId}; -use crate::syntax::*; -use crate::workspace::*; -use futures_boxed::boxed; -use lsp_types::{CompletionItem, CompletionParams, TextEdit}; +use crate::{ + completion::types::{Item, ItemData}, + feature::FeatureRequest, + protocol::CompletionParams, +}; -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub struct LatexTheoremEnvironmentCompletionProvider; - -impl FeatureProvider for LatexTheoremEnvironmentCompletionProvider { - type Params = CompletionParams; - type Output = Vec<CompletionItem>; - - #[boxed] - async fn execute<'a>(&'a self, request: &'a FeatureRequest<Self::Params>) -> Self::Output { - combinators::environment(request, |context| { - async move { - let mut items = Vec::new(); - for document in request.related_documents() { - if let SyntaxTree::Latex(tree) = &document.tree { - for theorem in &tree.math.theorem_definitions { - let name = theorem.name().text().to_owned(); - let text_edit = TextEdit::new(context.range, name.clone()); - let item = factory::environment( - request, - name, - text_edit, - &LatexComponentId::User, - ); - items.push(item); - } - } - } - items +pub async fn complete_latex_theorem_environments<'a>( + req: &'a FeatureRequest<CompletionParams>, + items: &mut Vec<Item<'a>>, +) { + combinators::environment(req, |ctx| async move { + for table in req + .related() + .into_iter() + .filter_map(|doc| doc.content.as_latex()) + { + for theorem in &table.theorem_definitions { + let name = theorem.name(&table).text(); + let data = ItemData::UserEnvironment { name }; + let item = Item::new(ctx.range, data); + items.push(item); } - }) - .await - } + } + }) + .await; } #[cfg(test)] mod tests { use super::*; - use crate::range::RangeExt; - use lsp_types::{Position, Range}; - use std::borrow::Cow; + use crate::{ + feature::FeatureTester, + protocol::{Range, RangeExt}, + }; + use indoc::indoc; + + #[tokio::test] + async fn empty_latex_document() { + let req = FeatureTester::new() + .file("main.tex", "") + .main("main.tex") + .position(0, 0) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_theorem_environments(&req, &mut actual_items).await; + + assert!(actual_items.is_empty()); + } + + #[tokio::test] + async fn empty_bibtex_document() { + let req = FeatureTester::new() + .file("main.bib", "") + .main("main.bib") + .position(0, 0) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_theorem_environments(&req, &mut actual_items).await; + + assert!(actual_items.is_empty()); + } + + #[tokio::test] + async fn inside_begin() { + let req = FeatureTester::new() + .file( + "main.tex", + indoc!( + r#" + \newtheorem{theorem}{Theorem} + \begin{th} + "# + ), + ) + .main("main.tex") + .position(1, 8) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_theorem_environments(&req, &mut actual_items).await; + + assert_eq!(actual_items.len(), 1); + assert_eq!(actual_items[0].data.label(), "theorem"); + assert_eq!(actual_items[0].range, Range::new_simple(1, 7, 1, 9)); + } + + #[tokio::test] + async fn outside_begin() { + let req = FeatureTester::new() + .file( + "main.tex", + indoc!( + r#" + \newtheorem{theorem}{Theorem} + \begin{th} + "# + ), + ) + .main("main.tex") + .position(1, 10) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_theorem_environments(&req, &mut actual_items).await; - #[test] - fn test() { - let items = test_feature( - LatexTheoremEnvironmentCompletionProvider, - FeatureSpec { - files: vec![FeatureSpec::file( - "foo.tex", - "\\newtheorem{theorem}{Theorem}\n\\begin{th}", - )], - main_file: "foo.tex", - position: Position::new(1, 8), - ..FeatureSpec::default() - }, - ); - assert_eq!(items.len(), 1); - assert_eq!(items[0].label, Cow::from("theorem")); - assert_eq!( - items[0].text_edit.as_ref().map(|edit| edit.range), - Some(Range::new_simple(1, 7, 1, 9)) - ); + assert!(actual_items.is_empty()); } } |