Skip to main content

openpql_pql_parser/ast/
ident.rs

1use super::{Loc, LocInfo, Spanned, str};
2
3/// Identifier token borrowed from the source.
4#[derive(Clone, PartialEq, Eq, derive_more::From, derive_more::Debug)]
5#[debug("{}", self.inner)]
6pub struct Ident<'i> {
7    /// Identifier text as it appears in the source.
8    pub inner: &'i str,
9    /// Source span of the identifier.
10    pub loc: (Loc, Loc),
11}
12
13impl Spanned for Ident<'_> {
14    fn loc(&self) -> LocInfo {
15        self.loc
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use super::*;
22    use crate::*;
23
24    fn assert_ident(src: &str, expected: &str) {
25        let loc_start = 0;
26        let loc_end = src.len();
27
28        assert_eq!(
29            parse_ident(src),
30            Ok((expected, (loc_start, loc_end)).into())
31        );
32    }
33
34    #[test]
35    fn test_ident() {
36        assert_ident("_", "_");
37
38        for c in "0123456789".chars() {
39            let input = format!("_{c}");
40            assert_ident(&input, &input);
41        }
42
43        let mut c = 'a';
44
45        while c <= 'z' {
46            let lowercase = format!("{c}");
47            assert_ident(&lowercase, &lowercase);
48
49            let uppercase = format!("{}", c.to_uppercase());
50            assert_ident(&uppercase, &uppercase);
51
52            c = (c as u8 + 1) as char;
53        }
54
55        assert_ident("__abc123", "__abc123");
56    }
57
58    #[test]
59    fn test_dbg() {
60        assert_eq!(
61            format!("{:?}", Ident::from(("content", (0, 1)))),
62            "content"
63        );
64    }
65
66    #[test]
67    fn test_loc() {
68        let id = Ident::from(("hero", (2, 6)));
69        assert_eq!(id.loc(), (2, 6));
70    }
71}