grass/crates/compiler/src/context_flags.rs
2023-01-07 19:47:32 +00:00

113 lines
3.0 KiB
Rust

use std::ops::{BitAnd, BitOr, BitOrAssign};
#[derive(Debug, Copy, Clone)]
pub(crate) struct ContextFlags(pub u16);
#[derive(Debug, Copy, Clone)]
pub(crate) struct ContextFlag(u16);
impl ContextFlags {
pub const IN_MIXIN: ContextFlag = ContextFlag(1);
pub const IN_FUNCTION: ContextFlag = ContextFlag(1 << 1);
pub const IN_CONTROL_FLOW: ContextFlag = ContextFlag(1 << 2);
pub const IN_KEYFRAMES: ContextFlag = ContextFlag(1 << 3);
pub const FOUND_CONTENT_RULE: ContextFlag = ContextFlag(1 << 4);
pub const IN_STYLE_RULE: ContextFlag = ContextFlag(1 << 5);
pub const IN_UNKNOWN_AT_RULE: ContextFlag = ContextFlag(1 << 6);
pub const IN_CONTENT_BLOCK: ContextFlag = ContextFlag(1 << 7);
pub const IS_USE_ALLOWED: ContextFlag = ContextFlag(1 << 8);
pub const IN_PARENS: ContextFlag = ContextFlag(1 << 9);
pub const AT_ROOT_EXCLUDING_STYLE_RULE: ContextFlag = ContextFlag(1 << 10);
pub const IN_SUPPORTS_DECLARATION: ContextFlag = ContextFlag(1 << 11);
pub const IN_SEMI_GLOBAL_SCOPE: ContextFlag = ContextFlag(1 << 12);
pub const fn empty() -> Self {
Self(0)
}
pub fn unset(&mut self, flag: ContextFlag) {
self.0 &= !flag.0;
}
pub fn set(&mut self, flag: ContextFlag, v: bool) {
if v {
self.0 |= flag.0;
} else {
self.unset(flag);
}
}
pub fn in_mixin(self) -> bool {
(self.0 & Self::IN_MIXIN) != 0
}
pub fn in_function(self) -> bool {
(self.0 & Self::IN_FUNCTION) != 0
}
pub fn in_control_flow(self) -> bool {
(self.0 & Self::IN_CONTROL_FLOW) != 0
}
pub fn in_keyframes(self) -> bool {
(self.0 & Self::IN_KEYFRAMES) != 0
}
pub fn in_style_rule(self) -> bool {
(self.0 & Self::IN_STYLE_RULE) != 0
}
pub fn in_unknown_at_rule(self) -> bool {
(self.0 & Self::IN_UNKNOWN_AT_RULE) != 0
}
pub fn in_content_block(self) -> bool {
(self.0 & Self::IN_CONTENT_BLOCK) != 0
}
pub fn in_parens(self) -> bool {
(self.0 & Self::IN_PARENS) != 0
}
pub fn at_root_excluding_style_rule(self) -> bool {
(self.0 & Self::AT_ROOT_EXCLUDING_STYLE_RULE) != 0
}
pub fn in_supports_declaration(self) -> bool {
(self.0 & Self::IN_SUPPORTS_DECLARATION) != 0
}
pub fn in_semi_global_scope(self) -> bool {
(self.0 & Self::IN_SEMI_GLOBAL_SCOPE) != 0
}
pub fn found_content_rule(self) -> bool {
(self.0 & Self::FOUND_CONTENT_RULE) != 0
}
pub fn is_use_allowed(self) -> bool {
(self.0 & Self::IS_USE_ALLOWED) != 0
}
}
impl BitAnd<ContextFlag> for u16 {
type Output = Self;
#[inline]
fn bitand(self, rhs: ContextFlag) -> Self::Output {
self & rhs.0
}
}
impl BitOr<ContextFlag> for ContextFlags {
type Output = Self;
fn bitor(self, rhs: ContextFlag) -> Self::Output {
Self(self.0 | rhs.0)
}
}
impl BitOrAssign<ContextFlag> for ContextFlags {
fn bitor_assign(&mut self, rhs: ContextFlag) {
self.0 |= rhs.0;
}
}