use std::sync::Arc; use lsp_types::Url; use rowan::TextRange; use serde::{Deserialize, Serialize}; use smol_str::SmolStr; use crate::{features::lsp_kinds::Structure, BibtexEntryTypeDoc, BibtexFieldDoc}; #[derive(Debug, Clone)] pub struct InternalCompletionItem<'a> { pub range: TextRange, pub data: InternalCompletionItemData<'a>, pub preselect: bool, pub score: Option, } impl<'a> InternalCompletionItem<'a> { pub fn new(range: TextRange, data: InternalCompletionItemData<'a>) -> Self { Self { range, data, preselect: false, score: None, } } } #[derive(Debug, Clone)] pub enum InternalCompletionItemData<'a> { EntryType { ty: &'a BibtexEntryTypeDoc, }, Field { field: &'a BibtexFieldDoc, }, Argument { name: &'a str, image: Option<&'a str>, }, BeginCommand, Citation { uri: Arc, key: String, text: String, ty: Structure, }, ComponentCommand { name: &'a SmolStr, image: Option<&'a str>, glyph: Option<&'a str>, file_names: &'a [SmolStr], }, ComponentEnvironment { name: &'a SmolStr, file_names: &'a [SmolStr], }, Class { name: SmolStr, }, Package { name: SmolStr, }, Color { name: &'a str, }, ColorModel { name: &'a str, }, Acronym { name: String, }, GlossaryEntry { name: String, }, File { name: SmolStr, }, Directory { name: SmolStr, }, Label { name: String, kind: Structure, header: Option, footer: Option, text: String, }, UserCommand { name: SmolStr, }, UserEnvironment { name: String, }, PgfLibrary { name: &'a str, }, TikzLibrary { name: &'a str, }, } impl<'a> InternalCompletionItemData<'a> { pub fn label<'b: 'a>(&'b self) -> &'a str { match self { Self::EntryType { ty } => &ty.name, Self::Field { field } => &field.name, Self::Argument { name, .. } => name, Self::BeginCommand => "begin", Self::Citation { key, .. } => key, Self::ComponentCommand { name, .. } => name, Self::ComponentEnvironment { name, .. } => name, Self::Class { name } => name, Self::Package { name } => name, Self::Color { name } => name, Self::ColorModel { name } => name, Self::Acronym { name } => name, Self::GlossaryEntry { name } => name, Self::File { name } => name, Self::Directory { name } => name, Self::Label { name, .. } => name, Self::UserCommand { name } => name, Self::UserEnvironment { name } => name, Self::PgfLibrary { name } => name, Self::TikzLibrary { name } => name, } } } #[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub enum CompletionItemData { Command, CommandSnippet, Environment, Label, Folder, File, PgfLibrary, TikzLibrary, Color, ColorModel, Package, Class, EntryType, FieldName, Citation { uri: Url, key: SmolStr }, Argument, Acronym, GlossaryEntry, }