swc_ecma_transforms_base/rename/analyzer/
reverse_map.rs1use rustc_hash::FxHashMap;
2use swc_atoms::Atom;
3use swc_ecma_ast::Id;
4
5#[derive(Debug, Default)]
6pub(crate) struct ReverseMap<'a> {
7 prev: Option<&'a ReverseMap<'a>>,
8
9 inner: FxHashMap<Atom, Vec<Id>>,
10}
11
12impl ReverseMap<'_> {
13 pub fn push_entry(&mut self, key: Atom, id: Id) {
14 self.inner.entry(key).or_default().push(id);
15 }
16
17 fn iter(&self) -> Iter {
18 Iter { cur: Some(self) }
19 }
20
21 pub fn get<'a>(&'a self, key: &'a Atom) -> impl Iterator<Item = &'a Id> + 'a {
22 self.iter()
23 .filter_map(|v| v.inner.get(key))
24 .flat_map(|v| v.iter())
25 }
26
27 pub fn next(&self) -> ReverseMap {
28 ReverseMap {
29 prev: Some(self),
30 ..Default::default()
31 }
32 }
33}
34
35pub(crate) struct Iter<'a> {
36 cur: Option<&'a ReverseMap<'a>>,
37}
38
39impl<'a> Iterator for Iter<'a> {
40 type Item = &'a ReverseMap<'a>;
41
42 fn next(&mut self) -> Option<Self::Item> {
43 let cur = self.cur.take()?;
44 self.cur = cur.prev;
45 Some(cur)
46 }
47}