diff options
Diffstat (limited to 'crates/ra_syntax/src/parsing/token_set.rs')
-rw-r--r-- | crates/ra_syntax/src/parsing/token_set.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/crates/ra_syntax/src/parsing/token_set.rs b/crates/ra_syntax/src/parsing/token_set.rs new file mode 100644 index 000000000..5719fe5a2 --- /dev/null +++ b/crates/ra_syntax/src/parsing/token_set.rs | |||
@@ -0,0 +1,41 @@ | |||
1 | use crate::SyntaxKind; | ||
2 | |||
3 | #[derive(Clone, Copy)] | ||
4 | pub(crate) struct TokenSet(u128); | ||
5 | |||
6 | impl TokenSet { | ||
7 | pub(crate) const fn empty() -> TokenSet { | ||
8 | TokenSet(0) | ||
9 | } | ||
10 | |||
11 | pub(crate) const fn singleton(kind: SyntaxKind) -> TokenSet { | ||
12 | TokenSet(mask(kind)) | ||
13 | } | ||
14 | |||
15 | pub(crate) const fn union(self, other: TokenSet) -> TokenSet { | ||
16 | TokenSet(self.0 | other.0) | ||
17 | } | ||
18 | |||
19 | pub(crate) fn contains(&self, kind: SyntaxKind) -> bool { | ||
20 | self.0 & mask(kind) != 0 | ||
21 | } | ||
22 | } | ||
23 | |||
24 | const fn mask(kind: SyntaxKind) -> u128 { | ||
25 | 1u128 << (kind as usize) | ||
26 | } | ||
27 | |||
28 | #[macro_export] | ||
29 | macro_rules! token_set { | ||
30 | ($($t:ident),*) => { TokenSet::empty()$(.union(TokenSet::singleton($t)))* }; | ||
31 | ($($t:ident),* ,) => { token_set!($($t),*) }; | ||
32 | } | ||
33 | |||
34 | #[test] | ||
35 | fn token_set_works_for_tokens() { | ||
36 | use crate::SyntaxKind::*; | ||
37 | let ts = token_set! { EOF, SHEBANG }; | ||
38 | assert!(ts.contains(EOF)); | ||
39 | assert!(ts.contains(SHEBANG)); | ||
40 | assert!(!ts.contains(PLUS)); | ||
41 | } | ||