emmylua_code_analysis/db_index/signature/
mod.rs1use std::collections::{HashMap, HashSet};
2
3pub use signature::{LuaSignature, LuaSignatureId, LuaDocParamInfo, LuaDocReturnInfo};
4
5use crate::FileId;
6
7use super::traits::LuaIndex;
8
9mod signature;
10
11#[derive(Debug)]
12pub struct LuaSignatureIndex {
13 signatures: HashMap<LuaSignatureId, LuaSignature>,
14 in_file_signatures: HashMap<FileId, HashSet<LuaSignatureId>>,
15}
16
17impl LuaSignatureIndex {
18 pub fn new() -> Self {
19 Self {
20 signatures: HashMap::new(),
21 in_file_signatures: HashMap::new(),
22 }
23 }
24
25 pub fn get_or_create(&mut self, signature_id: LuaSignatureId) -> &mut LuaSignature {
26 self.in_file_signatures.entry(signature_id.get_file_id()).or_default().insert(signature_id);
27 self.signatures.entry(signature_id).or_insert_with(LuaSignature::new)
28 }
29
30 pub fn get(&self, signature_id: &LuaSignatureId) -> Option<&LuaSignature> {
31 self.signatures.get(signature_id)
32 }
33
34 pub fn get_mut(&mut self, signature_id: &LuaSignatureId) -> Option<&mut LuaSignature> {
35 self.signatures.get_mut(signature_id)
36 }
37}
38
39impl LuaIndex for LuaSignatureIndex {
40 fn remove(&mut self, file_id: FileId) {
41 if let Some(signature_ids) = self.in_file_signatures.remove(&file_id) {
42 for signature_id in signature_ids {
43 self.signatures.remove(&signature_id);
44 }
45 }
46 }
47
48 fn fill_snapshot_info(&self, info: &mut HashMap<String, String>) {
49 info.insert("signature_count".to_string(), self.signatures.len().to_string());
50 }
51}