@@ -31,47 +31,70 @@ pub enum Step<'a> {
31
31
}
32
32
33
33
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
+
34
48
pub fn iter ( & self ) -> impl Iterator < Item = Step < ' _ > > {
35
49
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
+ } ;
38
54
}
39
- let tag = ( ( event & 0x0000_00F0 ) >> 4 ) as u8 ;
55
+ let tag = ( ( event & Self :: TAG_MASK ) >> Self :: TAG_SHIFT ) as u8 ;
40
56
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 ;
44
62
Step :: Token { kind, n_input_tokens }
45
63
}
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 ( ) ;
48
67
Step :: Enter { kind }
49
68
}
50
- 2 => Step :: Exit ,
69
+ Self :: EXIT_EVENT => Step :: Exit ,
51
70
_ => unreachable ! ( ) ,
52
71
}
53
72
} )
54
73
}
55
74
56
75
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 ;
58
79
self . event . push ( e)
59
80
}
60
81
61
82
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 ;
63
86
self . event . push ( e)
64
87
}
65
88
66
89
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 ;
68
91
self . event . push ( e)
69
92
}
70
93
71
94
pub ( crate ) fn error ( & mut self , error : String ) {
72
95
let idx = self . error . len ( ) ;
73
96
self . error . push ( error) ;
74
- let e = ( idx as u32 ) << 1 ;
97
+ let e = ( idx as u32 ) << Self :: ERROR_SHIFT ;
75
98
self . event . push ( e) ;
76
99
}
77
100
}
0 commit comments