react/compiler/crates/react_hir
Joe Savona f33e63838d Update copyrights to reference Meta instead of Facebook
Thanks @zpao!!! This was mostly his work, i just fixed up the last bit.
2024-04-03 08:43:36 -07:00
..
src Update copyrights to reference Meta instead of Facebook 2024-04-03 08:43:36 -07:00
Cargo.toml s/Forget/React Compiler/ in Rust port 2024-04-02 16:49:31 -07:00
README.md s/Forget/React Compiler/ in Rust port 2024-04-02 16:49:31 -07:00

HIR

This crate defines the High-level Intermediate Representation (HIR) used by React Compiler.

While the name is inspired by Rust Compiler's HIR, React Compiler's HIR is actually quite different. Rust's HIR is effectively a compact AST, effectively a slightly more canonical form than the concrete syntax tree produced by the parser.

React Compiler has two goals that are in tension:

  1. React Compiler needs a detailed understanding of the control-flow semantics and performs sophisticated data-flow and semantic analysis, all of which benefit from more traditional control-flow graph representation with flat instruction sequences.
  2. At the same time, React Compiler needs to output code in the original language, and ideally should produce code that is as similar as possible (for comprehension) and compact (to avoid increasing bandwidth costs and time to download).

To satisfy both goals, React Compiler's HIR uses a hybrid of a traditional intermediate representation and an AST:

  1. The HIR is a control-flow graph, with one or more basic blocks each of which contains zero or more instructions and a terminal node. The blocks are stored in reverse postorder so that compiler passes can iterate the graph and always visit all predecessor blocks before successors, except in the presence of loops. This allows many passes to complete in a single pass and eases data flow analysis.
  2. Unlike a typical intermediate representation, the HIR uses a rich set of high-level terminal nodes. Rather than just a list of successors, for example, the terminal type is an enum of variants such as "if", "for", "for-of", "do-while", and other types to represent expression-level control flow in JavaScript, such as "ternary", "logical", "optional", "sequence", etc. Notably, these terminals contain named fields with links to successors (eg "for" has fields for the init, test, update, and body blocks) but also for the "fallthrough" block, ie the block to the code that comes "after" all the logic of the terminal. This fallthrough allows React Compiler to retain the shape of the AST and recover it later in compilation.