From 39ff1568e9676d40cf545477e9fd04077eff9b78 Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Wed, 22 Sep 2021 16:08:27 -0400 Subject: [PATCH] Changes to enable the module conversion script * shorthand -> long for `factory` since the typeformer script doesn't know how to handle it. * Use setter to change `ts.sys` (similar to #35399). * Fix `loggedIO` with empty namespaces to indicate dependency (similar to 50603eda). * Move `Map` / `Set` stuff from `core.ts` to `corePublic.ts` since the types are there. --- src/compiler/core.ts | 20 -------------------- src/compiler/corePublic.ts | 28 ++++++++++++++++++++++++++-- src/compiler/sys.ts | 5 +++++ src/compiler/transformer.ts | 2 +- src/loggedIO/loggedIO.ts | 6 +++++- src/tsserver/webServer.ts | 2 +- 6 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index eb07a11cbac..fab736de008 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1,25 +1,5 @@ /* @internal */ namespace ts { - type GetIteratorCallback = | ReadonlyESMap | undefined>(iterable: I) => Iterator< - I extends ReadonlyESMap ? [K, V] : - I extends ReadonlySet ? T : - I extends readonly (infer T)[] ? T : - I extends undefined ? undefined : - never>; - - function getCollectionImplementation< - K1 extends MatchingKeys any>, - K2 extends MatchingKeys ReturnType<(typeof NativeCollections)[K1]>> - >(name: string, nativeFactory: K1, shimFactory: K2): NonNullable> { - // NOTE: ts.ShimCollections will be defined for typescriptServices.js but not for tsc.js, so we must test for it. - const constructor = NativeCollections[nativeFactory]() ?? ShimCollections?.[shimFactory](getIterator); - if (constructor) return constructor as NonNullable>; - throw new Error(`TypeScript requires an environment that provides a compatible native ${name} implementation.`); - } - - export const Map = getCollectionImplementation("Map", "tryGetNativeMap", "createMapShim"); - export const Set = getCollectionImplementation("Set", "tryGetNativeSet", "createSetShim"); - export function getIterator | ReadonlyESMap | undefined>(iterable: I): Iterator< I extends ReadonlyESMap ? [K, V] : I extends ReadonlySet ? T : diff --git a/src/compiler/corePublic.ts b/src/compiler/corePublic.ts index 58d53aec456..4391aa1b5f2 100644 --- a/src/compiler/corePublic.ts +++ b/src/compiler/corePublic.ts @@ -113,7 +113,7 @@ namespace ts { } /* @internal */ - export namespace NativeCollections { + namespace NativeCollections { declare const Map: MapConstructor | undefined; declare const Set: SetConstructor | undefined; @@ -135,4 +135,28 @@ namespace ts { return typeof Set !== "undefined" && "entries" in Set.prototype && new Set([0]).size === 1 ? Set : undefined; } } -} \ No newline at end of file + + /* @internal */ + export const Map = getCollectionImplementation("Map", "tryGetNativeMap", "createMapShim"); + /* @internal */ + export const Set = getCollectionImplementation("Set", "tryGetNativeSet", "createSetShim"); + + /* @internal */ + type GetIteratorCallback = | ReadonlyESMap | undefined>(iterable: I) => Iterator< + I extends ReadonlyESMap ? [K, V] : + I extends ReadonlySet ? T : + I extends readonly (infer T)[] ? T : + I extends undefined ? undefined : + never>; + + /* @internal */ + function getCollectionImplementation< + K1 extends MatchingKeys any>, + K2 extends MatchingKeys ReturnType<(typeof NativeCollections)[K1]>> + >(name: string, nativeFactory: K1, shimFactory: K2): NonNullable> { + // NOTE: ts.ShimCollections will be defined for typescriptServices.js but not for tsc.js, so we must test for it. + const constructor = NativeCollections[nativeFactory]() ?? ShimCollections?.[shimFactory](getIterator); + if (constructor) return constructor as NonNullable>; + throw new Error(`TypeScript requires an environment that provides a compatible native ${name} implementation.`); + } +} diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 4f853cbb146..a5330d807cd 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -1900,6 +1900,11 @@ namespace ts { return sys!; })(); + /*@internal*/ + export function setSys(s: System) { + sys = s; + } + if (sys && sys.getEnvironmentVariable) { setCustomPollingValues(sys); Debug.setAssertionLevel(/^development$/i.test(sys.getEnvironmentVariable("NODE_ENV")) diff --git a/src/compiler/transformer.ts b/src/compiler/transformer.ts index 12aeca7f67d..7207d8a60d7 100644 --- a/src/compiler/transformer.ts +++ b/src/compiler/transformer.ts @@ -566,7 +566,7 @@ namespace ts { } export const nullTransformationContext: TransformationContext = { - factory, + factory: factory, // eslint-disable-line object-shorthand getCompilerOptions: () => ({}), getEmitResolver: notImplemented, getEmitHost: notImplemented, diff --git a/src/loggedIO/loggedIO.ts b/src/loggedIO/loggedIO.ts index c572f08fce6..fdd8c91906d 100644 --- a/src/loggedIO/loggedIO.ts +++ b/src/loggedIO/loggedIO.ts @@ -1,4 +1,4 @@ -namespace Playback { +namespace Playback { // eslint-disable-line one-namespace-per-file interface FileInformation { contents?: string; contentsPath?: string; @@ -445,3 +445,7 @@ namespace Playback { return wrapper; } } + +// empty modules for the module migration script +namespace ts.server { } // eslint-disable-line one-namespace-per-file +namespace Harness { } // eslint-disable-line one-namespace-per-file diff --git a/src/tsserver/webServer.ts b/src/tsserver/webServer.ts index dced32152b7..18d9ab4d13e 100644 --- a/src/tsserver/webServer.ts +++ b/src/tsserver/webServer.ts @@ -78,7 +78,7 @@ namespace ts.server { }; // Do this after sys has been set as findArguments is going to work only then const sys = server.createWebSystem(webHost, args, () => findArgument("--executingFilePath") || location + ""); - ts.sys = sys; + setSys(sys); const localeStr = findArgument("--locale"); if (localeStr) { validateLocaleAndSetLanguage(localeStr, sys);