Skip to content

Commit 8b9b0c6

Browse files
authored
fix(optimizer): handle export decl vars in dependency analysis
Agent-Logs-Url: https://github.com/QwikDev/qwik/sessions/66665228-6f90-4a00-b240-feacaf5b1296
1 parent f1a986b commit 8b9b0c6

1 file changed

Lines changed: 68 additions & 2 deletions

File tree

packages/optimizer/core/src/dependency_analysis.rs

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)