@@ -115,7 +115,14 @@ pub fn analyze_root_dependencies(
115115
116116 // First pass: collect ALL root declarations from the module body
117117 for item in & module. body {
118- if let ast:: ModuleItem :: Stmt ( ast:: Stmt :: Decl ( decl) ) = item {
118+ let decl = match item {
119+ ast:: ModuleItem :: Stmt ( ast:: Stmt :: Decl ( decl) ) => Some ( decl) ,
120+ ast:: ModuleItem :: ModuleDecl ( ast:: ModuleDecl :: ExportDecl ( export_decl) ) => {
121+ Some ( & export_decl. decl )
122+ }
123+ _ => None ,
124+ } ;
125+ if let Some ( decl) = decl {
119126 match decl {
120127 ast:: Decl :: Var ( var_decl) => {
121128 for decl in & var_decl. decls {
@@ -213,7 +220,14 @@ pub fn analyze_root_dependencies(
213220
214221 // Second pass: extract variable declarations and analyze dependencies
215222 for item in & module. body {
216- if let ast:: ModuleItem :: Stmt ( ast:: Stmt :: Decl ( decl) ) = item {
223+ let decl = match item {
224+ ast:: ModuleItem :: Stmt ( ast:: Stmt :: Decl ( decl) ) => Some ( decl) ,
225+ ast:: ModuleItem :: ModuleDecl ( ast:: ModuleDecl :: ExportDecl ( export_decl) ) => {
226+ Some ( & export_decl. decl )
227+ }
228+ _ => None ,
229+ } ;
230+ if let Some ( decl) = decl {
217231 match decl {
218232 ast:: Decl :: Var ( var_decl) => {
219233 for decl in & var_decl. decls {
@@ -601,3 +615,55 @@ fn collect_decl_idents_from_decl(decl: &ast::Decl, idents: &mut Vec<Id>) {
601615 _ => { }
602616 }
603617}
618+
619+ #[ cfg( test) ]
620+ mod tests {
621+ use super :: * ;
622+ use crate :: collector:: global_collect;
623+ use swc_atoms:: atom;
624+ use swc_common:: { SyntaxContext , DUMMY_SP } ;
625+
626+ #[ test]
627+ fn analyze_root_dependencies_tracks_export_decl_var_kind ( ) {
628+ let id = ast:: Ident :: new ( atom ! ( "counter" ) , DUMMY_SP , SyntaxContext :: empty ( ) ) ;
629+ let module = ast:: Module {
630+ span : DUMMY_SP ,
631+ shebang : None ,
632+ body : vec ! [ ast:: ModuleItem :: ModuleDecl ( ast:: ModuleDecl :: ExportDecl (
633+ ast:: ExportDecl {
634+ span: DUMMY_SP ,
635+ decl: ast:: Decl :: Var ( Box :: new( ast:: VarDecl {
636+ span: DUMMY_SP ,
637+ ctxt: SyntaxContext :: empty( ) ,
638+ kind: ast:: VarDeclKind :: Let ,
639+ declare: false ,
640+ decls: vec![ ast:: VarDeclarator {
641+ span: DUMMY_SP ,
642+ name: ast:: Pat :: Ident ( ast:: BindingIdent { id, type_ann: None } ) ,
643+ init: Some ( Box :: new( ast:: Expr :: Lit ( ast:: Lit :: Num ( ast:: Number {
644+ span: DUMMY_SP ,
645+ value: 0.0 ,
646+ raw: None ,
647+ } ) ) ) ) ,
648+ definite: false ,
649+ } ] ,
650+ } ) ) ,
651+ } ,
652+ ) ) ] ,
653+ } ;
654+
655+ let collect = global_collect ( & ast:: Program :: Module ( module. clone ( ) ) ) ;
656+ let deps = analyze_root_dependencies ( & module, & collect) ;
657+ let dep = deps
658+ . get ( & ( atom ! ( "counter" ) , SyntaxContext :: empty ( ) ) )
659+ . expect ( "counter dependency should exist" ) ;
660+
661+ assert_eq ! ( dep. var_kind, Some ( ast:: VarDeclKind :: Let ) ) ;
662+ match & dep. decl {
663+ RootVarDecl :: Var ( decl) => {
664+ assert ! ( decl. init. is_some( ) ) ;
665+ }
666+ _ => panic ! ( "expected var declarator" ) ,
667+ }
668+ }
669+ }
0 commit comments