@@ -138,7 +138,7 @@ namespace ts {
138138
139139 const globals: SymbolTable = {};
140140
141- let globalESSymbolConstructorSymbol: Symbol;
141+ let getGlobalESSymbolConstructorSymbol: () => Symbol;
142142
143143 let getGlobalPromiseConstructorSymbol: () => Symbol;
144144
@@ -150,14 +150,19 @@ namespace ts {
150150 let globalNumberType: ObjectType;
151151 let globalBooleanType: ObjectType;
152152 let globalRegExpType: ObjectType;
153- let globalTemplateStringsArrayType: ObjectType;
154- let globalESSymbolType: ObjectType;
155- let globalIterableType: GenericType;
156- let globalIteratorType: GenericType;
157- let globalIterableIteratorType: GenericType;
158-
159153 let anyArrayType: Type;
160154 let anyReadonlyArrayType: Type;
155+
156+ // The library files are only loaded when the feature is used.
157+ // This allows users to just specify library files they want to used through --lib
158+ // and they will not get an error from not having unrelated library files
159+ let getGlobalTemplateStringsArrayType: () => ObjectType;
160+
161+ let getGlobalESSymbolType: () => ObjectType;
162+ let getGlobalIterableType: () => GenericType;
163+ let getGlobalIteratorType: () => GenericType;
164+ let getGlobalIterableIteratorType: () => GenericType;
165+
161166 let getGlobalClassDecoratorType: () => ObjectType;
162167 let getGlobalParameterDecoratorType: () => ObjectType;
163168 let getGlobalPropertyDecoratorType: () => ObjectType;
@@ -3973,7 +3978,7 @@ namespace ts {
39733978 type = globalBooleanType;
39743979 }
39753980 else if (type.flags & TypeFlags.ESSymbol) {
3976- type = globalESSymbolType ;
3981+ type = getGlobalESSymbolType() ;
39773982 }
39783983 return type;
39793984 }
@@ -4744,10 +4749,6 @@ namespace ts {
47444749 return typeSymbol && getDeclaredTypeOfSymbol(typeSymbol);
47454750 }
47464751
4747- function getGlobalESSymbolConstructorSymbol() {
4748- return globalESSymbolConstructorSymbol || (globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol"));
4749- }
4750-
47514752 /**
47524753 * Creates a TypeReference for a generic `TypedPropertyDescriptor<T>`.
47534754 */
@@ -4766,11 +4767,11 @@ namespace ts {
47664767 }
47674768
47684769 function createIterableType(elementType: Type): Type {
4769- return createTypeFromGenericGlobalType(globalIterableType , [elementType]);
4770+ return createTypeFromGenericGlobalType(getGlobalIterableType() , [elementType]);
47704771 }
47714772
47724773 function createIterableIteratorType(elementType: Type): Type {
4773- return createTypeFromGenericGlobalType(globalIterableIteratorType , [elementType]);
4774+ return createTypeFromGenericGlobalType(getGlobalIterableIteratorType() , [elementType]);
47744775 }
47754776
47764777 function createArrayType(elementType: Type): Type {
@@ -10434,7 +10435,7 @@ namespace ts {
1043410435 return getEffectiveDecoratorArgumentType(<Decorator>node, argIndex);
1043510436 }
1043610437 else if (argIndex === 0 && node.kind === SyntaxKind.TaggedTemplateExpression) {
10437- return globalTemplateStringsArrayType ;
10438+ return getGlobalTemplateStringsArrayType() ;
1043810439 }
1043910440
1044010441 // This is not a synthetic argument, so we return 'undefined'
@@ -14198,7 +14199,7 @@ namespace ts {
1419814199 if (!typeAsIterable.iterableElementType) {
1419914200 // As an optimization, if the type is instantiated directly using the globalIterableType (Iterable<number>),
1420014201 // then just grab its type argument.
14201- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIterableType ) {
14202+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIterableType() ) {
1420214203 typeAsIterable.iterableElementType = (<GenericType>type).typeArguments[0];
1420314204 }
1420414205 else {
@@ -14244,7 +14245,7 @@ namespace ts {
1424414245 if (!typeAsIterator.iteratorElementType) {
1424514246 // As an optimization, if the type is instantiated directly using the globalIteratorType (Iterator<number>),
1424614247 // then just grab its type argument.
14247- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIteratorType ) {
14248+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIteratorType() ) {
1424814249 typeAsIterator.iteratorElementType = (<GenericType>type).typeArguments[0];
1424914250 }
1425014251 else {
@@ -14288,7 +14289,7 @@ namespace ts {
1428814289
1428914290 // As an optimization, if the type is instantiated directly using the globalIterableIteratorType (IterableIterator<number>),
1429014291 // then just grab its type argument.
14291- if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === globalIterableIteratorType ) {
14292+ if ((type.flags & TypeFlags.Reference) && (<GenericType>type).target === getGlobalIterableIteratorType() ) {
1429214293 return (<GenericType>type).typeArguments[0];
1429314294 }
1429414295
@@ -16898,12 +16899,14 @@ namespace ts {
1689816899 globalNumberType = getGlobalType("Number");
1689916900 globalBooleanType = getGlobalType("Boolean");
1690016901 globalRegExpType = getGlobalType("RegExp");
16902+
1690116903 jsxElementType = getExportedTypeFromNamespace("JSX", JsxNames.Element);
1690216904 getGlobalClassDecoratorType = memoize(() => getGlobalType("ClassDecorator"));
1690316905 getGlobalPropertyDecoratorType = memoize(() => getGlobalType("PropertyDecorator"));
1690416906 getGlobalMethodDecoratorType = memoize(() => getGlobalType("MethodDecorator"));
1690516907 getGlobalParameterDecoratorType = memoize(() => getGlobalType("ParameterDecorator"));
1690616908 getGlobalTypedPropertyDescriptorType = memoize(() => getGlobalType("TypedPropertyDescriptor", /*arity*/ 1));
16909+ getGlobalESSymbolConstructorSymbol = memoize(() => getGlobalValueSymbol("Symbol"));
1690716910 getGlobalPromiseType = memoize(() => getGlobalType("Promise", /*arity*/ 1));
1690816911 tryGetGlobalPromiseType = memoize(() => getGlobalSymbol("Promise", SymbolFlags.Type, /*diagnostic*/ undefined) && getGlobalPromiseType());
1690916912 getGlobalPromiseLikeType = memoize(() => getGlobalType("PromiseLike", /*arity*/ 1));
@@ -16912,27 +16915,19 @@ namespace ts {
1691216915 getGlobalPromiseConstructorLikeType = memoize(() => getGlobalType("PromiseConstructorLike"));
1691316916 getGlobalThenableType = memoize(createThenableType);
1691416917
16915- // If we're in ES6 mode, load the TemplateStringsArray.
16916- // Otherwise, default to 'unknown' for the purposes of type checking in LS scenarios.
16918+ getGlobalTemplateStringsArrayType = memoize(() => getGlobalType(" TemplateStringsArray"));
16919+
1691716920 if (languageVersion >= ScriptTarget.ES6) {
16918- globalTemplateStringsArrayType = getGlobalType("TemplateStringsArray");
16919- globalESSymbolType = getGlobalType("Symbol");
16920- globalESSymbolConstructorSymbol = getGlobalValueSymbol("Symbol");
16921- globalIterableType = <GenericType>getGlobalType("Iterable", /*arity*/ 1);
16922- globalIteratorType = <GenericType>getGlobalType("Iterator", /*arity*/ 1);
16923- globalIterableIteratorType = <GenericType>getGlobalType("IterableIterator", /*arity*/ 1);
16921+ getGlobalESSymbolType = memoize(() => getGlobalType("Symbol"));
16922+ getGlobalIterableType = memoize(() => <GenericType>getGlobalType("Iterable", /*arity*/ 1));
16923+ getGlobalIteratorType = memoize(() => <GenericType>getGlobalType("Iterator", /*arity*/ 1));
16924+ getGlobalIterableIteratorType = memoize(() => <GenericType>getGlobalType("IterableIterator", /*arity*/ 1));
1692416925 }
1692516926 else {
16926- globalTemplateStringsArrayType = unknownType;
16927-
16928- // Consider putting Symbol interface in lib.d.ts. On the plus side, putting it in lib.d.ts would make it
16929- // extensible for Polyfilling Symbols. But putting it into lib.d.ts could also break users that have
16930- // a global Symbol already, particularly if it is a class.
16931- globalESSymbolType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
16932- globalESSymbolConstructorSymbol = undefined;
16933- globalIterableType = emptyGenericType;
16934- globalIteratorType = emptyGenericType;
16935- globalIterableIteratorType = emptyGenericType;
16927+ getGlobalESSymbolType = memoize(() => emptyObjectType);
16928+ getGlobalIterableType = memoize(() => emptyGenericType);
16929+ getGlobalIteratorType = memoize(() => emptyGenericType);
16930+ getGlobalIterableIteratorType = memoize(() => emptyGenericType);
1693616931 }
1693716932
1693816933 anyArrayType = createArrayType(anyType);
0 commit comments