@@ -31,47 +31,70 @@ pub enum Step<'a> {
3131}
3232
3333impl 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