Skip to content

Commit e06557c

Browse files
HerrCai0907MaxGraeydcodeIO
authored
Enhance FunctionExpression type inference (#2458)
Co-authored-by: Max Graey <[email protected]> Co-authored-by: dcode <[email protected]>
1 parent b176649 commit e06557c

File tree

4 files changed

+2690
-2442
lines changed

4 files changed

+2690
-2442
lines changed

src/resolver.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,9 +2683,19 @@ export class Resolver extends DiagnosticEmitter {
26832683
) {
26842684
// (x) => ret, infer return type accordingt to `ret`
26852685
const expr = (<ExpressionStatement>body).expression;
2686-
const type = this.resolveExpression(expr, ctxFlow, ctxType, reportMode);
2686+
let signatureReference = assert(functionType.getSignature());
2687+
// create a temp flow to resolve expression
2688+
let tempFlow = Flow.createParent(ctxFlow.actualFunction);
2689+
let parameters = signature.parameters;
2690+
// return type of resolveFunctionType should have same parameter length with signature
2691+
assert(signatureReference.parameterTypes.length == parameters.length);
2692+
for (let i = 0, k = parameters.length; i < k; i++) {
2693+
const parameter = parameters[i];
2694+
const type = signatureReference.parameterTypes[i];
2695+
tempFlow.addScopedDummyLocal(parameter.name.text, type, parameter);
2696+
}
2697+
const type = this.resolveExpression(expr, tempFlow, ctxType, reportMode);
26872698
if (type) {
2688-
let signatureReference = assert(functionType.getSignature());
26892699
signatureReference.returnType = type;
26902700
}
26912701
}

0 commit comments

Comments
 (0)