diff options
Diffstat (limited to 'support/texlab/crates/symbols/src/types.rs')
-rw-r--r-- | support/texlab/crates/symbols/src/types.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/support/texlab/crates/symbols/src/types.rs b/support/texlab/crates/symbols/src/types.rs new file mode 100644 index 0000000000..d78f9af200 --- /dev/null +++ b/support/texlab/crates/symbols/src/types.rs @@ -0,0 +1,89 @@ +use base_db::{data::BibtexEntryTypeCategory, semantics::Span, Document}; +use rowan::TextRange; + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum SymbolKind { + Section, + Figure, + Algorithm, + Table, + Listing, + Enumeration, + EnumerationItem, + Theorem, + Equation, + Entry(BibtexEntryTypeCategory), + Field, +} + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct Symbol { + pub name: String, + pub kind: SymbolKind, + pub label: Option<Span>, + pub full_range: TextRange, + pub selection_range: TextRange, + pub children: Vec<Symbol>, +} + +impl Symbol { + pub fn new_simple( + name: String, + kind: SymbolKind, + full_range: TextRange, + selection_range: TextRange, + ) -> Self { + Self { + name, + kind, + label: None, + full_range, + selection_range, + children: Vec::new(), + } + } + + pub fn new_label(name: String, kind: SymbolKind, range: TextRange, label: Span) -> Self { + Self { + name, + kind, + full_range: range, + selection_range: label.range, + label: Some(label), + children: Vec::new(), + } + } + + pub fn keywords<'a>(&'a self) -> Vec<&'a str> { + match self.kind { + SymbolKind::Section => vec![&self.name, "latex", "section"], + SymbolKind::Figure => vec![&self.name, "latex", "float", "figure"], + SymbolKind::Algorithm => vec![&self.name, "latex", "float", "algorithm"], + SymbolKind::Table => vec![&self.name, "latex", "float", "table"], + SymbolKind::Listing => vec![&self.name, "latex", "float", "listing"], + SymbolKind::Enumeration => vec![&self.name, "latex", "enumeration"], + SymbolKind::EnumerationItem => vec![&self.name, "latex", "enumeration", "item"], + SymbolKind::Theorem => vec![&self.name, "latex", "math"], + SymbolKind::Equation => vec![&self.name, "latex", "math", "equation"], + SymbolKind::Entry(BibtexEntryTypeCategory::String) => { + vec![&self.name, "bibtex", "string"] + } + SymbolKind::Entry(_) => vec![&self.name, "bibtex", "entry"], + SymbolKind::Field => vec![&self.name, "bibtex", "field"], + } + } + + pub fn flatten(mut self, buffer: &mut Vec<Self>) { + for symbol in self.children.drain(..) { + symbol.flatten(buffer); + } + + buffer.push(self); + } +} + +#[derive(Debug)] +pub struct SymbolLocation<'a> { + pub document: &'a Document, + pub symbol: Symbol, +} |