hearth_graph/symbols/
mod.rs1use compact_str::CompactString;
7
8mod extract;
9mod index;
10mod score;
11
12pub use extract::extract_symbols;
13pub(crate) use extract::extract_symbols_from_tree;
14pub use index::{SymbolIndex, UpsertOutcome};
15
16pub const MAX_SYMBOLS_PER_FILE: usize = 10_000;
20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
23pub enum SymbolKind {
24 Function,
26 Method,
28 Class,
30 Interface,
32 Module,
34 Macro,
36 Constant,
38 Type,
40 Field,
42 Property,
44 Heading,
46}
47
48impl SymbolKind {
49 fn from_capture(capture: &str) -> Option<Self> {
51 match capture.strip_prefix("definition.")? {
52 "function" => Some(Self::Function),
53 "method" => Some(Self::Method),
54 "class" | "struct" | "enum" | "union" => Some(Self::Class),
55 "interface" | "trait" | "protocol" => Some(Self::Interface),
56 "module" | "namespace" | "package" => Some(Self::Module),
57 "macro" => Some(Self::Macro),
58 "constant" => Some(Self::Constant),
59 "type" => Some(Self::Type),
60 "field" => Some(Self::Field),
61 "property" => Some(Self::Property),
62 "heading" => Some(Self::Heading),
63 _ => None,
64 }
65 }
66
67 pub fn glyph(self) -> &'static str {
69 match self {
70 Self::Function => "ƒ",
71 Self::Method => "m",
72 Self::Class => "C",
73 Self::Interface => "I",
74 Self::Module => "M",
75 Self::Macro => "!",
76 Self::Constant => "c",
77 Self::Type => "T",
78 Self::Field => "f",
79 Self::Property => "p",
80 Self::Heading => "#",
81 }
82 }
83}
84
85#[derive(Debug, Clone, PartialEq, Eq)]
87pub struct Symbol {
88 pub name: CompactString,
90 pub kind: SymbolKind,
92 pub line: u32,
94 pub column: u32,
96 pub depth: u16,
98 pub name_start: u32,
100 pub def_start: u32,
102 pub def_end: u32,
104}
105
106#[derive(Debug, Clone, PartialEq, Eq)]
108pub struct FileSymbols {
109 pub path: CompactString,
111 pub content_hash: u64,
113 pub symbols: Vec<Symbol>,
115}
116
117#[derive(Debug, Clone, Copy, PartialEq, Eq)]
119pub struct SymbolRef<'a> {
120 pub path: &'a str,
122 pub symbol: &'a Symbol,
124}
125
126impl SymbolRef<'_> {
127 pub fn search_label(&self) -> String {
129 format!(
130 "{} {} {}:{}",
131 self.symbol.kind.glyph(),
132 self.symbol.name,
133 self.path,
134 self.symbol.line
135 )
136 }
137}
138
139pub fn kind_specificity(kind: SymbolKind) -> u8 {
143 match kind {
144 SymbolKind::Method => 0,
145 SymbolKind::Property => 1,
146 SymbolKind::Field => 2,
147 SymbolKind::Constant => 3,
148 SymbolKind::Macro => 4,
149 SymbolKind::Function => 5,
150 SymbolKind::Interface => 6,
151 SymbolKind::Class => 7,
152 SymbolKind::Type => 8,
153 SymbolKind::Module => 9,
154 SymbolKind::Heading => 10,
155 }
156}
157
158pub fn jump_priority(kind: SymbolKind) -> u8 {
162 match kind {
163 SymbolKind::Class | SymbolKind::Interface | SymbolKind::Type => 0,
164 SymbolKind::Function | SymbolKind::Method | SymbolKind::Macro => 1,
165 SymbolKind::Constant | SymbolKind::Module => 2,
166 SymbolKind::Field | SymbolKind::Property | SymbolKind::Heading => 3,
167 }
168}