[compiler] Bail out with Todo on using and await using declarations (#36946)
## Summary The compiler silently rewrote functions containing `using` and `await using` declarations (explicit resource management). BuildHIR's `VariableDeclaration` case only special-cases `var`; every other kind falls through to `InstructionKind.Const`. A `using` declaration therefore compiled as a plain memoized `const`, and the implicit dispose call at scope exit was dropped from the compiled output. No diagnostic was emitted. The Rust port mirrored the same bug in `build_hir.rs`. The Rust port had a second, harder failure: its `VariableDeclarationKind` enum had no `await using` variant, so a Babel AST containing one failed serde deserialization at the NAPI boundary ("unknown variant `await using`") and threw for the whole file. The fix records the same per-function Todo bail as the existing `var` case, in both implementations, then continues lowering the declaration as `const` so references do not break while the error unwinds (mirroring how `var` continues as `let`). This matches the compiler's established Todo-bail precedent for unsupported syntax: the function is skipped with a logged `CompileError` diagnostic, `panicThreshold` is respected, and sibling functions in the same file still compile. This deliberately contrasts with oxc-project/oxc#24217, which handles the same syntax with a silent per-function skip; nothing in this compiler is skipped without a surfaced diagnostic. Changes: - TS: `BuildHIR.ts` records a Todo `CompilerErrorDetail` for `using` and `await using` kinds, in the style of the existing `var` case. - Rust: same Todo `record_error` in `build_hir.rs`. New `AwaitUsing` variant (serde name `"await using"`) in `react_compiler_ast`, so `await using` survives the NAPI boundary, covered by a serde round-trip unit test. - Test harness: enables the `explicitResourceManagement` parser plugin in snap and in the e2e script's Babel baseline so fixtures can use the syntax. Fixtures (identical snapshots for the TS and Rust pipelines): - `error.todo-using-declaration` and `error.todo-await-using-declaration` show the Todo diagnostic with code frames. - `using-declaration-bailout-sibling-compiles` shows the bailing function left untouched (disposal preserved) while a sibling component in the same file is memoized. The first commit snapshots the previous broken behavior (`using` memoized as `const` with disposal dropped); the second commit lands the fix and updates the snapshots. ## How did you test this change? All results below are from the branch rebased onto current main. TS implementation: - `yarn snap`: 1809 tests, 1809 passed, 0 failed. - `yarn workspace babel-plugin-react-compiler lint`: clean. `yarn prettier-check` at the repo root: clean. - Manually verified pre-fix output: a component with `using resource = getResource(props.id)` compiled to a memoized `const` with no disposal. Rust implementation: - `cargo test --workspace`: 42 passed, 0 failed (includes the new serde round-trip unit test for both `using` kinds). - `bash scripts/test-babel-ast.sh`: passed. - `bash scripts/test-rust-port.sh`: 1808 passed, 0 failed. - `yarn snap --rust`: 1809 tests, 1809 passed, 0 failed, against the same `.expect.md` snapshots as the TS run. - `scripts/test-e2e.ts` (babel variant): the three using fixtures pass code and events parity. - Manually verified `await using` now deserializes across the NAPI boundary and records the Todo instead of throwing. <div><a href="https://cursor.com/agents/bc-5fe4350d-5d42-4c0e-9001-429ed0b5e5b7"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a> <a href="https://cursor.com/background-agent?bcId=bc-5fe4350d-5d42-4c0e-9001-429ed0b5e5b7"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a> </div> --------- Co-authored-by: Cursor Agent <cursoragent@cursor.com>