use crate::SymbolKind;
#[derive(Clone, Debug)]
pub struct CompletionItem {
#[allow(unused)]
pub completion_kind: CompletionKind,
pub label: String,
pub kind: Option<CompletionItemKind>,
pub detail: Option<String>,
}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum CompletionKind {
Reference,
BuiltinType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(unused)]
pub enum CompletionItemKind {
SymbolKind(SymbolKind),
Attribute,
Binding,
BuiltinType,
Keyword,
Method,
Snippet,
UnresolvedReference,
}
impl CompletionItemKind {
#[cfg(test)]
pub(crate) fn tag(&self) -> &'static str {
match self {
CompletionItemKind::SymbolKind(kind) => match kind {
SymbolKind::Field => "fd",
SymbolKind::Function => "fn",
SymbolKind::Local => "lc",
SymbolKind::Module => "md",
SymbolKind::Struct => "st",
SymbolKind::TypeAlias => "ta",
},
CompletionItemKind::Attribute => "at",
CompletionItemKind::Binding => "bn",
CompletionItemKind::BuiltinType => "bt",
CompletionItemKind::Keyword => "kw",
CompletionItemKind::Method => "me",
CompletionItemKind::Snippet => "sn",
CompletionItemKind::UnresolvedReference => "??",
}
}
}
impl From<SymbolKind> for CompletionItemKind {
fn from(kind: SymbolKind) -> Self {
CompletionItemKind::SymbolKind(kind)
}
}
impl CompletionItem {
pub fn builder(kind: CompletionKind, label: impl Into<String>) -> Builder {
Builder {
label: label.into(),
kind: None,
completion_kind: kind,
detail: None,
}
}
}
pub struct Builder {
label: String,
completion_kind: CompletionKind,
kind: Option<CompletionItemKind>,
detail: Option<String>,
}
impl Builder {
pub fn finish(self) -> CompletionItem {
CompletionItem {
completion_kind: self.completion_kind,
label: self.label,
kind: self.kind,
detail: self.detail,
}
}
pub fn kind(mut self, kind: impl Into<CompletionItemKind>) -> Builder {
self.kind = Some(kind.into());
self
}
pub fn detail(mut self, detail: impl Into<String>) -> Builder {
self.detail = Some(detail.into());
self
}
}