mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
53 lines
1.1 KiB
TypeScript
53 lines
1.1 KiB
TypeScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
import {HIRFunction, isPropsType} from '../HIR';
|
|
|
|
/**
|
|
* Converts method calls into regular calls where the receiver is the props object:
|
|
*
|
|
* Example:
|
|
*
|
|
* ```
|
|
* // INPUT
|
|
* props.foo();
|
|
*
|
|
* // OUTPUT
|
|
* const t0 = props.foo;
|
|
* t0();
|
|
* ```
|
|
*
|
|
* Counter example:
|
|
*
|
|
* Here the receiver is `props.foo`, not the props object, so we don't rewrite it:
|
|
*
|
|
* // INPUT
|
|
* props.foo.bar();
|
|
*
|
|
* // OUTPUT
|
|
* props.foo.bar();
|
|
* ```
|
|
*/
|
|
export function optimizePropsMethodCalls(fn: HIRFunction): void {
|
|
for (const [, block] of fn.body.blocks) {
|
|
for (let i = 0; i < block.instructions.length; i++) {
|
|
const instr = block.instructions[i]!;
|
|
if (
|
|
instr.value.kind === 'MethodCall' &&
|
|
isPropsType(instr.value.receiver.identifier)
|
|
) {
|
|
instr.value = {
|
|
kind: 'CallExpression',
|
|
callee: instr.value.property,
|
|
args: instr.value.args,
|
|
loc: instr.value.loc,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|