Skip to content

Commit 2e47d4a

Browse files
committed
Handle when files get checked in different orders
1 parent 1bb6ea0 commit 2e47d4a

File tree

1 file changed

+20
-9
lines changed

1 file changed

+20
-9
lines changed

src/compiler/checker.ts

+20-9
Original file line numberDiff line numberDiff line change
@@ -2234,7 +2234,7 @@ namespace ts {
22342234

22352235
function getTargetOfImportClause(node: ImportClause, dontResolveAlias: boolean): Symbol | undefined {
22362236
const moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
2237-
markSymbolOfAliasDeclarationIfTypeOnly(node);
2237+
const isTypeOnly = markSymbolOfAliasDeclarationIfTypeOnly(node);
22382238

22392239
if (moduleSymbol) {
22402240
let exportDefaultSymbol: Symbol | undefined;
@@ -2277,16 +2277,21 @@ namespace ts {
22772277
}
22782278
else if (hasSyntheticDefault) {
22792279
// per emit behavior, a synthetic default overrides a "real" .default member if `__esModule` is not present
2280-
return resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias) || resolveSymbol(moduleSymbol, dontResolveAlias);
2280+
const resolved = resolveExternalModuleSymbol(moduleSymbol, dontResolveAlias) || resolveSymbol(moduleSymbol, dontResolveAlias);
2281+
if (!isTypeOnly) markSymbolOfAliasDeclarationIfResolvesToTypeOnly(node, resolved);
2282+
return resolved;
22812283
}
2284+
if (!isTypeOnly) markSymbolOfAliasDeclarationIfResolvesToTypeOnly(node, exportDefaultSymbol);
22822285
return exportDefaultSymbol;
22832286
}
22842287
}
22852288

22862289
function getTargetOfNamespaceImport(node: NamespaceImport, dontResolveAlias: boolean): Symbol | undefined {
22872290
const moduleSpecifier = node.parent.parent.moduleSpecifier;
2288-
markSymbolOfAliasDeclarationIfTypeOnly(node);
2289-
return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier, dontResolveAlias, /*suppressUsageError*/ false);
2291+
const isTypeOnly = markSymbolOfAliasDeclarationIfTypeOnly(node);
2292+
const resolved = resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier, dontResolveAlias, /*suppressUsageError*/ false);
2293+
if (!isTypeOnly) markSymbolOfAliasDeclarationIfResolvesToTypeOnly(node, resolved);
2294+
return resolved;
22902295
}
22912296

22922297
function getTargetOfNamespaceExport(node: NamespaceExport, dontResolveAlias: boolean): Symbol | undefined {
@@ -2433,19 +2438,23 @@ namespace ts {
24332438
}
24342439

24352440
function getTargetOfImportSpecifier(node: ImportSpecifier, dontResolveAlias: boolean): Symbol | undefined {
2436-
markSymbolOfAliasDeclarationIfTypeOnly(node);
2437-
return getExternalModuleMember(node.parent.parent.parent, node, dontResolveAlias);
2441+
const isTypeOnly = markSymbolOfAliasDeclarationIfTypeOnly(node);
2442+
const resolved = getExternalModuleMember(node.parent.parent.parent, node, dontResolveAlias);
2443+
if (!isTypeOnly) markSymbolOfAliasDeclarationIfResolvesToTypeOnly(node, resolved);
2444+
return resolved;
24382445
}
24392446

24402447
function getTargetOfNamespaceExportDeclaration(node: NamespaceExportDeclaration, dontResolveAlias: boolean): Symbol {
24412448
return resolveExternalModuleSymbol(node.parent.symbol, dontResolveAlias);
24422449
}
24432450

24442451
function getTargetOfExportSpecifier(node: ExportSpecifier, meaning: SymbolFlags, dontResolveAlias?: boolean) {
2445-
markSymbolOfAliasDeclarationIfTypeOnly(node);
2446-
return node.parent.parent.moduleSpecifier ?
2452+
const isTypeOnly = markSymbolOfAliasDeclarationIfTypeOnly(node);
2453+
const resolved = node.parent.parent.moduleSpecifier ?
24472454
getExternalModuleMember(node.parent.parent, node, dontResolveAlias) :
24482455
resolveEntityName(node.propertyName || node.name, meaning, /*ignoreErrors*/ false, dontResolveAlias);
2456+
if (!isTypeOnly) markSymbolOfAliasDeclarationIfResolvesToTypeOnly(node, resolved);
2457+
return resolved;
24492458
}
24502459

24512460
function getTargetOfExportAssignment(node: ExportAssignment | BinaryExpression, dontResolveAlias: boolean): Symbol | undefined {
@@ -2557,12 +2566,14 @@ namespace ts {
25572566
}
25582567
}
25592568

2560-
function markSymbolOfAliasDeclarationIfTypeOnly(aliasDeclaration: TypeOnlyCompatibleAliasDeclaration) {
2569+
function markSymbolOfAliasDeclarationIfTypeOnly(aliasDeclaration: TypeOnlyCompatibleAliasDeclaration): boolean {
25612570
if (isTypeOnlyImportOrExportDeclaration(aliasDeclaration)) {
25622571
const symbol = getSymbolOfNode(aliasDeclaration);
25632572
const links = getSymbolLinks(symbol);
25642573
links.typeOnlyDeclaration = aliasDeclaration;
2574+
return true;
25652575
}
2576+
return false;
25662577
}
25672578

25682579
/** Indicates that a symbol directly or indirectly resolves to a type-only import or export. */

0 commit comments

Comments
 (0)