131 lines
3.3 KiB
Rust
131 lines
3.3 KiB
Rust
use is_macro::Is;
|
|
use swc_atoms::Atom;
|
|
use swc_common::{ast_node, util::take::Take, EqIgnoreSpan, Span, DUMMY_SP};
|
|
|
|
use crate::{module_decl::ModuleDecl, stmt::Stmt};
|
|
|
|
#[ast_node]
|
|
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
|
|
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
|
|
pub enum Program {
|
|
#[tag("Module")]
|
|
Module(Module),
|
|
#[tag("Script")]
|
|
Script(Script),
|
|
// Reserved type for the testing purpose only. Prod codes does not utilize
|
|
// this at all and user should not try to attempt to use this as well.
|
|
// TODO: reenable once experimental_metadata breaking change is merged
|
|
// #[tag("ReservedUnused")]
|
|
// ReservedUnused(ReservedUnused),
|
|
}
|
|
|
|
#[ast_node("ReservedUnused")]
|
|
#[derive(Eq, Hash, EqIgnoreSpan)]
|
|
pub struct ReservedUnused {
|
|
pub span: Span,
|
|
pub body: Option<Vec<ModuleItem>>,
|
|
}
|
|
|
|
#[cfg(feature = "arbitrary")]
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
|
|
impl<'a> arbitrary::Arbitrary<'a> for ReservedUnused {
|
|
fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
|
|
let span = u.arbitrary()?;
|
|
let body = u.arbitrary()?;
|
|
Ok(Self { span, body })
|
|
}
|
|
}
|
|
|
|
#[ast_node("Module")]
|
|
#[derive(Eq, Hash, EqIgnoreSpan)]
|
|
pub struct Module {
|
|
pub span: Span,
|
|
|
|
pub body: Vec<ModuleItem>,
|
|
|
|
#[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))]
|
|
pub shebang: Option<Atom>,
|
|
}
|
|
|
|
#[cfg(feature = "arbitrary")]
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
|
|
impl<'a> arbitrary::Arbitrary<'a> for Module {
|
|
fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
|
|
let span = u.arbitrary()?;
|
|
let body = u.arbitrary()?;
|
|
Ok(Self {
|
|
span,
|
|
body,
|
|
shebang: None,
|
|
})
|
|
}
|
|
}
|
|
|
|
impl Take for Module {
|
|
fn dummy() -> Self {
|
|
Module {
|
|
span: DUMMY_SP,
|
|
body: Take::dummy(),
|
|
shebang: Take::dummy(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[ast_node("Script")]
|
|
#[derive(Eq, Hash, EqIgnoreSpan)]
|
|
pub struct Script {
|
|
pub span: Span,
|
|
|
|
pub body: Vec<Stmt>,
|
|
|
|
#[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))]
|
|
pub shebang: Option<Atom>,
|
|
}
|
|
|
|
#[cfg(feature = "arbitrary")]
|
|
#[cfg_attr(docsrs, doc(cfg(feature = "arbitrary")))]
|
|
impl<'a> arbitrary::Arbitrary<'a> for Script {
|
|
fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
|
|
let span = u.arbitrary()?;
|
|
let body = u.arbitrary()?;
|
|
Ok(Self {
|
|
span,
|
|
body,
|
|
shebang: None,
|
|
})
|
|
}
|
|
}
|
|
|
|
impl Take for Script {
|
|
fn dummy() -> Self {
|
|
Script {
|
|
span: DUMMY_SP,
|
|
body: Take::dummy(),
|
|
shebang: Take::dummy(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[ast_node]
|
|
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
|
|
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
|
|
pub enum ModuleItem {
|
|
#[tag("ImportDeclaration")]
|
|
#[tag("ExportDeclaration")]
|
|
#[tag("ExportNamedDeclaration")]
|
|
#[tag("ExportDefaultDeclaration")]
|
|
#[tag("ExportDefaultExpression")]
|
|
#[tag("ExportAllDeclaration")]
|
|
#[tag("TsImportEqualsDeclaration")]
|
|
#[tag("TsExportAssignment")]
|
|
#[tag("TsNamespaceExportDeclaration")]
|
|
ModuleDecl(ModuleDecl),
|
|
#[tag("*")]
|
|
Stmt(Stmt),
|
|
}
|
|
|
|
impl Take for ModuleItem {
|
|
fn dummy() -> Self {
|
|
ModuleItem::Stmt(Take::dummy())
|
|
}
|
|
}
|