@@ -6,6 +6,9 @@ use crate::SyntaxKind;
6
6
#[ derive( Clone , Copy ) ]
7
7
pub ( crate ) struct TokenSet ( [ u64 ; 3 ] ) ;
8
8
9
+ /// `TokenSet`s should only include token `SyntaxKind`s, so the discriminant of any passed/included
10
+ /// `SyntaxKind` must *not* be greater than that of the last token `SyntaxKind`.
11
+ /// See #17037.
9
12
const LAST_TOKEN_KIND_DISCRIMINANT : usize = SyntaxKind :: SHEBANG as usize ;
10
13
11
14
impl TokenSet {
@@ -15,13 +18,13 @@ impl TokenSet {
15
18
let mut res = [ 0 ; 3 ] ;
16
19
let mut i = 0 ;
17
20
while i < kinds. len ( ) {
18
- let kind = kinds[ i] ;
21
+ let discriminant = kinds[ i] as usize ;
19
22
debug_assert ! (
20
- kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT ,
23
+ discriminant <= LAST_TOKEN_KIND_DISCRIMINANT ,
21
24
"Expected a token `SyntaxKind`"
22
25
) ;
23
- let idx = kind as usize / 64 ;
24
- res[ idx] |= mask ( kind ) ;
26
+ let idx = discriminant / 64 ;
27
+ res[ idx] |= 1 << ( discriminant % 64 ) ;
25
28
i += 1 ;
26
29
}
27
30
TokenSet ( res)
@@ -32,20 +35,17 @@ impl TokenSet {
32
35
}
33
36
34
37
pub ( crate ) const fn contains ( & self , kind : SyntaxKind ) -> bool {
38
+ let discriminant = kind as usize ;
35
39
debug_assert ! (
36
- kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT ,
40
+ discriminant <= LAST_TOKEN_KIND_DISCRIMINANT ,
37
41
"Expected a token `SyntaxKind`"
38
42
) ;
39
- let idx = kind as usize / 64 ;
40
- self . 0 [ idx] & mask ( kind) != 0
43
+ let idx = discriminant / 64 ;
44
+ let mask = 1 << ( discriminant % 64 ) ;
45
+ self . 0 [ idx] & mask != 0
41
46
}
42
47
}
43
48
44
- const fn mask ( kind : SyntaxKind ) -> u64 {
45
- debug_assert ! ( kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT , "Expected a token `SyntaxKind`" ) ;
46
- 1 << ( kind as usize % 64 )
47
- }
48
-
49
49
#[ test]
50
50
fn token_set_works_for_tokens ( ) {
51
51
use crate :: SyntaxKind :: * ;
0 commit comments