diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts index 28dec13d2d..3d5698c333 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts @@ -427,20 +427,20 @@ export class StaticInterpreter { const args = this.evaluateFunctionArguments(node, context); const newScope: Scope = new Map(); + const calleeContext = {...context, scope: newScope}; fn.parameters.forEach((param, index) => { let arg = args[index]; if (param.node.dotDotDotToken !== undefined) { arg = args.slice(index); } if (arg === undefined && param.initializer !== null) { - arg = this.visitExpression(param.initializer, context); + arg = this.visitExpression(param.initializer, calleeContext); } newScope.set(param.node, arg); }); - return ret.expression !== undefined ? - this.visitExpression(ret.expression, {...context, scope: newScope}) : - undefined; + return ret.expression !== undefined ? this.visitExpression(ret.expression, calleeContext) : + undefined; } private visitConditionalExpression(node: ts.ConditionalExpression, context: Context): diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts index 2c40004df5..7a48703160 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts @@ -75,6 +75,12 @@ describe('ngtsc metadata', () => { expect(evaluate(`function foo(bar) { return bar; }`, 'foo("test")')).toEqual('test'); }); + it('function call default value works', () => { + expect(evaluate(`function foo(bar = 1) { return bar; }`, 'foo()')).toEqual(1); + expect(evaluate(`function foo(bar = 1) { return bar; }`, 'foo(2)')).toEqual(2); + expect(evaluate(`function foo(a, c = a) { return c; }; const a = 1;`, 'foo(2)')).toEqual(2); + }); + it('function call spread works', () => { expect(evaluate(`function foo(a, ...b) { return [a, b]; }`, 'foo(1, ...[2, 3])')).toEqual([ 1, [2, 3]