From 8e37df6dab0d44ac8f1ea452afc70708b7851387 Mon Sep 17 00:00:00 2001 From: Mofei Zhang Date: Thu, 30 Mar 2023 15:03:09 -0400 Subject: [PATCH] [be] Hook type inference should only happen at LoadGlobal --- #1254 added inference for hooks loaded from globals. This is the only time we need to generate a type equation assigning `lval` to a resolved`Hook` type. @gsathya Would love to get your feedback here on the change. From my understanding, this change is technically incorrect, since the type equation we generate should be dependent on the `callee` type (i.e. `Hook` if callee is a hook, `Function` if callee is a function). Would the next step be to consolidate `Hook` and `Function` types? ```js type Function { ... isHook: boolean, // set by inference } type FunctionSignature { isHook: boolean, // set when adding to ShapeRegistry } ``` --- .../forget/src/TypeInference/InferTypes.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/compiler/forget/src/TypeInference/InferTypes.ts b/compiler/forget/src/TypeInference/InferTypes.ts index 242938a640..655ea68c56 100644 --- a/compiler/forget/src/TypeInference/InferTypes.ts +++ b/compiler/forget/src/TypeInference/InferTypes.ts @@ -144,17 +144,14 @@ function* generateInstructionTypes( } case "CallExpression": { - const hook = - value.callee.identifier.name !== null - ? env.getHookDeclaration(value.callee.identifier.name) - : null; - let type: Type; - if (hook !== null) { - type = { kind: "Hook", definition: hook }; - } else { - type = { kind: "Function", shapeId: null, return: left }; - } - yield equation(value.callee.identifier.type, type); + // TODO: callee could be a hook or a function, so this type equation isn't correct. + // We should change Hook to a subtype of Function or change unifier logic. + // (see https://github.com/facebook/react-forget/pull/1427) + yield equation(value.callee.identifier.type, { + kind: "Function", + shapeId: null, + return: left, + }); break; }