compiler-port

Par facebook · react

Portage d'un pass de compilateur de TypeScript vers Rust. Collecte le contexte, planifie le portage, l'implémente dans un sous-agent avec une boucle test-correction, puis effectue une revue.

npx skills add https://github.com/facebook/react --skill compiler-port

Port Compiler Pass

Porter un compiler pass de TypeScript à Rust end-to-end.

Arguments :

  • $ARGUMENTS : Nom du pass exactement comme il apparaît dans les logs de Pipeline.ts (ex. PruneMaybeThrows, SSA, ConstantPropagation)

Step 0: Valider le nom du pass

  1. Lire compiler/packages/babel-plugin-react-compiler/src/Entrypoint/Pipeline.ts
  2. Chercher name: '$ARGUMENTS' dans les logs
  3. Si non trouvé, lister tous les noms de pass disponibles depuis les appels log({...name: '...'}) et s'arrêter
  4. Vérifier le champ kind de l'entrée log correspondante :
    • Si kind: 'ast', signaler que test-rust-port supporte uniquement les passes de type hir et reactive pour l'instant et s'arrêter
    • Si kind: 'hir' ou kind: 'reactive', procéder

Step 1: Déterminer les fichiers sources TS et la crate Rust

  1. Suivre l'import dans Pipeline.ts pour trouver le(s) fichier(s) TypeScript du pass
  2. Mapper le dossier TS à une crate Rust en utilisant ce tableau :
Chemin TypeScript Crate Rust
src/HIR/ (excluant 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, ex. src/Optimization/ -> react_compiler_optimization)
  1. Vérifier si le pass est déjà porté :
    • Vérifier que le fichier Rust correspondant existe dans la crate cible
    • Vérifier que compiler/crates/react_compiler/src/entrypoint/pipeline.rs l'appelle déjà
    • Si les deux sont vrais, signaler que le pass est déjà porté et s'arrêter

Step 2: Rassembler le contexte

Lire les fichiers suivants (toutes les lectures se font dans le contexte principal) :

  1. Guide d'architecture : compiler/docs/rust-port/rust-port-architecture.md
  2. Documentation du pass : Vérifier compiler/packages/babel-plugin-react-compiler/docs/passes/ pour la documentation sur ce pass
  3. Source TypeScript : Tous les fichiers sources TypeScript du pass + tout helper importé depuis le même dossier
  4. Pipeline Rust : compiler/crates/react_compiler/src/entrypoint/pipeline.rs
  5. Types HIR Rust : Fichiers de types clés dans compiler/crates/react_compiler_hir/src/ (notamment hir.rs, environment.rs)
  6. Types reactive Rust : Pour les passes reactive, lire aussi compiler/crates/react_compiler_hir/src/reactive_function.rs
  7. Crate cible : Si la crate cible existe déjà, lire son Cargo.toml, src/lib.rs, et les fichiers existants pour comprendre la structure courante

Step 3: Créer un plan d'implémentation

En fonction du contexte rassemblé, créer et présenter un plan couvrant :

  1. Nouveaux types nécessaires : Tous les types Rust qui doivent être ajoutés ou modifiés
  2. Fichiers à créer : Liste des nouveaux fichiers Rust avec leurs homologues TS
  3. Configuration de la crate : Faut-il une nouvelle crate ou ajouter à une existante
  4. Câblage du pipeline : Comment le pass sera appelé depuis pipeline.rs
  5. Décisions de traduction clés : Toute traduction TS-to-Rust non évidente

Présenter le plan à l'utilisateur, puis procéder à l'implémentation.

Step 4: Implémentation

Lancer l'agent port-pass avec tout le contexte rassemblé :

  • Nom du pass : $ARGUMENTS
  • Contenu du(des) fichier(s) source TypeScript
  • Nom et chemin de la crate Rust cible
  • Détails du câblage du pipeline
  • Plan d'implémentation de Step 3
  • Contenu du guide d'architecture
  • Contenu courant de pipeline.rs
  • Structure de crate existante (si applicable)

L'agent va :

  1. Porter le code TypeScript à Rust
  2. Créer ou mettre à jour la crate selon les besoins
  3. Câbler le pass dans pipeline.rs
  4. Exécuter la boucle test-fix jusqu'à 0 échecs (voir le prompt de l'agent pour les détails)

Step 5: Boucle de révision

  1. Exécuter /compiler-review sur les changements
  2. Si des problèmes sont trouvés :
    • Lancer l'agent port-pass à nouveau avec :
      • Les résultats de la révision
      • Instruction de corriger les problèmes
      • Instruction de re-exécuter bash compiler/scripts/test-rust-port.sh (sans arguments, auto-détecte le dernier pass porté) pour confirmer que 0 échecs sont maintenus
    • Après que l'agent finisse, exécuter /compiler-review à nouveau
  3. Répéter jusqu'à révision clean

Step 6: Rapport final

Signaler à l'utilisateur :

  • Fichiers créés et modifiés
  • Résultats des tests (nombre de passes)
  • Statut de la révision
  • NE PAS auto-commiter (l'utilisateur doit réviser et commiter manuellement, ou utiliser /compiler-commit)

Skills similaires