From d47098b0694c0571eb1541474dfae67159e382bd Mon Sep 17 00:00:00 2001 From: Niklas Mischkulnig <4586894+mischnic@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:51:29 +0100 Subject: [PATCH] Add back `add_effects` --- .../src/analyzer/linker.rs | 1 + .../src/references/mod.rs | 185 +++++++++--------- 2 files changed, 96 insertions(+), 90 deletions(-) diff --git a/turbopack/crates/turbopack-ecmascript/src/analyzer/linker.rs b/turbopack/crates/turbopack-ecmascript/src/analyzer/linker.rs index 91efb338eb23c..e89cb12290543 100644 --- a/turbopack/crates/turbopack-ecmascript/src/analyzer/linker.rs +++ b/turbopack/crates/turbopack-ecmascript/src/analyzer/linker.rs @@ -111,6 +111,7 @@ where // Enter a variable // - replace it with value from graph // - process value + // - (Step::LeaveVar potentially caches the value) Step::Enter(JsValue::Variable(var)) => { if cycle_stack.contains(&var) { done.push(JsValue::unknown( diff --git a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs index d80b1e9245efe..39490200759dd 100644 --- a/turbopack/crates/turbopack-ecmascript/src/references/mod.rs +++ b/turbopack/crates/turbopack-ecmascript/src/references/mod.rs @@ -1155,20 +1155,19 @@ pub(crate) async fn analyse_ecmascript_module_internal( .link_value(*func, eval_context.imports.get_attributes(span)) .await?; - add_effects( - handle_call( - &ast_path, - span, - func, - JsValue::unknown_empty(false, "no this provided"), - args, - &analysis_state, - &mut analysis, - in_try, - new, - ) - .await?, - ); + handle_call( + &ast_path, + span, + func, + JsValue::unknown_empty(false, "no this provided"), + args, + &analysis_state, + &add_effects, + &mut analysis, + in_try, + new, + ) + .await?; } Effect::MemberCall { obj, @@ -1233,20 +1232,19 @@ pub(crate) async fn analyse_ecmascript_module_internal( ) .await?; - add_effects( - handle_call( - &ast_path, - span, - func, - obj, - args, - &analysis_state, - &mut analysis, - in_try, - new, - ) - .await?, - ); + handle_call( + &ast_path, + span, + func, + obj, + args, + &analysis_state, + &add_effects, + &mut analysis, + in_try, + new, + ) + .await?; } Effect::FreeVar { var, @@ -1420,17 +1418,18 @@ async fn compile_time_info_for_module_type( .cell()) } -async fn handle_call( +async fn handle_call) + Send + Sync>( ast_path: &[AstParentKind], span: Span, func: JsValue, this: JsValue, args: Vec, state: &AnalysisState<'_>, + add_effects: &G, analysis: &mut AnalyzeEcmascriptModuleResultBuilder, in_try: bool, new: bool, -) -> Result> { +) -> Result<()> { let &AnalysisState { handler, origin, @@ -1443,19 +1442,26 @@ async fn handle_call( fn explain_args(args: &[JsValue]) -> (String, String) { JsValue::explain_args(args, 10, 2) } - let mut effects = vec![]; - let mut linked_args = |args: Vec| { + let linked_args = |args: Vec| async move { args.into_iter() - .map(|arg| match arg { - EffectArg::Value(value) => value, - EffectArg::Closure(value, block) => { - effects.extend(block.effects); - value + .map(|arg| { + let add_effects = &add_effects; + async move { + let value = match arg { + EffectArg::Value(value) => value, + EffectArg::Closure(value, block) => { + add_effects(block.effects); + value + } + EffectArg::Spread => { + JsValue::unknown_empty(true, "spread is not supported yet") + } + }; + state.link_value(value, ImportAttributes::empty_ref()).await } - EffectArg::Spread => JsValue::unknown_empty(true, "spread is not supported yet"), }) - .map(|value| state.link_value(value, ImportAttributes::empty_ref())) .try_join() + .await }; if new { @@ -1481,7 +1487,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1501,7 +1507,7 @@ async fn handle_call( ); } } - return Ok(effects); + return Ok(()); } JsValue::WellKnownFunction(WellKnownFunctionKind::WorkerConstructor) => { let args = linked_args(args).await?; @@ -1517,7 +1523,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } @@ -1535,7 +1541,7 @@ async fn handle_call( ); } - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1545,17 +1551,17 @@ async fn handle_call( errors::failed_to_analyse::ecmascript::DYNAMIC_IMPORT.to_string(), ), ); - return Ok(effects); + return Ok(()); } _ => {} } for arg in args { if let EffectArg::Closure(_, block) = arg { - effects.extend(block.effects); + add_effects(block.effects); } } - return Ok(effects); + return Ok(()); } match func { @@ -1565,20 +1571,19 @@ async fn handle_call( logical_property: _, } => { for alt in values { - effects.extend( - Box::pin(handle_call( - ast_path, - span, - alt, - this.clone(), - args.clone(), - state, - analysis, - in_try, - new, - )) - .await?, - ); + Box::pin(handle_call( + ast_path, + span, + alt, + this.clone(), + args.clone(), + state, + add_effects, + analysis, + in_try, + new, + )) + .await?; } } JsValue::WellKnownFunction(WellKnownFunctionKind::Import) => { @@ -1620,7 +1625,7 @@ async fn handle_call( analysis.add_code_gen(DynamicExpression::new_promise(Vc::cell( ast_path.to_vec(), ))); - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1636,7 +1641,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1662,7 +1667,7 @@ async fn handle_call( ); if ignore_dynamic_requests { analysis.add_code_gen(DynamicExpression::new(Vc::cell(ast_path.to_vec()))); - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1676,7 +1681,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1716,7 +1721,7 @@ async fn handle_call( ); if ignore_dynamic_requests { analysis.add_code_gen(DynamicExpression::new(Vc::cell(ast_path.to_vec()))); - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1730,7 +1735,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1758,7 +1763,7 @@ async fn handle_call( errors::failed_to_analyse::ecmascript::REQUIRE_CONTEXT.to_string(), ), ); - return Ok(effects); + return Ok(()); } }; @@ -1792,7 +1797,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1800,7 +1805,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1839,7 +1844,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1847,14 +1852,14 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } JsValue::WellKnownFunction(WellKnownFunctionKind::PathJoin) => { let context_path = source.ident().path().await?; // ignore path.join in `node-gyp`, it will includes too many files if context_path.path.contains("node_modules/node-gyp") { - return Ok(effects); + return Ok(()); } let args = linked_args(args).await?; let linked_func_call = state @@ -1877,7 +1882,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1885,14 +1890,14 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } JsValue::WellKnownFunction(WellKnownFunctionKind::ChildProcessSpawnMethod(name)) => { let args = linked_args(args).await?; // Is this specifically `spawn(process.argv[0], ['-e', ...])`? if is_invoking_node_process_eval(&args) { - return Ok(effects); + return Ok(()); } if !args.is_empty() { @@ -1943,7 +1948,7 @@ async fn handle_call( ), ); } - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -1969,7 +1974,7 @@ async fn handle_call( ), ); if ignore_dynamic_requests { - return Ok(effects); + return Ok(()); } } analysis.add_reference( @@ -1982,7 +1987,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -2010,7 +2015,7 @@ async fn handle_call( ), ); // Always ignore this dynamic request - return Ok(effects); + return Ok(()); } analysis.add_reference( NodePreGypConfigReference::new( @@ -2021,7 +2026,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -2057,7 +2062,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } } let (args, hints) = explain_args(&args); @@ -2085,7 +2090,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } } let (args, hints) = explain_args(&args); @@ -2113,7 +2118,7 @@ async fn handle_call( ), ); // Always ignore this dynamic request - return Ok(effects); + return Ok(()); } match s { "views" => { @@ -2142,7 +2147,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } } "view engine" => { @@ -2160,7 +2165,7 @@ async fn handle_call( .await?, ); } - return Ok(effects); + return Ok(()); } } _ => {} @@ -2204,7 +2209,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -2231,7 +2236,7 @@ async fn handle_call( .to_resolved() .await?, ); - return Ok(effects); + return Ok(()); } let (args, hints) = explain_args(&args); handler.span_warn_with_code( @@ -2272,7 +2277,7 @@ async fn handle_call( analysis.add_reference(resolved_dir_ref); } - return Ok(effects); + return Ok(()); } } let (args, hints) = explain_args(&args); @@ -2290,12 +2295,12 @@ async fn handle_call( _ => { for arg in args { if let EffectArg::Closure(_, block) = arg { - effects.extend(block.effects); + add_effects(block.effects); } } } } - Ok(effects) + Ok(()) } async fn handle_member(