texlab/features/completion/
color_model.rs1use lsp_types::CompletionParams;
2use rowan::{ast::AstNode, TextRange};
3
4use crate::{features::cursor::CursorContext, syntax::latex};
5
6use super::types::{InternalCompletionItem, InternalCompletionItemData};
7
8const MODEL_NAMES: &[&str] = &["gray", "rgb", "RGB", "HTML", "cmyk"];
9
10pub fn complete_color_models<'a>(
11 context: &'a CursorContext<CompletionParams>,
12 items: &mut Vec<InternalCompletionItem<'a>>,
13) -> Option<()> {
14 let range = check_color_definition(context).or_else(|| check_color_definition_set(context))?;
15
16 for name in MODEL_NAMES {
17 items.push(InternalCompletionItem::new(
18 range,
19 InternalCompletionItemData::ColorModel { name },
20 ));
21 }
22
23 Some(())
24}
25
26fn check_color_definition(context: &CursorContext<CompletionParams>) -> Option<TextRange> {
27 let (_, range, group) = context.find_curly_group_word()?;
28
29 let definition = latex::ColorDefinition::cast(group.syntax().parent()?)?;
30 definition
31 .model()
32 .filter(|model| model.syntax().text_range() == group.syntax().text_range())?;
33 Some(range)
34}
35
36fn check_color_definition_set(context: &CursorContext<CompletionParams>) -> Option<TextRange> {
37 let (_, range, group) = context.find_curly_group_word_list()?;
38 let definition = latex::ColorSetDefinition::cast(group.syntax().parent()?)?;
39 definition
40 .model_list()
41 .filter(|model| model.syntax().text_range() == group.syntax().text_range())?;
42 Some(range)
43}