openpql_pql_parser/ast/
ident.rs1use super::{Loc, LocInfo, Spanned, str};
2
3#[derive(Clone, PartialEq, Eq, derive_more::From, derive_more::Debug)]
5#[debug("{}", self.inner)]
6pub struct Ident<'i> {
7 pub inner: &'i str,
9 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}