use crate::syntax::{
ast::{node::Node, Position},
parser::ParseError,
};
use boa_interner::{Interner, Sym, ToInternedString};
#[cfg(feature = "deser")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "deser", derive(Serialize, Deserialize))]
#[cfg_attr(feature = "deser", serde(transparent))]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Identifier {
ident: Sym,
}
impl Identifier {
pub fn new(ident: Sym) -> Self {
Self { ident }
}
pub fn sym(self) -> Sym {
self.ident
}
pub(crate) fn check_strict_arguments_or_eval(
self,
position: Position,
) -> Result<(), ParseError> {
match self.ident {
Sym::ARGUMENTS => Err(ParseError::general(
"unexpected identifier 'arguments' in strict mode",
position,
)),
Sym::EVAL => Err(ParseError::general(
"unexpected identifier 'eval' in strict mode",
position,
)),
_ => Ok(()),
}
}
}
impl ToInternedString for Identifier {
fn to_interned_string(&self, interner: &Interner) -> String {
interner.resolve_expect(self.ident).to_owned()
}
}
impl From<Sym> for Identifier {
fn from(sym: Sym) -> Self {
Self { ident: sym }
}
}
impl From<Identifier> for Node {
fn from(local: Identifier) -> Self {
Self::Identifier(local)
}
}