From b5021411a84822cb3f1e3aeffad9550dd15bdeb6 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 16 Sep 2018 12:54:24 +0300 Subject: rename all things --- crates/ra_syntax/src/token_set.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 crates/ra_syntax/src/token_set.rs (limited to 'crates/ra_syntax/src/token_set.rs') diff --git a/crates/ra_syntax/src/token_set.rs b/crates/ra_syntax/src/token_set.rs new file mode 100644 index 000000000..c83fba81b --- /dev/null +++ b/crates/ra_syntax/src/token_set.rs @@ -0,0 +1,37 @@ +use SyntaxKind; + +#[derive(Clone, Copy)] +pub(crate) struct TokenSet(pub(crate) u128); + +fn mask(kind: SyntaxKind) -> u128 { + 1u128 << (kind as usize) +} + +impl TokenSet { + pub const EMPTY: TokenSet = TokenSet(0); + + pub fn contains(&self, kind: SyntaxKind) -> bool { + self.0 & mask(kind) != 0 + } +} + +#[macro_export] +macro_rules! token_set { + ($($t:ident),*) => { TokenSet($(1u128 << ($t as usize))|*) }; + ($($t:ident),* ,) => { token_set!($($t),*) }; +} + +#[macro_export] +macro_rules! token_set_union { + ($($ts:expr),*) => { TokenSet($($ts.0)|*) }; + ($($ts:expr),* ,) => { token_set_union!($($ts),*) }; +} + +#[test] +fn token_set_works_for_tokens() { + use SyntaxKind::*; + let ts = token_set! { EOF, SHEBANG }; + assert!(ts.contains(EOF)); + assert!(ts.contains(SHEBANG)); + assert!(!ts.contains(PLUS)); +} -- cgit v1.2.3