@@ -138,7 +138,7 @@ namespace ts {
138
138
139
139
const globals: SymbolTable = {};
140
140
141
- let globalESSymbolConstructorSymbol: Symbol;
141
+ let getGlobalESSymbolConstructorSymbol: () => Symbol;
142
142
143
143
let getGlobalPromiseConstructorSymbol: () => Symbol;
144
144
@@ -150,11 +150,12 @@ namespace ts {
150
150
let globalNumberType: ObjectType;
151
151
let globalBooleanType: ObjectType;
152
152
let globalRegExpType: ObjectType;
153
- let globalTemplateStringsArrayType: ObjectType;
154
- let globalESSymbolType: ObjectType;
155
- let globalIterableType: GenericType;
156
- let globalIteratorType: GenericType;
157
- let globalIterableIteratorType: GenericType;
153
+ let getGlobalTemplateStringsArrayType: () => ObjectType;
154
+
155
+ let getGlobalESSymbolType: () => ObjectType;
156
+ let getGlobalIterableType: () => GenericType;
157
+ let getGlobalIteratorType: () => GenericType;
158
+ let getGlobalIterableIteratorType: () => GenericType;
158
159
159
160
let anyArrayType: Type;
160
161
let anyReadonlyArrayType: Type;
@@ -3973,7 +3974,7 @@ namespace ts {
3973
3974
type = globalBooleanType;
3974
3975
}
3975
3976
else if (type.flags & TypeFlags.ESSymbol) {
3976
- type = globalESSymbolType ;
3977
+ type = getGlobalESSymbolType() ;
3977
3978
}
3978
3979
return type;
3979
3980
}
@@ -4744,10 +4745,6 @@ namespace ts {
4744
4745
return typeSymbol && getDeclaredTypeOfSymbol(typeSymbol);
4745
4746
}
4746
4747
4747
- function getGlobalESSymbolConstructorSymbol() {
4748
- return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"));
4749
- }
4750
-
4751
4748
/**
4752
4749
* Creates a TypeReference for a generic `TypedPropertyDescriptor<T>`.
4753
4750
*/
@@ -4766,11 +4763,11 @@ namespace ts {
4766
4763
}
4767
4764
4768
4765
function createIterableType(elementType: Type): Type {
4769
- return createTypeFromGenericGlobalType(globalIterableType , [elementType]);
4766
+ return createTypeFromGenericGlobalType(getGlobalIterableType() , [elementType]);
4770
4767
}
4771
4768
4772
4769
function createIterableIteratorType(elementType: Type): Type {
4773
- return createTypeFromGenericGlobalType(globalIterableIteratorType , [elementType]);
4770
+ return createTypeFromGenericGlobalType(getGlobalIterableIteratorType() , [elementType]);
4774
4771
}
4775
4772
4776
4773
function createArrayType(elementType: Type): Type {
@@ -10415,7 +10412,7 @@ namespace ts {
10415
10412
return getEffectiveDecoratorArgumentType(<Decorator>node, argIndex);
10416
10413
}
10417
10414
else if (argIndex === 0 && node.kind === SyntaxKind.TaggedTemplateExpression) {
10418
- return globalTemplateStringsArrayType ;
10415
+ return getGlobalTemplateStringsArrayType() ;
10419
10416
}
10420
10417
10421
10418
// This is not a synthetic argument, so we return 'undefined'
@@ -14179,7 +14176,7 @@ namespace ts {
14179
14176
if (!typeAsIterable.iterableElementType) {
14180
14177
// As an optimization, if the type is instantiated directly using the globalIterableType (Iterable<number>),
14181
14178
// then just grab its type argument.
14182
- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIterableType ) {
14179
+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIterableType() ) {
14183
14180
typeAsIterable.iterableElementType = (<GenericType>type).typeArguments[0];
14184
14181
}
14185
14182
else {
@@ -14225,7 +14222,7 @@ namespace ts {
14225
14222
if (!typeAsIterator.iteratorElementType) {
14226
14223
// As an optimization, if the type is instantiated directly using the globalIteratorType (Iterator<number>),
14227
14224
// then just grab its type argument.
14228
- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIteratorType ) {
14225
+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIteratorType() ) {
14229
14226
typeAsIterator.iteratorElementType = (<GenericType>type).typeArguments[0];
14230
14227
}
14231
14228
else {
@@ -14269,7 +14266,7 @@ namespace ts {
14269
14266
14270
14267
// As an optimization, if the type is instantiated directly using the globalIterableIteratorType (IterableIterator<number>),
14271
14268
// then just grab its type argument.
14272
- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIterableIteratorType ) {
14269
+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIterableIteratorType() ) {
14273
14270
return (<GenericType>type).typeArguments[0];
14274
14271
}
14275
14272
@@ -16879,12 +16876,14 @@ namespace ts {
16879
16876
globalNumberType = getGlobalType("Number");
16880
16877
globalBooleanType = getGlobalType("Boolean");
16881
16878
globalRegExpType = getGlobalType("RegExp");
16879
+
16882
16880
jsxElementType = getExportedTypeFromNamespace("JSX", JsxNames.Element);
16883
16881
getGlobalClassDecoratorType = memoize(() => getGlobalType("ClassDecorator"));
16884
16882
getGlobalPropertyDecoratorType = memoize(() => getGlobalType("PropertyDecorator"));
16885
16883
getGlobalMethodDecoratorType = memoize(() => getGlobalType("MethodDecorator"));
16886
16884
getGlobalParameterDecoratorType = memoize(() => getGlobalType("ParameterDecorator"));
16887
16885
getGlobalTypedPropertyDescriptorType = memoize(() => getGlobalType("TypedPropertyDescriptor", /*arity*/ 1));
16886
+ getGlobalESSymbolConstructorSymbol = memoize(() => getGlobalValueSymbol("Symbol"));
16888
16887
getGlobalPromiseType = memoize(() => getGlobalType("Promise", /*arity*/ 1));
16889
16888
tryGetGlobalPromiseType = memoize(() => getGlobalSymbol("Promise", SymbolFlags.Type, /*diagnostic*/ undefined) && getGlobalPromiseType());
16890
16889
getGlobalPromiseLikeType = memoize(() => getGlobalType("PromiseLike", /*arity*/ 1));
@@ -16893,27 +16892,19 @@ namespace ts {
16893
16892
getGlobalPromiseConstructorLikeType = memoize(() => getGlobalType("PromiseConstructorLike"));
16894
16893
getGlobalThenableType = memoize(createThenableType);
16895
16894
16896
- // If we're in ES6 mode, load the TemplateStringsArray.
16897
- // Otherwise, default to 'unknown' for the purposes of type checking in LS scenarios.
16895
+ getGlobalTemplateStringsArrayType = memoize(() => getGlobalType(" TemplateStringsArray"));
16896
+
16898
16897
if (languageVersion >= ScriptTarget.ES6) {
16899
- globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
16900
- globalESSymbolType = getGlobalType("Symbol");
16901
- globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
16902
- globalIterableType = <GenericType>getGlobalType("Iterable", /*arity*/ 1);
16903
- globalIteratorType = <GenericType>getGlobalType("Iterator", /*arity*/ 1);
16904
- globalIterableIteratorType = <GenericType>getGlobalType("IterableIterator", /*arity*/ 1);
16898
+ getGlobalESSymbolType = memoize(() => getGlobalType("Symbol"));
16899
+ getGlobalIterableType = memoize(() => <GenericType>getGlobalType("Iterable", /*arity*/ 1));
16900
+ getGlobalIteratorType = memoize(() => <GenericType>getGlobalType("Iterator", /*arity*/ 1));
16901
+ getGlobalIterableIteratorType = memoize(() => <GenericType>getGlobalType("IterableIterator", /*arity*/ 1));
16905
16902
}
16906
16903
else {
16907
- globalTemplateStringsArrayType = unknownType;
16908
-
16909
- // Consider putting Symbol interface in lib.d.ts. On the plus side, putting it in lib.d.ts would make it
16910
- // extensible for Polyfilling Symbols. But putting it into lib.d.ts could also break users that have
16911
- // a global Symbol already, particularly if it is a class.
16912
- globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
16913
- globalESSymbolConstructorSymbol = undefined;
16914
- globalIterableType = emptyGenericType;
16915
- globalIteratorType = emptyGenericType;
16916
- globalIterableIteratorType = emptyGenericType;
16904
+ getGlobalESSymbolType = memoize(() => emptyObjectType);
16905
+ getGlobalIterableType = memoize(() => emptyGenericType);
16906
+ getGlobalIteratorType = memoize(() => emptyGenericType);
16907
+ getGlobalIterableIteratorType = memoize(() => emptyGenericType);
16917
16908
}
16918
16909
16919
16910
anyArrayType = createArrayType(anyType);
0 commit comments