fix(ngcc): handle new __spreadArrays
tslib helper (#33617)
We already have special cases for the `__spread` helper function and with this change we handle the new tslib helper introduced in version 1.10 `__spreadArrays`. For more context see: https://github.com/microsoft/tslib/releases/tag/1.10.0 Fixes: #33614 PR Close #33617
This commit is contained in:
@ -15,10 +15,12 @@ import {ResolvedValue, ResolvedValueArray} from './result';
|
||||
|
||||
export function evaluateTsHelperInline(
|
||||
helper: TsHelperFn, node: ts.Node, args: ResolvedValueArray): ResolvedValue {
|
||||
if (helper === TsHelperFn.Spread) {
|
||||
return evaluateTsSpreadHelper(node, args);
|
||||
} else {
|
||||
throw new Error(`Cannot evaluate unknown helper ${helper} inline`);
|
||||
switch (helper) {
|
||||
case TsHelperFn.Spread:
|
||||
case TsHelperFn.SpreadArrays:
|
||||
return evaluateTsSpreadHelper(node, args);
|
||||
default:
|
||||
throw new Error(`Cannot evaluate unknown helper ${helper} inline`);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -514,7 +514,28 @@ runInEachFileSystem(() => {
|
||||
{
|
||||
name: _('/node_modules/tslib/index.d.ts'),
|
||||
contents: `
|
||||
export declare function __spread(...args: any[]): any[];
|
||||
export declare function __spread(...args: any[][]): any[];
|
||||
`
|
||||
},
|
||||
]);
|
||||
const reflectionHost = new TsLibAwareReflectionHost(checker);
|
||||
const evaluator = new PartialEvaluator(reflectionHost, checker);
|
||||
const value = evaluator.evaluate(expression);
|
||||
expect(value).toEqual([1, 2, 3]);
|
||||
});
|
||||
|
||||
it('should evaluate TypeScript __spreadArrays helper', () => {
|
||||
const {checker, expression} = makeExpression(
|
||||
`
|
||||
import * as tslib from 'tslib';
|
||||
const a = [1];
|
||||
const b = [2, 3];
|
||||
`,
|
||||
'tslib.__spreadArrays(a, b)', [
|
||||
{
|
||||
name: _('/node_modules/tslib/index.d.ts'),
|
||||
contents: `
|
||||
export declare function __spreadArrays(...args: any[][]): any[];
|
||||
`
|
||||
},
|
||||
]);
|
||||
@ -612,10 +633,13 @@ runInEachFileSystem(() => {
|
||||
function getTsHelperFn(node: ts.FunctionDeclaration): TsHelperFn|null {
|
||||
const name = node.name !== undefined && ts.isIdentifier(node.name) && node.name.text;
|
||||
|
||||
if (name === '__spread') {
|
||||
return TsHelperFn.Spread;
|
||||
} else {
|
||||
return null;
|
||||
switch (name) {
|
||||
case '__spread':
|
||||
return TsHelperFn.Spread;
|
||||
case '__spreadArrays':
|
||||
return TsHelperFn.SpreadArrays;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -336,6 +336,10 @@ export enum TsHelperFn {
|
||||
* Indicates the `__spread` function.
|
||||
*/
|
||||
Spread,
|
||||
/**
|
||||
* Indicates the `__spreadArrays` function.
|
||||
*/
|
||||
SpreadArrays,
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user