use compact_str::CompactString;
mod extract;
mod index;
mod score;
pub use extract::extract_symbols;
pub(crate) use extract::extract_symbols_from_tree;
pub use index::{SymbolIndex, UpsertOutcome};
pub const MAX_SYMBOLS_PER_FILE: usize = 10_000;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum SymbolKind {
Function,
Method,
Class,
Interface,
Module,
Macro,
Constant,
Type,
Field,
Property,
Heading,
}
impl SymbolKind {
fn from_capture(capture: &str) -> Option<Self> {
match capture.strip_prefix("definition.")? {
"function" => Some(Self::Function),
"method" => Some(Self::Method),
"class" | "struct" | "enum" | "union" => Some(Self::Class),
"interface" | "trait" | "protocol" => Some(Self::Interface),
"module" | "namespace" | "package" => Some(Self::Module),
"macro" => Some(Self::Macro),
"constant" => Some(Self::Constant),
"type" => Some(Self::Type),
"field" => Some(Self::Field),
"property" => Some(Self::Property),
"heading" => Some(Self::Heading),
_ => None,
}
}
pub fn glyph(self) -> &'static str {
match self {
Self::Function => "ƒ",
Self::Method => "m",
Self::Class => "C",
Self::Interface => "I",
Self::Module => "M",
Self::Macro => "!",
Self::Constant => "c",
Self::Type => "T",
Self::Field => "f",
Self::Property => "p",
Self::Heading => "#",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Symbol {
pub name: CompactString,
pub kind: SymbolKind,
pub line: u32,
pub column: u32,
pub depth: u16,
pub name_start: u32,
pub def_start: u32,
pub def_end: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileSymbols {
pub path: CompactString,
pub content_hash: u64,
pub symbols: Vec<Symbol>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SymbolRef<'a> {
pub path: &'a str,
pub symbol: &'a Symbol,
}
impl SymbolRef<'_> {
pub fn search_label(&self) -> String {
format!(
"{} {} {}:{}",
self.symbol.kind.glyph(),
self.symbol.name,
self.path,
self.symbol.line
)
}
}
pub fn kind_specificity(kind: SymbolKind) -> u8 {
match kind {
SymbolKind::Method => 0,
SymbolKind::Property => 1,
SymbolKind::Field => 2,
SymbolKind::Constant => 3,
SymbolKind::Macro => 4,
SymbolKind::Function => 5,
SymbolKind::Interface => 6,
SymbolKind::Class => 7,
SymbolKind::Type => 8,
SymbolKind::Module => 9,
SymbolKind::Heading => 10,
}
}
pub fn jump_priority(kind: SymbolKind) -> u8 {
match kind {
SymbolKind::Class | SymbolKind::Interface | SymbolKind::Type => 0,
SymbolKind::Function | SymbolKind::Method | SymbolKind::Macro => 1,
SymbolKind::Constant | SymbolKind::Module => 2,
SymbolKind::Field | SymbolKind::Property | SymbolKind::Heading => 3,
}
}