Skip to content

Commit dab685d

Browse files
committed
De-magic number parser::Output encoding
1 parent bfe82cd commit dab685d

File tree

1 file changed

+36
-13
lines changed

1 file changed

+36
-13
lines changed

crates/parser/src/output.rs

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,47 +31,70 @@ pub enum Step<'a> {
3131
}
3232

3333
impl Output {
34+
const EVENT_MASK: u32 = 0b1;
35+
const TAG_MASK: u32 = 0x0000_00F0;
36+
const N_INPUT_TOKEN_MASK: u32 = 0x0000_FF00;
37+
const KIND_MASK: u32 = 0xFFFF_0000;
38+
39+
const ERROR_SHIFT: u32 = Self::EVENT_MASK.trailing_ones();
40+
const TAG_SHIFT: u32 = Self::TAG_MASK.trailing_zeros();
41+
const N_INPUT_TOKEN_SHIFT: u32 = Self::N_INPUT_TOKEN_MASK.trailing_zeros();
42+
const KIND_SHIFT: u32 = Self::KIND_MASK.trailing_zeros();
43+
44+
const TOKEN_EVENT: u8 = 0;
45+
const ENTER_EVENT: u8 = 1;
46+
const EXIT_EVENT: u8 = 2;
47+
3448
pub fn iter(&self) -> impl Iterator<Item = Step<'_>> {
3549
self.event.iter().map(|&event| {
36-
if event & 0b1 == 0 {
37-
return Step::Error { msg: self.error[(event as usize) >> 1].as_str() };
50+
if event & Self::EVENT_MASK == 0 {
51+
return Step::Error {
52+
msg: self.error[(event as usize) >> Self::ERROR_SHIFT].as_str(),
53+
};
3854
}
39-
let tag = ((event & 0x0000_00F0) >> 4) as u8;
55+
let tag = ((event & Self::TAG_MASK) >> Self::TAG_SHIFT) as u8;
4056
match tag {
41-
0 => {
42-
let kind: SyntaxKind = (((event & 0xFFFF_0000) >> 16) as u16).into();
43-
let n_input_tokens = ((event & 0x0000_FF00) >> 8) as u8;
57+
Self::TOKEN_EVENT => {
58+
let kind: SyntaxKind =
59+
(((event & Self::KIND_MASK) >> Self::KIND_SHIFT) as u16).into();
60+
let n_input_tokens =
61+
((event & Self::N_INPUT_TOKEN_MASK) >> Self::N_INPUT_TOKEN_SHIFT) as u8;
4462
Step::Token { kind, n_input_tokens }
4563
}
46-
1 => {
47-
let kind: SyntaxKind = (((event & 0xFFFF_0000) >> 16) as u16).into();
64+
Self::ENTER_EVENT => {
65+
let kind: SyntaxKind =
66+
(((event & Self::KIND_MASK) >> Self::KIND_SHIFT) as u16).into();
4867
Step::Enter { kind }
4968
}
50-
2 => Step::Exit,
69+
Self::EXIT_EVENT => Step::Exit,
5170
_ => unreachable!(),
5271
}
5372
})
5473
}
5574

5675
pub(crate) fn token(&mut self, kind: SyntaxKind, n_tokens: u8) {
57-
let e = ((kind as u16 as u32) << 16) | ((n_tokens as u32) << 8) | 1;
76+
let e = ((kind as u16 as u32) << Self::KIND_SHIFT)
77+
| ((n_tokens as u32) << Self::N_INPUT_TOKEN_SHIFT)
78+
| Self::EVENT_MASK;
5879
self.event.push(e)
5980
}
6081

6182
pub(crate) fn enter_node(&mut self, kind: SyntaxKind) {
62-
let e = ((kind as u16 as u32) << 16) | (1 << 4) | 1;
83+
let e = ((kind as u16 as u32) << Self::KIND_SHIFT)
84+
| ((Self::ENTER_EVENT as u32) << Self::TAG_SHIFT)
85+
| Self::EVENT_MASK;
6386
self.event.push(e)
6487
}
6588

6689
pub(crate) fn leave_node(&mut self) {
67-
let e = 2 << 4 | 1;
90+
let e = (Self::EXIT_EVENT as u32) << Self::TAG_SHIFT | Self::EVENT_MASK;
6891
self.event.push(e)
6992
}
7093

7194
pub(crate) fn error(&mut self, error: String) {
7295
let idx = self.error.len();
7396
self.error.push(error);
74-
let e = (idx as u32) << 1;
97+
let e = (idx as u32) << Self::ERROR_SHIFT;
7598
self.event.push(e);
7699
}
77100
}

0 commit comments

Comments
 (0)