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>, } #[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 { 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, #[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))] pub shebang: Option, } #[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 { 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, #[cfg_attr(feature = "serde-impl", serde(default, rename = "interpreter"))] pub shebang: Option, } #[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 { 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()) } }