Skip to main content

openpql_pql_parser/ast/
ident.rs

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