emmylua_code_analysis/db_index/signature/
mod.rs

1use 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}