use crate::typescript::TsTypeAnn;
use swc_atoms::JsWord;
use swc_common::{ast_node, Span};
#[ast_node("Identifier")]
pub struct Ident {
pub span: Span,
#[serde(rename = "value")]
#[cfg_attr(feature = "fold", fold(ignore))]
pub sym: JsWord,
#[serde(default, rename = "typeAnnotation")]
pub type_ann: Option<TsTypeAnn>,
#[serde(default)]
pub optional: bool,
}
#[ast_node("PrivateName")]
pub struct PrivateName {
pub span: Span,
pub id: Ident,
}
impl AsRef<str> for Ident {
fn as_ref(&self) -> &str {
&self.sym
}
}
impl Ident {
pub const fn new(sym: JsWord, span: Span) -> Self {
Ident {
span,
sym,
type_ann: None,
optional: false,
}
}
}
pub trait IdentExt: AsRef<str> {
fn is_reserved_for_es3(&self) -> bool {
[
"abstract",
"boolean",
"break",
"byte",
"case",
"catch",
"char",
"class",
"const",
"continue",
"debugger",
"default",
"delete",
"do",
"double",
"else",
"enum",
"export",
"extends",
"false",
"final",
"finally",
"float",
"for",
"function",
"goto",
"if",
"implements",
"import",
"in",
"instanceof",
"int",
"interface",
"long",
"native",
"new",
"null",
"package",
"private",
"protected",
"public",
"return",
"short",
"static",
"super",
"switch",
"synchronized",
"this",
"throw",
"throws",
"transient",
"true",
"try",
"typeof",
"var",
"void",
"volatile",
"while",
"with",
]
.contains(&self.as_ref())
}
fn is_reserved_only_for_es3(&self) -> bool {
[
"abstract",
"boolean",
"byte",
"char",
"double",
"enum",
"final",
"float",
"goto",
"implements",
"int",
"interface",
"long",
"native",
"package",
"private",
"protected",
"public",
"short",
"static",
"synchronized",
"throws",
"transient",
"volatile",
]
.contains(&self.as_ref())
}
}
impl IdentExt for JsWord {}
impl IdentExt for Ident {}