From 865ff7e7d829963a8c2ab99f38f12caf902b0cd7 Mon Sep 17 00:00:00 2001 From: kdletters Date: Tue, 4 Aug 2026 12:48:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A2=AB=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E6=9D=A1=E4=BB=B6=E8=B5=8B=E5=80=BC=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 保留被调用函数内条件赋值前的既有 alias 状态 新增条件副作用同时可达真实与候选接收者的回归测试 --- .../runtime_protocol/autonomous_completion.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs index 74ddebcf9..5900681f4 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/autonomous_completion.rs @@ -4591,8 +4591,12 @@ fn javascript_apply_alias_transition( return; } if transition.conditional { + let had_state = state.resolved; state.indices.extend(transition.indices); state.resolved = true; + if !had_state { + state.conditional = true; + } } else { *state = transition; } @@ -9582,6 +9586,19 @@ mod javascript_projection_reachability_tests { assert!(javascript_position_is_reachable(content, &ranges, decoy)); } + #[test] + fn conditional_assignment_inside_an_invoked_function_preserves_prior_state() { + let content = "const real = { run() { return import('./real.mjs'); } }; const decoy = { run() { return import('./decoy.mjs'); } }; let receiver = real; function maybeSwap() { if (flag) receiver = decoy; } maybeSwap(); function start() { return receiver.run(); } start();"; + let ranges = named_javascript_function_ranges(content); + for source in ["./real.mjs", "./decoy.mjs"] { + let position = content.find(source).expect("find conditional callee owner"); + assert!( + javascript_position_is_reachable(content, &ranges, position), + "a conditional callee side effect must preserve both states: {source}", + ); + } + } + #[test] fn super_owner_is_fixed_when_the_class_is_defined() { let content = "let Base = class { run() { return import('./real-base.mjs'); } }; class Game extends Base { start() { return super.run(); } } Base = class { run() { return import('./decoy-base.mjs'); } }; new Game().start();";