Skip to content

Commit f3d0b86

Browse files
committed
Short-circut when reporting errors for helpers.
1 parent b65c648 commit f3d0b86

File tree

1 file changed

+44
-32
lines changed

1 file changed

+44
-32
lines changed

src/compiler/checker.ts

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)