git.delta.rocks / jrsonnet / refs/commits / b5d51b90d7ba

difftreelog

source

crates/jrsonnet-rowan-parser/src/token_set.rs2.0 KiBsourcehistory
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}