diff options
Diffstat (limited to 'support/texlab/src/completion/latex/color_model.rs')
-rw-r--r-- | support/texlab/src/completion/latex/color_model.rs | 169 |
1 files changed, 88 insertions, 81 deletions
diff --git a/support/texlab/src/completion/latex/color_model.rs b/support/texlab/src/completion/latex/color_model.rs index 5b6e85fa31..e0151da2f0 100644 --- a/support/texlab/src/completion/latex/color_model.rs +++ b/support/texlab/src/completion/latex/color_model.rs @@ -1,94 +1,101 @@ use super::combinators::{self, Parameter}; -use crate::completion::factory; -use crate::syntax::LANGUAGE_DATA; -use crate::workspace::*; -use futures_boxed::boxed; -use lsp_types::{CompletionItem, CompletionParams, TextEdit}; - -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -pub struct LatexColorModelCompletionProvider; - -impl FeatureProvider for LatexColorModelCompletionProvider { - type Params = CompletionParams; - type Output = Vec<CompletionItem>; - - #[boxed] - async fn execute<'a>(&'a self, request: &'a FeatureRequest<Self::Params>) -> Self::Output { - let parameters = LANGUAGE_DATA - .color_model_commands - .iter() - .map(|cmd| Parameter::new(&cmd.name, cmd.index)); - - combinators::argument(&request, parameters, |context| { - async move { - let mut items = Vec::new(); - for name in MODEL_NAMES { - let text_edit = TextEdit::new(context.range, (*name).into()); - let item = factory::color_model(request, name, text_edit); - items.push(item); - } - items - } - }) - .await - } -} +use crate::{ + completion::types::{Item, ItemData}, + feature::FeatureRequest, + protocol::CompletionParams, + syntax::LANGUAGE_DATA, +}; const MODEL_NAMES: &[&str] = &["gray", "rgb", "RGB", "HTML", "cmyk"]; +pub async fn complete_latex_color_models<'a>( + req: &'a FeatureRequest<CompletionParams>, + items: &mut Vec<Item<'a>>, +) { + let parameters = LANGUAGE_DATA + .color_model_commands + .iter() + .map(|cmd| Parameter { + name: &cmd.name[1..], + index: cmd.index, + }); + + combinators::argument(req, parameters, |ctx| async move { + for name in MODEL_NAMES { + let item = Item::new(ctx.range, ItemData::ColorModel { name }); + items.push(item); + } + }) + .await; +} + #[cfg(test)] mod tests { use super::*; - use crate::range::RangeExt; - use lsp_types::{Position, Range}; - - #[test] - fn test_inside_define_color() { - let items = test_feature( - LatexColorModelCompletionProvider, - FeatureSpec { - files: vec![FeatureSpec::file("foo.tex", "\\definecolor{name}{}")], - main_file: "foo.tex", - position: Position::new(0, 19), - ..FeatureSpec::default() - }, - ); - assert!(!items.is_empty()); - assert_eq!( - items[0].text_edit.as_ref().map(|edit| edit.range), - Some(Range::new_simple(0, 19, 0, 19)) - ); + use crate::{ + feature::FeatureTester, + protocol::{Range, RangeExt}, + }; + + #[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_color_models(&req, &mut actual_items).await; + + assert!(actual_items.is_empty()); } - #[test] - fn test_outside_define_color() { - let items = test_feature( - LatexColorModelCompletionProvider, - FeatureSpec { - files: vec![FeatureSpec::file("foo.tex", "\\definecolor{name}{}")], - main_file: "foo.tex", - position: Position::new(0, 18), - ..FeatureSpec::default() - }, - ); - assert!(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_color_models(&req, &mut actual_items).await; + + assert!(actual_items.is_empty()); + } + + #[tokio::test] + async fn inside_define_color() { + let req = FeatureTester::new() + .file("main.tex", r#"\definecolor{name}{}"#) + .main("main.tex") + .position(0, 19) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_color_models(&req, &mut actual_items).await; + + assert!(!actual_items.is_empty()); + assert_eq!(actual_items[0].range, Range::new_simple(0, 19, 0, 19)); } - #[test] - fn tet_inside_define_color_set() { - let items = test_feature( - LatexColorModelCompletionProvider, - FeatureSpec { - files: vec![FeatureSpec::file("foo.tex", "\\definecolorset{}")], - main_file: "foo.tex", - position: Position::new(0, 16), - ..FeatureSpec::default() - }, - ); - assert!(!items.is_empty()); - assert_eq!( - items[0].text_edit.as_ref().map(|edit| edit.range), - Some(Range::new_simple(0, 16, 0, 16)) - ); + #[tokio::test] + async fn inside_define_color_set() { + let req = FeatureTester::new() + .file("main.tex", r#"\definecolorset{}"#) + .main("main.tex") + .position(0, 16) + .test_completion_request() + .await; + let mut actual_items = Vec::new(); + + complete_latex_color_models(&req, &mut actual_items).await; + + assert!(!actual_items.is_empty()); + assert_eq!(actual_items[0].range, Range::new_simple(0, 16, 0, 16)); } } |