In TypeScript 3.8 support was added for type-only imports, which only brings in the symbol as a type, not their value. The Angular compiler did not yet take the type-only keyword into account when representing symbols in type positions as value expressions. The class metadata that the compiler emits would include the value expression for its parameter types, generating actual imports as necessary. For type-only imports this should not be done, as it introduces an actual import of the module that was originally just a type-only import. This commit lets the compiler deal with type-only imports specially, preventing a value expression from being created. Fixes #37900 PR Close #37912
41 lines
1.8 KiB
TypeScript
41 lines
1.8 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google LLC All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
import * as ts from 'typescript';
|
|
import {CtorParameter, TypeValueReferenceKind} from '../../../src/ngtsc/reflection';
|
|
|
|
/**
|
|
* Check that a given list of `CtorParameter`s has `typeValueReference`s of specific `ts.Identifier`
|
|
* names.
|
|
*/
|
|
export function expectTypeValueReferencesForParameters(
|
|
parameters: CtorParameter[], expectedParams: (string|null)[], fromModule: string|null = null) {
|
|
parameters!.forEach((param, idx) => {
|
|
const expected = expectedParams[idx];
|
|
if (expected !== null) {
|
|
if (param.typeValueReference.kind === TypeValueReferenceKind.UNAVAILABLE) {
|
|
fail(`Incorrect typeValueReference generated, expected ${expected}`);
|
|
} else if (
|
|
param.typeValueReference.kind === TypeValueReferenceKind.LOCAL && fromModule !== null) {
|
|
fail(`Incorrect typeValueReference generated, expected non-local`);
|
|
} else if (
|
|
param.typeValueReference.kind !== TypeValueReferenceKind.LOCAL && fromModule === null) {
|
|
fail(`Incorrect typeValueReference generated, expected local`);
|
|
} else if (param.typeValueReference.kind === TypeValueReferenceKind.LOCAL) {
|
|
if (!ts.isIdentifier(param.typeValueReference.expression)) {
|
|
fail(`Incorrect typeValueReference generated, expected identifier`);
|
|
} else {
|
|
expect(param.typeValueReference.expression.text).toEqual(expected);
|
|
}
|
|
} else if (param.typeValueReference.kind === TypeValueReferenceKind.IMPORTED) {
|
|
expect(param.typeValueReference.moduleName).toBe(fromModule!);
|
|
expect(param.typeValueReference.importedName).toBe(expected);
|
|
}
|
|
}
|
|
});
|
|
}
|