@@ -1264,10 +1264,13 @@ namespace ts {
1264
1264
}
1265
1265
1266
1266
const moduleReferenceLiteral = <LiteralExpression>moduleReferenceExpression;
1267
+ return resolveExternalModule(location, moduleReferenceLiteral.text, moduleNotFoundError, moduleReferenceLiteral);
1268
+ }
1267
1269
1270
+ function resolveExternalModule(location: Node, moduleReference: string, moduleNotFoundError: DiagnosticMessage, errorNode: Node): Symbol {
1268
1271
// Module names are escaped in our symbol table. However, string literal values aren't.
1269
1272
// Escape the name in the "require(...)" clause to ensure we find the right symbol.
1270
- const moduleName = escapeIdentifier(moduleReferenceLiteral.text );
1273
+ const moduleName = escapeIdentifier(moduleReference );
1271
1274
1272
1275
if (moduleName === undefined) {
1273
1276
return;
@@ -1282,7 +1285,7 @@ namespace ts {
1282
1285
}
1283
1286
}
1284
1287
1285
- const resolvedModule = getResolvedModule(getSourceFileOfNode(location), moduleReferenceLiteral.text );
1288
+ const resolvedModule = getResolvedModule(getSourceFileOfNode(location), moduleReference );
1286
1289
const sourceFile = resolvedModule && host.getSourceFile(resolvedModule.resolvedFileName);
1287
1290
if (sourceFile) {
1288
1291
if (sourceFile.symbol) {
@@ -1291,7 +1294,7 @@ namespace ts {
1291
1294
}
1292
1295
if (moduleNotFoundError) {
1293
1296
// report errors only if it was requested
1294
- error(moduleReferenceLiteral , Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
1297
+ error(errorNode , Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
1295
1298
}
1296
1299
return undefined;
1297
1300
}
@@ -1305,7 +1308,7 @@ namespace ts {
1305
1308
1306
1309
if (moduleNotFoundError) {
1307
1310
// report errors only if it was requested
1308
- error(moduleReferenceLiteral , moduleNotFoundError, moduleName);
1311
+ error(errorNode , moduleNotFoundError, moduleName);
1309
1312
}
1310
1313
return undefined;
1311
1314
}
@@ -17445,6 +17448,11 @@ namespace ts {
17445
17448
17446
17449
function isReferencedAliasDeclaration(node: Node, checkChildren?: boolean): boolean {
17447
17450
node = getParseTreeNode(node);
17451
+ // Purely synthesized nodes are always emitted.
17452
+ if (node === undefined) {
17453
+ return true;
17454
+ }
17455
+
17448
17456
if (isAliasSymbolDeclaration(node)) {
17449
17457
const symbol = getSymbolOfNode(node);
17450
17458
if (symbol && getSymbolLinks(symbol).referenced) {
@@ -17759,27 +17767,37 @@ namespace ts {
17759
17767
17760
17768
function initializeTypeChecker() {
17761
17769
// Bind all source files and propagate errors
17762
- forEach( host.getSourceFiles(), file => {
17770
+ for (const file of host.getSourceFiles()) {
17763
17771
bindSourceFile(file, compilerOptions);
17764
- });
17772
+ }
17765
17773
17766
- let augmentations: LiteralExpression[][];
17767
17774
// Initialize global symbol table
17768
- forEach(host.getSourceFiles(), file => {
17775
+ let augmentations: LiteralExpression[][];
17776
+ let requestedExternalEmitHelpers: NodeFlags = 0;
17777
+ let firstFileRequestingExternalHelpers: SourceFile;
17778
+ for (const file of host.getSourceFiles()) {
17769
17779
if (!isExternalOrCommonJsModule(file)) {
17770
17780
mergeSymbolTable(globals, file.locals);
17771
17781
}
17772
17782
if (file.patternAmbientModules && file.patternAmbientModules.length) {
17773
17783
patternAmbientModules = concatenate(patternAmbientModules, file.patternAmbientModules);
17774
17784
}
17775
-
17776
17785
if (file.moduleAugmentations.length) {
17777
17786
(augmentations || (augmentations = [])).push(file.moduleAugmentations);
17778
17787
}
17779
17788
if (file.symbol && file.symbol.globalExports) {
17780
17789
mergeSymbolTable(globals, file.symbol.globalExports);
17781
17790
}
17782
- });
17791
+ if ((compilerOptions.isolatedModules || isExternalModule(file)) && !file.isDeclarationFile) {
17792
+ const fileRequestedExternalEmitHelpers = file.flags & NodeFlags.EmitHelperFlags;
17793
+ if (fileRequestedExternalEmitHelpers) {
17794
+ requestedExternalEmitHelpers |= fileRequestedExternalEmitHelpers;
17795
+ if (firstFileRequestingExternalHelpers === undefined) {
17796
+ firstFileRequestingExternalHelpers = file;
17797
+ }
17798
+ }
17799
+ }
17800
+ }
17783
17801
17784
17802
if (augmentations) {
17785
17803
// merge module augmentations.
@@ -17842,6 +17860,48 @@ namespace ts {
17842
17860
const symbol = getGlobalSymbol("ReadonlyArray", SymbolFlags.Type, /*diagnostic*/ undefined);
17843
17861
globalReadonlyArrayType = symbol && <GenericType>getTypeOfGlobalSymbol(symbol, /*arity*/ 1);
17844
17862
anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType;
17863
+
17864
+ // If we have specified that we are importing helpers, we should report global
17865
+ // errors if we cannot resolve the helpers external module, or if it does not have
17866
+ // the necessary helpers exported.
17867
+ if (compilerOptions.importHelpers && firstFileRequestingExternalHelpers) {
17868
+ // Find the first reference to the helpers module.
17869
+ const helpersModule = resolveExternalModule(
17870
+ firstFileRequestingExternalHelpers,
17871
+ externalHelpersModuleNameText,
17872
+ Diagnostics.Cannot_find_module_0,
17873
+ /*errorNode*/ undefined);
17874
+
17875
+ // If we found the module, report errors if it does not have the necessary exports.
17876
+ if (helpersModule) {
17877
+ const exports = helpersModule.exports;
17878
+ if (requestedExternalEmitHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES6) {
17879
+ verifyHelperSymbol(exports, "__extends", SymbolFlags.Value);
17880
+ }
17881
+ if (requestedExternalEmitHelpers & NodeFlags.HasJsxSpreadAttributes && compilerOptions.jsx !== JsxEmit.Preserve) {
17882
+ verifyHelperSymbol(exports, "__assign", SymbolFlags.Value);
17883
+ }
17884
+ if (requestedExternalEmitHelpers & NodeFlags.HasDecorators) {
17885
+ verifyHelperSymbol(exports, "__decorate", SymbolFlags.Value);
17886
+ if (compilerOptions.emitDecoratorMetadata) {
17887
+ verifyHelperSymbol(exports, "__metadata", SymbolFlags.Value);
17888
+ }
17889
+ }
17890
+ if (requestedExternalEmitHelpers & NodeFlags.HasParamDecorators) {
17891
+ verifyHelperSymbol(exports, "__param", SymbolFlags.Value);
17892
+ }
17893
+ if (requestedExternalEmitHelpers & NodeFlags.HasAsyncFunctions) {
17894
+ verifyHelperSymbol(exports, "__awaiter", SymbolFlags.Value);
17895
+ }
17896
+ }
17897
+ }
17898
+ }
17899
+
17900
+ function verifyHelperSymbol(symbols: SymbolTable, name: string, meaning: SymbolFlags) {
17901
+ const symbol = getSymbol(symbols, escapeIdentifier(name), meaning);
17902
+ if (!symbol) {
17903
+ error(/*location*/ undefined, Diagnostics.Module_0_has_no_exported_member_1, externalHelpersModuleNameText, name);
17904
+ }
17845
17905
}
17846
17906
17847
17907
function createInstantiatedPromiseLikeType(): ObjectType {
0 commit comments