Port Compiler Pass
Port a compiler pass from TypeScript to Rust end-to-end.
Arguments:
- $ARGUMENTS: Pass name exactly as it appears in Pipeline.ts log entries (e.g.,
PruneMaybeThrows, SSA, ConstantPropagation)
Step 0: Validate pass name
- Read
compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts
- Search for
name: '$ARGUMENTS' in log entries
- If not found, list all available pass names from the
log({...name: '...'}) calls and stop
- Check the
kind field of the matching log entry:
- If
kind: 'ast', report that test-rust-port only supports hir and reactive kind passes currently and stop
- If
kind: 'hir' or kind: 'reactive', proceed
Step 1: Determine TS source files and Rust crate
- Follow the import in Pipeline.ts to find the actual TypeScript file(s) for the pass
- Map the TS folder to a Rust crate using this mapping:
| TypeScript Path |
Rust Crate |
src/HIR/ (excluding BuildHIR.ts, HIRBuilder.ts) |
react_compiler_hir |
src/HIR/BuildHIR.ts, src/HIR/HIRBuilder.ts |
react_compiler_lowering |
src/Babel/, src/Entrypoint/ |
react_compiler |
src/CompilerError.ts |
react_compiler_diagnostics |
src/ReactiveScopes/ |
react_compiler_reactive_scopes |
src/<Name>/ |
react_compiler_<name> (1:1, e.g., src/Optimization/ -> react_compiler_optimization) |
- Check if the pass is already ported:
- Check if the corresponding Rust file exists in the target crate
- Check if
compiler/crates/react_compiler/src/entrypoint/pipeline.rs already calls it
- If both are true, report the pass is already ported and stop
Step 2: Gather context
Read the following files (all reads happen in main context):
- Architecture guide:
compiler/docs/rust-port/rust-port-architecture.md
- Pass documentation: Check
compiler/packages/babel-plugin-react-compiler/docs/passes/ for docs about this pass
- TypeScript source: All TypeScript source files for the pass + any helpers imported from the same folder
- Rust pipeline:
compiler/crates/react_compiler/src/entrypoint/pipeline.rs
- Rust HIR types: Key type files in
compiler/crates/react_compiler_hir/src/ (especially hir.rs, environment.rs)
- Rust reactive types: For reactive passes, also read
compiler/crates/react_compiler_hir/src/reactive_function.rs
- Target crate: If the target crate already exists, read its
Cargo.toml, src/lib.rs, and existing files to understand the current structure
Step 3: Create implementation plan
Based on the gathered context, create and present a plan covering:
- New types needed: Any Rust types that need to be added or modified
- Files to create: List of new Rust files with their TS counterparts
- Crate setup: Whether a new crate is needed or adding to an existing one
- Pipeline wiring: How the pass will be called from
pipeline.rs
- Key translation decisions: Any non-obvious TS-to-Rust translations
Present the plan to the user, then proceed to implementation.
Step 4: Implementation
Launch the port-pass agent with all gathered context:
- Pass name:
$ARGUMENTS
- TypeScript source file content(s)
- Target Rust crate name and path
- Pipeline wiring details
- Implementation plan from Step 3
- Architecture guide content
- Current pipeline.rs content
- Existing crate structure (if any)
The agent will:
- Port the TypeScript code to Rust
- Create or update the crate as needed
- Wire the pass into pipeline.rs
- Run the test-fix loop until 0 failures (see agent prompt for details)
Step 5: Review loop
- Run
/compiler-review on the changes
- If issues are found:
- Launch the
port-pass agent again with:
- The review findings
- Instruction to fix the issues
- Instruction to re-run
bash compiler/scripts/test-rust-port.sh (no args, auto-detects last ported pass) to confirm 0 failures still hold
- After the agent completes, run
/compiler-review again
- Repeat until review is clean
Step 6: Final report
Report to the user:
- Files created and modified
- Test results (pass count)
- Review status
- Do NOT auto-commit (user should review and commit manually, or use
/compiler-commit)
1---2name: compiler-port3description: Port a compiler pass from TypeScript to Rust. Gathers context, plans the port, implements in a subagent with test-fix loop, then reviews.4---5
6# Port Compiler Pass
7
8Port a compiler pass from TypeScript to Rust end-to-end.
9
10Arguments:
11- $ARGUMENTS: Pass name exactly as it appears in Pipeline.ts log entries (e.g., `PruneMaybeThrows`, `SSA`, `ConstantPropagation`)
12
13## Step 0: Validate pass name
14
151. Read `compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts`
162. Search for `name: '$ARGUMENTS'` in log entries
173. If not found, list all available pass names from the `log({...name: '...'})` calls and stop
184. Check the `kind` field of the matching log entry:
19 - If `kind: 'ast'`, report that test-rust-port only supports `hir` and `reactive` kind passes currently and stop
20 - If `kind: 'hir'` or `kind: 'reactive'`, proceed
21
22## Step 1: Determine TS source files and Rust crate
23
241. Follow the import in Pipeline.ts to find the actual TypeScript file(s) for the pass
252. Map the TS folder to a Rust crate using this mapping:
26
27| TypeScript Path | Rust Crate |
28|---|---|
29| `src/HIR/` (excluding `BuildHIR.ts`, `HIRBuilder.ts`) | `react_compiler_hir` |
30| `src/HIR/BuildHIR.ts`, `src/HIR/HIRBuilder.ts` | `react_compiler_lowering` |
31| `src/Babel/`, `src/Entrypoint/` | `react_compiler` |
32| `src/CompilerError.ts` | `react_compiler_diagnostics` |
33| `src/ReactiveScopes/` | `react_compiler_reactive_scopes` |
34| `src/<Name>/` | `react_compiler_<name>` (1:1, e.g., `src/Optimization/` -> `react_compiler_optimization`) |
35
363. Check if the pass is already ported:
37 - Check if the corresponding Rust file exists in the target crate
38 - Check if `compiler/crates/react_compiler/src/entrypoint/pipeline.rs` already calls it
39 - If both are true, report the pass is already ported and stop
40
41## Step 2: Gather context
42
43Read the following files (all reads happen in main context):
44
451. **Architecture guide**: `compiler/docs/rust-port/rust-port-architecture.md`
462. **Pass documentation**: Check `compiler/packages/babel-plugin-react-compiler/docs/passes/` for docs about this pass
473. **TypeScript source**: All TypeScript source files for the pass + any helpers imported from the same folder
484. **Rust pipeline**: `compiler/crates/react_compiler/src/entrypoint/pipeline.rs`
495. **Rust HIR types**: Key type files in `compiler/crates/react_compiler_hir/src/` (especially `hir.rs`, `environment.rs`)
506. **Rust reactive types**: For reactive passes, also read `compiler/crates/react_compiler_hir/src/reactive_function.rs`
517. **Target crate**: If the target crate already exists, read its `Cargo.toml`, `src/lib.rs`, and existing files to understand the current structure
52
53## Step 3: Create implementation plan
54
55Based on the gathered context, create and present a plan covering:
56
571. **New types needed**: Any Rust types that need to be added or modified
582. **Files to create**: List of new Rust files with their TS counterparts
593. **Crate setup**: Whether a new crate is needed or adding to an existing one
604. **Pipeline wiring**: How the pass will be called from `pipeline.rs`
615. **Key translation decisions**: Any non-obvious TS-to-Rust translations
62
63Present the plan to the user, then proceed to implementation.
64
65## Step 4: Implementation
66
67Launch the `port-pass` agent with all gathered context:
68
69- Pass name: `$ARGUMENTS`
70- TypeScript source file content(s)
71- Target Rust crate name and path
72- Pipeline wiring details
73- Implementation plan from Step 3
74- Architecture guide content
75- Current pipeline.rs content
76- Existing crate structure (if any)
77
78The agent will:
791. Port the TypeScript code to Rust
802. Create or update the crate as needed
813. Wire the pass into pipeline.rs
824. Run the test-fix loop until 0 failures (see agent prompt for details)
83
84## Step 5: Review loop
85
861. Run `/compiler-review` on the changes
872. If issues are found:
88 - Launch the `port-pass` agent again with:
89 - The review findings
90 - Instruction to fix the issues
91 - Instruction to re-run `bash compiler/scripts/test-rust-port.sh` (no args, auto-detects last ported pass) to confirm 0 failures still hold
92 - After the agent completes, run `/compiler-review` again
933. Repeat until review is clean
94
95## Step 6: Final report
96
97Report to the user:
98- Files created and modified
99- Test results (pass count)
100- Review status
101- Do NOT auto-commit (user should review and commit manually, or use `/compiler-commit`)