1use std::fmt;23use crate::SyntaxKind;45#[derive(Clone, Copy, Default)]6pub struct SyntaxKindSet(u128);78impl SyntaxKindSet {9 #[allow(dead_code)]10 pub const EMPTY: Self = Self(0);11 pub const ALL: Self = Self(u128::MAX);1213 pub const fn new(kinds: &[SyntaxKind]) -> SyntaxKindSet {14 let mut res = 0u128;15 let mut i = 0;16 while i < kinds.len() {17 res |= mask(kinds[i]);18 i += 119 }20 SyntaxKindSet(res)21 }2223 pub const fn union(self, other: SyntaxKindSet) -> SyntaxKindSet {24 SyntaxKindSet(self.0 | other.0)25 }26 pub const fn with(self, kind: SyntaxKind) -> SyntaxKindSet {27 SyntaxKindSet(self.0 | mask(kind))28 }2930 pub fn contains(&self, kind: SyntaxKind) -> bool {31 if !is_token(kind) {32 return false;33 }34 self.0 & mask(kind) != 035 }36}37impl fmt::Display for SyntaxKindSet {38 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {39 let mut v = self.0;40 let mut variants = <Vec<SyntaxKind>>::new();41 for i in 0..128 {42 if v & 1 == 1 {43 variants.push(SyntaxKind::from_raw(i))44 }45 v >>= 1;46 if v == 0 {47 break;48 }49 }50 for (i, v) in variants.iter().enumerate() {51 if i == 0 {52 } else if i == variants.len() - 1 {53 write!(f, " or ")?;54 } else {55 write!(f, ", ")?;56 }57 write!(f, "{v:?}")?;58 }59 Ok(())60 }61}62impl fmt::Debug for SyntaxKindSet {63 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {64 let mut v = self.0;65 let mut variants = <Vec<SyntaxKind>>::new();66 for i in 0..128 {67 if v & 1 == 1 {68 variants.push(SyntaxKind::from_raw(i))69 }70 v >>= 1;71 if v == 0 {72 break;73 }74 }75 f.debug_tuple("SyntaxKindSet").field(&variants).finish()76 }77}7879const fn mask(kind: SyntaxKind) -> u128 {80 if kind as u32 > 128 {81 panic!("mask for not a token kind")82 }83 1u128 << (kind as u128)84}8586#[macro_export]87macro_rules! TS {88 ($($tt:tt)*) => {89 $crate::SyntaxKindSet::new(&[90 $(91 $crate::T![$tt]92 ),*93 ])94 };95}9697#[test]98fn sanity() {99 assert!(100 (SyntaxKind::LEXING_ERROR as u32) < 127,101 "can't keep KindSet as bitset"102 );103}104fn is_token(kind: SyntaxKind) -> bool {105 (kind as u32) < 127106}