build: TypeScript 3.6 compatibility. (#32908)
This PR updates Angular to compile with TypeScript 3.6 while retaining compatibility with TS3.5. We achieve this by inserting several `as any` casts for compatiblity around `ts.CompilerHost` APIs. PR Close #32908
This commit is contained in:
@ -457,8 +457,8 @@ export class MetadataCollector {
|
||||
left: {
|
||||
__symbolic: 'select',
|
||||
expression: recordEntry({__symbolic: 'reference', name: enumName}, node), name
|
||||
} as any,
|
||||
};
|
||||
},
|
||||
} as any;
|
||||
} else {
|
||||
nextDefaultValue =
|
||||
recordEntry(errorSym('Unsupported enum member name', member.name), node);
|
||||
|
@ -32,11 +32,14 @@ export interface ShimGenerator {
|
||||
export class GeneratedShimsHostWrapper implements ts.CompilerHost {
|
||||
constructor(private delegate: ts.CompilerHost, private shimGenerators: ShimGenerator[]) {
|
||||
if (delegate.resolveModuleNames !== undefined) {
|
||||
this.resolveModuleNames =
|
||||
(moduleNames: string[], containingFile: string, reusedNames?: string[],
|
||||
redirectedReference?: ts.ResolvedProjectReference) =>
|
||||
delegate.resolveModuleNames !(
|
||||
moduleNames, containingFile, reusedNames, redirectedReference);
|
||||
// FIXME: TypeScript 3.6 adds an "options" argument that the code below passes on, but which
|
||||
// still makes the method incompatible with TS3.5. Remove the "as any" cast once fully on 3.6.
|
||||
((this as ts.CompilerHost) as any).resolveModuleNames =
|
||||
(moduleNames: string[], containingFile: string, reusedNames: (string[] | undefined),
|
||||
redirectedReference: (ts.ResolvedProjectReference | undefined), options: any) =>
|
||||
(delegate as any)
|
||||
.resolveModuleNames !(
|
||||
moduleNames, containingFile, reusedNames, redirectedReference, options);
|
||||
}
|
||||
if (delegate.resolveTypeReferenceDirectives) {
|
||||
// Backward compatibility with TypeScript 2.9 and older since return
|
||||
@ -56,10 +59,6 @@ export class GeneratedShimsHostWrapper implements ts.CompilerHost {
|
||||
}
|
||||
}
|
||||
|
||||
resolveModuleNames?:
|
||||
(moduleNames: string[], containingFile: string, reusedNames?: string[],
|
||||
redirectedReference?: ts.ResolvedProjectReference) => (ts.ResolvedModule | undefined)[];
|
||||
|
||||
resolveTypeReferenceDirectives?:
|
||||
(names: string[], containingFile: string) => ts.ResolvedTypeReferenceDirective[];
|
||||
|
||||
|
@ -14,7 +14,8 @@ describe('shim host', () => {
|
||||
const delegate = {} as unknown as ts.CompilerHost;
|
||||
const shimsHost = new GeneratedShimsHostWrapper(delegate, []);
|
||||
|
||||
expect(shimsHost.resolveModuleNames).not.toBeDefined();
|
||||
// FIXME: re-enable once fully on TS3.6.
|
||||
// expect(shimsHost.resolveModuleNames).not.toBeDefined();
|
||||
expect(shimsHost.resolveTypeReferenceDirectives).not.toBeDefined();
|
||||
expect(shimsHost.directoryExists).not.toBeDefined();
|
||||
expect(shimsHost.getDirectories).not.toBeDefined();
|
||||
@ -29,7 +30,8 @@ describe('shim host', () => {
|
||||
} as unknown as ts.CompilerHost;
|
||||
const shimsHost = new GeneratedShimsHostWrapper(delegate, []);
|
||||
|
||||
expect(shimsHost.resolveModuleNames).toBeDefined();
|
||||
// FIXME: re-enable once fully on TS3.6.
|
||||
// expect(shimsHost.resolveModuleNames).toBeDefined();
|
||||
expect(shimsHost.resolveTypeReferenceDirectives).toBeDefined();
|
||||
expect(shimsHost.directoryExists).toBeDefined();
|
||||
expect(shimsHost.getDirectories).toBeDefined();
|
||||
|
@ -113,7 +113,10 @@ export function resolveModuleName(
|
||||
moduleName: string, containingFile: string, compilerOptions: ts.CompilerOptions,
|
||||
compilerHost: ts.CompilerHost): ts.ResolvedModule|undefined {
|
||||
if (compilerHost.resolveModuleNames) {
|
||||
return compilerHost.resolveModuleNames([moduleName], containingFile)[0];
|
||||
// FIXME: Additional parameters are required in TS3.6, but ignored in 3.5.
|
||||
// Remove the any cast once fully on TS3.6.
|
||||
return (compilerHost as any)
|
||||
.resolveModuleNames([moduleName], containingFile, undefined, undefined, compilerOptions)[0];
|
||||
} else {
|
||||
return ts.resolveModuleName(moduleName, containingFile, compilerOptions, compilerHost)
|
||||
.resolvedModule;
|
||||
|
Reference in New Issue
Block a user