Skip to content

Commit adbc32d

Browse files
authored
[compiler] More fbt compatibility (#34887)
In my previous PR I fixed some cases but broke others. So, new approach. Two phase algorithm: * First pass is forward data flow to determine all usages of macros. This is necessary because many of Meta's macros have variants that can be accessed via properties, eg you can do `macro(...)` but also `macro.variant(...)`. * Second pass is backwards data flow to find macro invocations (JSX and calls) and then merge their operands into the same scope as the macro call. Note that this required updating PromoteUsedTemporaries to avoid promoting macro calls that have interposing instructions between their creation and usage. Macro calls in general are pure so it should be safe to reorder them. In addition, we're now more precise about `<fb:plural>`, `<fbt:param>`, `fbt.plural()` and `fbt.param()`, which don't actually require all their arguments to be inlined. The whole point is that the plural/param value is an arbitrary value (along with a string name). So we no longer transitively inline the arguments, we just make sure that they don't get inadvertently promoted to named variables. One caveat: we actually don't do anything to treat macro functions as non-mutating, so `fbt.plural()` and friends (function form) may still sometimes group arguments just due to mutability inference. In a follow-up, i'll work to infer the types of nested macro functions as non-mutating. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/34887). * #34900 * __->__ #34887
1 parent 1324e1b commit adbc32d

16 files changed

+640
-294
lines changed

compiler/packages/babel-plugin-react-compiler/src/HIR/Environment.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,11 @@ export type ExternalFunction = z.infer<typeof ExternalFunctionSchema>;
8383
export const USE_FIRE_FUNCTION_NAME = 'useFire';
8484
export const EMIT_FREEZE_GLOBAL_GATING = '__DEV__';
8585

86-
export const MacroMethodSchema = z.union([
87-
z.object({type: z.literal('wildcard')}),
88-
z.object({type: z.literal('name'), name: z.string()}),
89-
]);
90-
91-
// Would like to change this to drop the string option, but breaks compatibility with existing configs
92-
export const MacroSchema = z.union([
93-
z.string(),
94-
z.tuple([z.string(), z.array(MacroMethodSchema)]),
95-
]);
86+
export const MacroSchema = z.string();
9687

9788
export type CompilerMode = 'all_features' | 'no_inferred_memo';
9889

9990
export type Macro = z.infer<typeof MacroSchema>;
100-
export type MacroMethod = z.infer<typeof MacroMethodSchema>;
10191

10292
const HookSchema = z.object({
10393
/*

0 commit comments

Comments
 (0)