@@ -17767,27 +17767,37 @@ namespace ts {
1776717767
1776817768 function initializeTypeChecker() {
1776917769 // Bind all source files and propagate errors
17770- forEach( host.getSourceFiles(), file => {
17770+ for (const file of host.getSourceFiles()) {
1777117771 bindSourceFile(file, compilerOptions);
17772- });
17772+ }
1777317773
17774- let augmentations: LiteralExpression[][];
1777517774 // Initialize global symbol table
17776- forEach(host.getSourceFiles(), file => {
17775+ let augmentations: LiteralExpression[][];
17776+ let requestedExternalEmitHelpers: NodeFlags = 0;
17777+ let firstFileRequestingExternalHelpers: SourceFile;
17778+ for (const file of host.getSourceFiles()) {
1777717779 if (!isExternalOrCommonJsModule(file)) {
1777817780 mergeSymbolTable(globals, file.locals);
1777917781 }
1778017782 if (file.patternAmbientModules && file.patternAmbientModules.length) {
1778117783 patternAmbientModules = concatenate(patternAmbientModules, file.patternAmbientModules);
1778217784 }
17783-
1778417785 if (file.moduleAugmentations.length) {
1778517786 (augmentations || (augmentations = [])).push(file.moduleAugmentations);
1778617787 }
1778717788 if (file.symbol && file.symbol.globalExports) {
1778817789 mergeSymbolTable(globals, file.symbol.globalExports);
1778917790 }
17790- });
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+ }
1779117801
1779217802 if (augmentations) {
1779317803 // merge module augmentations.
@@ -17854,34 +17864,36 @@ namespace ts {
1785417864 // If we have specified that we are importing helpers, we should report global
1785517865 // errors if we cannot resolve the helpers external module, or if it does not have
1785617866 // the necessary helpers exported.
17857- if (compilerOptions.importHelpers) {
17858- forEach(host.getSourceFiles(), sourceFile => {
17859- const requestedHelpers = sourceFile.flags & NodeFlags.EmitHelperFlags;
17860- if (requestedHelpers && (compilerOptions.isolatedModules || isExternalModule(sourceFile))) {
17861- const helpers = resolveExternalModule(sourceFile, externalHelpersModuleNameText, Diagnostics.Cannot_find_module_0, /*errorNode*/ undefined);
17862- if (helpers) {
17863- const exports = helpers.exports;
17864- if (requestedHelpers & NodeFlags.HasClassExtends && languageVersion < ScriptTarget.ES6) {
17865- verifyHelperSymbol(exports, "__extends", SymbolFlags.Value);
17866- }
17867- if (requestedHelpers & NodeFlags.HasJsxSpreadAttributes && compilerOptions.jsx !== JsxEmit.Preserve) {
17868- verifyHelperSymbol(exports, "__assign", SymbolFlags.Value);
17869- }
17870- if (requestedHelpers & NodeFlags.HasDecorators) {
17871- verifyHelperSymbol(exports, "__decorate", SymbolFlags.Value);
17872- if (compilerOptions.emitDecoratorMetadata) {
17873- verifyHelperSymbol(exports, "__metadata", SymbolFlags.Value);
17874- }
17875- }
17876- if (requestedHelpers & NodeFlags.HasParamDecorators) {
17877- verifyHelperSymbol(exports, "__param", SymbolFlags.Value);
17878- }
17879- if (requestedHelpers & NodeFlags.HasAsyncFunctions) {
17880- verifyHelperSymbol(exports, "__awaiter", SymbolFlags.Value);
17881- }
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);
1788217888 }
1788317889 }
17884- });
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+ }
1788517897 }
1788617898 }
1788717899
0 commit comments