use oxc_ecmascript::constant_evaluation::ConstantValue;
use oxc_syntax::reference::ReferenceFlags;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FreshValueKind {
None,
Function,
Class,
Object,
Array,
}
#[derive(Debug, Clone, Copy, Default)]
pub struct ReferenceCounts {
reads: u32,
writes: u32,
member_write_target_reads: u32,
}
impl ReferenceCounts {
#[inline]
pub fn record(&mut self, flags: ReferenceFlags) {
debug_assert!(!flags.is_member_write_target() || flags.is_read());
if flags.is_read() {
self.reads += 1;
}
if flags.is_write() {
self.writes += 1;
}
if flags.is_member_write_target() {
self.member_write_target_reads += 1;
}
}
#[inline]
pub fn has_reads(self) -> bool {
self.reads > 0
}
#[inline]
pub fn has_writes(self) -> bool {
self.writes > 0
}
#[inline]
pub fn has_single_read(self) -> bool {
self.reads == 1
}
#[inline]
pub fn has_multiple_reads(self) -> bool {
self.reads > 1
}
#[inline]
pub fn has_only_member_write_target_reads(self) -> bool {
self.writes == 0 && self.reads == self.member_write_target_reads
}
}
#[derive(Debug)]
pub struct SymbolValue<'a> {
pub initialized_constant: Option<ConstantValue<'a>>,
pub implicit_undefined: bool,
pub references: ReferenceCounts,
pub kind: FreshValueKind,
pub boolean_falsy: bool,
}