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:
parent
bb53b6549c
commit
78214e72ea
@ -1778,7 +1778,10 @@ function isNamedDeclaration(node: ts.Declaration): node is ts.NamedDeclaration&
|
|||||||
|
|
||||||
function isClassMemberType(node: ts.Declaration): node is ts.ClassElement|
|
function isClassMemberType(node: ts.Declaration): node is ts.ClassElement|
|
||||||
ts.PropertyAccessExpression|ts.BinaryExpression {
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,6 +46,7 @@ runInEachFileSystem(() => {
|
|||||||
let TYPINGS_DTS_FILES: TestFile[];
|
let TYPINGS_DTS_FILES: TestFile[];
|
||||||
let MODULE_WITH_PROVIDERS_PROGRAM: TestFile[];
|
let MODULE_WITH_PROVIDERS_PROGRAM: TestFile[];
|
||||||
let NAMESPACED_IMPORT_FILE: TestFile;
|
let NAMESPACED_IMPORT_FILE: TestFile;
|
||||||
|
let INDEX_SIGNATURE_PROP_FILE: TestFile;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
_ = absoluteFrom;
|
_ = 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()', () => {
|
describe('getDecoratorsOfDeclaration()', () => {
|
||||||
@ -941,6 +951,20 @@ runInEachFileSystem(() => {
|
|||||||
expect(staticProperty.value !.getText()).toEqual(`'static'`);
|
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', () => {
|
it('should throw if the symbol is not a class', () => {
|
||||||
loadTestFiles([FOO_FUNCTION_FILE]);
|
loadTestFiles([FOO_FUNCTION_FILE]);
|
||||||
const {program} = makeTestBundleProgram(FOO_FUNCTION_FILE.name);
|
const {program} = makeTestBundleProgram(FOO_FUNCTION_FILE.name);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user