24
pruneUnusedLabelsHIR,
25
} from '../HIR';
26
import {
27
+ CompilerMode,
28
Environment,
29
EnvironmentConfig,
30
ReactFunctionType,
101
import {optimizePropsMethodCalls} from '../Optimization/OptimizePropsMethodCalls';
102
import {transformFire} from '../Transform';
103
import {validateNoImpureFunctionsInRender} from '../Validation/ValiateNoImpureFunctionsInRender';
104
+import {CompilerError} from '..';
105
106
export type CompilerPipelineValue =
107
| {kind: 'ast'; name: string; value: CodegenFunction}
115
>,
116
config: EnvironmentConfig,
117
fnType: ReactFunctionType,
118
+ mode: CompilerMode,
119
useMemoCacheIdentifier: string,
120
logger: Logger | null,
121
filename: string | null,
125
const env = new Environment(
126
func.scope,
127
fnType,
128
+ mode,
129
config,
130
contextIdentifiers,
131
logger,
164
validateUseMemo(hir);
165
166
if (
167
+ env.isInferredMemoEnabled &&
168
!env.config.enablePreserveExistingManualUseMemo &&
169
!env.config.disableMemoizationForDebugging &&
165
- !env.config.enableChangeDetectionForDebugging &&
166
- !env.config.enableMinimalTransformsForRetry
170
+ !env.config.enableChangeDetectionForDebugging
171
) {
172
dropManualMemoization(hir);
173
log({kind: 'hir', name: 'DropManualMemoization', value: hir});
200
inferTypes(hir);
201
log({kind: 'hir', name: 'InferTypes', value: hir});
202
199
- if (env.config.validateHooksUsage) {
200
- validateHooksUsage(hir);
203
+ if (env.isInferredMemoEnabled) {
204
+ if (env.config.validateHooksUsage) {
205
+ validateHooksUsage(hir);
206
+ }
207
+ if (env.config.validateNoCapitalizedCalls) {
208
+ validateNoCapitalizedCalls(hir);
209
+ }
210
}
211
212
if (env.config.enableFire) {
214
log({kind: 'hir', name: 'TransformFire', value: hir});
215
}
216
208
- if (env.config.validateNoCapitalizedCalls) {
209
- validateNoCapitalizedCalls(hir);
210
- }
211
-
217
if (env.config.lowerContextAccess) {
218
lowerContextAccess(hir, env.config.lowerContextAccess);
219
}
224
analyseFunctions(hir);
225
log({kind: 'hir', name: 'AnalyseFunctions', value: hir});
226
222
- inferReferenceEffects(hir);
227
+ const fnEffectErrors = inferReferenceEffects(hir);
228
+ if (env.isInferredMemoEnabled) {
229
+ if (fnEffectErrors.length > 0) {
230
+ CompilerError.throw(fnEffectErrors[0]);
231
+ }
232
+ }
233
log({kind: 'hir', name: 'InferReferenceEffects', value: hir});
234
235
validateLocalsNotReassignedAfterRender(hir);
249
inferMutableRanges(hir);
250
log({kind: 'hir', name: 'InferMutableRanges', value: hir});
251
242
- if (env.config.assertValidMutableRanges) {
243
- assertValidMutableRanges(hir);
244
- }
252
+ if (env.isInferredMemoEnabled) {
253
+ if (env.config.assertValidMutableRanges) {
254
+ assertValidMutableRanges(hir);
255
+ }
256
246
- if (env.config.validateRefAccessDuringRender) {
247
- validateNoRefAccessInRender(hir);
248
- }
257
+ if (env.config.validateRefAccessDuringRender) {
258
+ validateNoRefAccessInRender(hir);
259
+ }
260
250
- if (env.config.validateNoSetStateInRender) {
251
- validateNoSetStateInRender(hir);
252
- }
261
+ if (env.config.validateNoSetStateInRender) {
262
+ validateNoSetStateInRender(hir);
263
+ }
264
254
- if (env.config.validateNoSetStateInPassiveEffects) {
255
- validateNoSetStateInPassiveEffects(hir);
256
- }
265
+ if (env.config.validateNoSetStateInPassiveEffects) {
266
+ validateNoSetStateInPassiveEffects(hir);
267
+ }
268
258
- if (env.config.validateNoJSXInTryStatements) {
259
- validateNoJSXInTryStatement(hir);
260
- }
269
+ if (env.config.validateNoJSXInTryStatements) {
270
+ validateNoJSXInTryStatement(hir);
271
+ }
272
262
- if (env.config.validateNoImpureFunctionsInRender) {
263
- validateNoImpureFunctionsInRender(hir);
273
+ if (env.config.validateNoImpureFunctionsInRender) {
274
+ validateNoImpureFunctionsInRender(hir);
275
+ }
276
}
277
278
inferReactivePlaces(hir);
292
value: hir,
293
});
294
283
- if (!env.config.enableMinimalTransformsForRetry) {
295
+ if (env.isInferredMemoEnabled) {
296
+ /**
297
+ * Only create reactive scopes (which directly map to generated memo blocks)
298
+ * if inferred memoization is enabled. This makes all later passes which
299
+ * transform reactive-scope labeled instructions no-ops.
300
+ */
301
inferReactiveScopeVariables(hir);
302
log({kind: 'hir', name: 'InferReactiveScopeVariables', value: hir});
303
}
546
>,
547
config: EnvironmentConfig,
548
fnType: ReactFunctionType,
549
+ mode: CompilerMode,
550
useMemoCacheIdentifier: string,
551
logger: Logger | null,
552
filename: string | null,
556
func,
557
config,
558
fnType,
559
+ mode,
560
useMemoCacheIdentifier,
561
logger,
562
filename,