fix(ngcc): avoid warning when reflecting on index signature member (#33198)

Previously, when `ngcc` was reflecting on class members it did not
account for the fact that a member could be of the kind
`IndexSignature`. This can happen, for example, on abstract classes (as
is the case for [JsonCallbackContext][1]).

Trying to reflect on such members (and failing to recognize their kind),
resulted in warnings, such as:
```
Warning: Unknown member type: "[key: string]: (data: any) => void;
```

While these warnings are harmless, they can be confusing and worrisome
for users.

This commit avoids such warnings by detecting class members of the
`IndexSignature` kind and ignoring them.

[1]: https://github.com/angular/angular/blob/4659cc26e/packages/common/http/src/jsonp.ts#L39

PR Close #33198
This commit is contained in:
George Kalpakas 2019-10-16 19:15:01 +03:00 committed by Matias Niemelä
parent bb53b6549c
commit 78214e72ea
2 changed files with 28 additions and 1 deletions

View File

@ -1778,7 +1778,10 @@ function isNamedDeclaration(node: ts.Declaration): node is ts.NamedDeclaration&
function isClassMemberType(node: ts.Declaration): node is ts.ClassElement|
ts.PropertyAccessExpression|ts.BinaryExpression {
return ts.isClassElement(node) || isPropertyAccess(node) || ts.isBinaryExpression(node);
return (ts.isClassElement(node) || isPropertyAccess(node) || ts.isBinaryExpression(node)) &&
// Additionally, ensure `node` is not an index signature, for example on an abstract class:
// `abstract class Foo { [key: string]: any; }`
!ts.isIndexSignatureDeclaration(node);
}
/**

View File

@ -46,6 +46,7 @@ runInEachFileSystem(() => {
let TYPINGS_DTS_FILES: TestFile[];
let MODULE_WITH_PROVIDERS_PROGRAM: TestFile[];
let NAMESPACED_IMPORT_FILE: TestFile;
let INDEX_SIGNATURE_PROP_FILE: TestFile;
beforeEach(() => {
_ = absoluteFrom;
@ -690,6 +691,15 @@ runInEachFileSystem(() => {
];
`
};
INDEX_SIGNATURE_PROP_FILE = {
name: _('/index_signature_prop.d.ts'),
contents: `
abstract class IndexSignatureClass {
[key: string]: any;
}
`,
};
});
describe('getDecoratorsOfDeclaration()', () => {
@ -941,6 +951,20 @@ runInEachFileSystem(() => {
expect(staticProperty.value !.getText()).toEqual(`'static'`);
});
it('should ignore index signature properties', () => {
loadTestFiles([INDEX_SIGNATURE_PROP_FILE]);
const logger = new MockLogger();
const {program} = makeTestBundleProgram(INDEX_SIGNATURE_PROP_FILE.name);
const host = new Esm2015ReflectionHost(logger, false, program.getTypeChecker());
const classNode = getDeclaration(
program, INDEX_SIGNATURE_PROP_FILE.name, 'IndexSignatureClass',
isNamedClassDeclaration);
const members = host.getMembersOfClass(classNode);
expect(members).toEqual([]);
expect(logger.logs.warn).toEqual([]);
});
it('should throw if the symbol is not a class', () => {
loadTestFiles([FOO_FUNCTION_FILE]);
const {program} = makeTestBundleProgram(FOO_FUNCTION_FILE.name);