Skip to content

Commit 1eb0dfe

Browse files
committed
internal: simplify TokenSet implementation
1 parent 8e45912 commit 1eb0dfe

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

crates/parser/src/token_set.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ use crate::SyntaxKind;
66
#[derive(Clone, Copy)]
77
pub(crate) struct TokenSet([u64; 3]);
88

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.
912
const LAST_TOKEN_KIND_DISCRIMINANT: usize = SyntaxKind::SHEBANG as usize;
1013

1114
impl TokenSet {
@@ -15,13 +18,14 @@ impl TokenSet {
1518
let mut res = [0; 3];
1619
let mut i = 0;
1720
while i < kinds.len() {
18-
let kind = kinds[i];
21+
let discriminant = kinds[i] as usize;
1922
debug_assert!(
20-
kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT,
23+
discriminant <= LAST_TOKEN_KIND_DISCRIMINANT,
2124
"Expected a token `SyntaxKind`"
2225
);
23-
let idx = kind as usize / 64;
24-
res[idx] |= mask(kind);
26+
let idx = discriminant / 64;
27+
let mask = 1 << (discriminant % 64);
28+
res[idx] |= mask;
2529
i += 1;
2630
}
2731
TokenSet(res)
@@ -32,20 +36,17 @@ impl TokenSet {
3236
}
3337

3438
pub(crate) const fn contains(&self, kind: SyntaxKind) -> bool {
39+
let discriminant = kind as usize;
3540
debug_assert!(
36-
kind as usize <= LAST_TOKEN_KIND_DISCRIMINANT,
41+
discriminant <= LAST_TOKEN_KIND_DISCRIMINANT,
3742
"Expected a token `SyntaxKind`"
3843
);
39-
let idx = kind as usize / 64;
40-
self.0[idx] & mask(kind) != 0
44+
let idx = discriminant / 64;
45+
let mask = 1 << (discriminant % 64);
46+
self.0[idx] & mask != 0
4147
}
4248
}
4349

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-
4950
#[test]
5051
fn token_set_works_for_tokens() {
5152
use crate::SyntaxKind::*;

0 commit comments

Comments
 (0)