Coverage Report

Created: 2026-09-14 07:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wasm-tools/crates/wast/src/names.rs
Line
Count
Source
1
use crate::Error;
2
use crate::token::{Id, Index};
3
use std::collections::HashMap;
4
5
#[derive(Default)]
6
pub struct Namespace<'a> {
7
    names: HashMap<Id<'a>, u32>,
8
    count: u32,
9
}
10
11
impl<'a> Namespace<'a> {
12
2.97M
    pub fn register(&mut self, name: Option<Id<'a>>, desc: &str) -> Result<u32, Error> {
13
2.97M
        let index = self.alloc();
14
2.97M
        if let Some(name) = name {
15
55.2k
            if let Some(_prev) = self.names.insert(name, index) {
16
0
                return Err(Error::new(
17
0
                    name.span(),
18
0
                    format!("duplicate {desc} identifier"),
19
0
                ));
20
55.2k
            }
21
2.92M
        }
22
2.97M
        Ok(index)
23
2.97M
    }
24
25
2.97M
    pub fn alloc(&mut self) -> u32 {
26
2.97M
        let index = self.count;
27
2.97M
        self.count += 1;
28
2.97M
        index
29
2.97M
    }
30
31
0
    pub fn register_specific(&mut self, name: Id<'a>, index: u32, desc: &str) -> Result<(), Error> {
32
0
        if let Some(_prev) = self.names.insert(name, index) {
33
0
            return Err(Error::new(
34
0
                name.span(),
35
0
                format!(
36
0
                    "duplicate identifier: duplicate {desc} named `{}`",
37
0
                    name.name()
38
0
                ),
39
0
            ));
40
0
        }
41
0
        Ok(())
42
0
    }
43
44
3.16M
    pub fn resolve(&self, idx: &mut Index<'a>, desc: &str) -> Result<u32, Error> {
45
3.16M
        self.try_resolve(idx).ok_or_else(|| match idx {
46
0
            Index::Num(..) => unreachable!(),
47
0
            Index::Id(id) => resolve_error(*id, desc),
48
0
        })
49
3.16M
    }
50
51
3.16M
    pub fn try_resolve(&self, idx: &mut Index<'a>) -> Option<u32> {
52
3.16M
        let id = match idx {
53
3.09M
            Index::Num(n, _) => return Some(*n),
54
65.0k
            Index::Id(id) => id,
55
        };
56
65.0k
        if let Some(&n) = self.names.get(id) {
57
65.0k
            *idx = Index::Num(n, id.span());
58
65.0k
            return Some(n);
59
0
        }
60
0
        None
61
3.16M
    }
62
}
63
64
0
pub fn resolve_error(id: Id<'_>, ns: &str) -> Error {
65
0
    assert!(
66
0
        !id.is_gensym(),
67
        "symbol generated by `wast` itself cannot be resolved {id:?}"
68
    );
69
0
    Error::new(
70
0
        id.span(),
71
0
        format!("unknown {ns}: failed to find name `${}`", id.name()),
72
    )
73
0
}