@@ -2705,7 +2705,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2705
2705
return symbol;
2706
2706
}
2707
2707
if (symbol.flags & SymbolFlags.Alias) {
2708
- const targetFlags = getAllSymbolFlags (symbol);
2708
+ const targetFlags = getSymbolFlags (symbol);
2709
2709
// `targetFlags` will be `SymbolFlags.All` if an error occurred in alias resolution; this avoids cascading errors
2710
2710
if (targetFlags & meaning) {
2711
2711
return symbol;
@@ -3724,7 +3724,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3724
3724
return true;
3725
3725
}
3726
3726
const symbol = resolveSymbol(resolveName(errorLocation, name, SymbolFlags.Type & ~SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined, /*isUse*/ false));
3727
- const allFlags = symbol && getAllSymbolFlags (symbol);
3727
+ const allFlags = symbol && getSymbolFlags (symbol);
3728
3728
if (symbol && allFlags !== undefined && !(allFlags & SymbolFlags.Value)) {
3729
3729
const rawName = unescapeLeadingUnderscores(name);
3730
3730
if (isES2015OrLaterConstructorName(name)) {
@@ -4457,14 +4457,21 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4457
4457
* @returns SymbolFlags.All if `symbol` is an alias that ultimately resolves to `unknown`;
4458
4458
* combined flags of all alias targets otherwise.
4459
4459
*/
4460
- function getAllSymbolFlags (symbol: Symbol, excludeTypeOnlyMeanings?: boolean): SymbolFlags {
4460
+ function getSymbolFlags (symbol: Symbol, excludeTypeOnlyMeanings?: boolean, excludeLocalMeanings ?: boolean): SymbolFlags {
4461
4461
const typeOnlyDeclaration = excludeTypeOnlyMeanings && getTypeOnlyAliasDeclaration(symbol);
4462
- const typeOnlyResolution = typeOnlyDeclaration && resolveAlias(typeOnlyDeclaration.symbol);
4463
- let flags = symbol.flags;
4462
+ const typeOnlyDeclarationIsExportStar = typeOnlyDeclaration && isExportDeclaration(typeOnlyDeclaration);
4463
+ const typeOnlyResolution = typeOnlyDeclaration && (
4464
+ typeOnlyDeclarationIsExportStar
4465
+ ? resolveExternalModuleName(typeOnlyDeclaration.moduleSpecifier, typeOnlyDeclaration.moduleSpecifier, /*ignoreErrors*/ true)
4466
+ : resolveAlias(typeOnlyDeclaration.symbol));
4467
+ const typeOnlyExportStarTargets = typeOnlyDeclarationIsExportStar && typeOnlyResolution ? getExportsOfModule(typeOnlyResolution) : undefined;
4468
+ let flags = excludeLocalMeanings ? SymbolFlags.None : symbol.flags;
4464
4469
let seenSymbols;
4465
4470
while (symbol.flags & SymbolFlags.Alias) {
4466
- const target = resolveAlias(symbol);
4467
- if (target === typeOnlyResolution) {
4471
+ const target = getExportSymbolOfValueSymbolIfExported(resolveAlias(symbol));
4472
+ if (!typeOnlyDeclarationIsExportStar && target === typeOnlyResolution ||
4473
+ typeOnlyExportStarTargets?.get(target.escapedName) === target
4474
+ ) {
4468
4475
break;
4469
4476
}
4470
4477
if (target === unknownSymbol) {
@@ -4515,7 +4522,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4515
4522
immediateTarget: Symbol | undefined,
4516
4523
finalTarget: Symbol | undefined,
4517
4524
overwriteEmpty: boolean,
4518
- exportStarDeclaration?: ExportDeclaration & { readonly isTypeOnly: true },
4525
+ exportStarDeclaration?: ExportDeclaration & { readonly isTypeOnly: true, readonly moduleSpecifier: Expression },
4519
4526
exportStarName?: __String,
4520
4527
): boolean {
4521
4528
if (!aliasDeclaration || isPropertyAccessExpression(aliasDeclaration)) return false;
@@ -4564,7 +4571,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4564
4571
const resolved = links.typeOnlyDeclaration.kind === SyntaxKind.ExportDeclaration
4565
4572
? resolveSymbol(getExportsOfModule(links.typeOnlyDeclaration.symbol.parent!).get(links.typeOnlyExportStarName || symbol.escapedName))!
4566
4573
: resolveAlias(links.typeOnlyDeclaration.symbol);
4567
- return getAllSymbolFlags (resolved) & include ? links.typeOnlyDeclaration : undefined;
4574
+ return getSymbolFlags (resolved) & include ? links.typeOnlyDeclaration : undefined;
4568
4575
}
4569
4576
return undefined;
4570
4577
}
@@ -4577,7 +4584,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4577
4584
const target = resolveAlias(symbol);
4578
4585
if (target) {
4579
4586
const markAlias = target === unknownSymbol ||
4580
- ((getAllSymbolFlags(target , /*excludeTypeOnlyMeanings*/ true) & SymbolFlags.Value) && !isConstEnumOrConstEnumOnlyModule(target));
4587
+ ((getSymbolFlags(symbol , /*excludeTypeOnlyMeanings*/ true) & SymbolFlags.Value) && !isConstEnumOrConstEnumOnlyModule(target));
4581
4588
4582
4589
if (markAlias) {
4583
4590
markAliasSymbolAsReferenced(symbol);
@@ -4599,7 +4606,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4599
4606
// This way a chain of imports can be elided if ultimately the final input is only used in a type
4600
4607
// position.
4601
4608
if (isInternalModuleImportEqualsDeclaration(node)) {
4602
- if (getAllSymbolFlags (resolveSymbol(symbol)) & SymbolFlags.Value) {
4609
+ if (getSymbolFlags (resolveSymbol(symbol)) & SymbolFlags.Value) {
4603
4610
// import foo = <symbol>
4604
4611
checkExpressionCached(node.moduleReference as Expression);
4605
4612
}
@@ -5314,7 +5321,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5314
5321
5315
5322
function getExportsOfModuleWorker(moduleSymbol: Symbol) {
5316
5323
const visitedSymbols: Symbol[] = [];
5317
- let typeOnlyExportStarMap: Map<__String, ExportDeclaration & { readonly isTypeOnly: true }> | undefined;
5324
+ let typeOnlyExportStarMap: Map<__String, ExportDeclaration & { readonly isTypeOnly: true, readonly moduleSpecifier: Expression }> | undefined;
5318
5325
const nonTypeOnlyNames = new Set<__String>();
5319
5326
5320
5327
// A module defined by an 'export=' consists of one export that needs to be resolved
@@ -5381,7 +5388,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5381
5388
typeOnlyExportStarMap ??= new Map();
5382
5389
symbols.forEach((_, escapedName) => typeOnlyExportStarMap!.set(
5383
5390
escapedName,
5384
- exportStar as ExportDeclaration & { readonly isTypeOnly: true }));
5391
+ exportStar as ExportDeclaration & { readonly isTypeOnly: true, readonly moduleSpecifier: Expression }));
5385
5392
}
5386
5393
return symbols;
5387
5394
}
@@ -5572,7 +5579,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5572
5579
function symbolIsValue(symbol: Symbol, includeTypeOnlyMembers?: boolean): boolean {
5573
5580
return !!(
5574
5581
symbol.flags & SymbolFlags.Value ||
5575
- symbol.flags & SymbolFlags.Alias && getAllSymbolFlags (symbol, !includeTypeOnlyMembers) & SymbolFlags.Value);
5582
+ symbol.flags & SymbolFlags.Alias && getSymbolFlags (symbol, !includeTypeOnlyMembers) & SymbolFlags.Value);
5576
5583
}
5577
5584
5578
5585
function findConstructorDeclaration(node: ClassLikeDeclaration): ConstructorDeclaration | undefined {
@@ -5871,7 +5878,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
5871
5878
// Qualify if the symbol from symbol table has same meaning as expected
5872
5879
const shouldResolveAlias = (symbolFromSymbolTable.flags & SymbolFlags.Alias && !getDeclarationOfKind(symbolFromSymbolTable, SyntaxKind.ExportSpecifier));
5873
5880
symbolFromSymbolTable = shouldResolveAlias ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
5874
- const flags = shouldResolveAlias ? getAllSymbolFlags (symbolFromSymbolTable) : symbolFromSymbolTable.flags;
5881
+ const flags = shouldResolveAlias ? getSymbolFlags (symbolFromSymbolTable) : symbolFromSymbolTable.flags;
5875
5882
if (flags & meaning) {
5876
5883
qualify = true;
5877
5884
return true;
@@ -8910,7 +8917,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
8910
8917
}
8911
8918
8912
8919
function isTypeOnlyNamespace(symbol: Symbol) {
8913
- return every(getNamespaceMembersForSerialization(symbol), m => !(getAllSymbolFlags (resolveSymbol(m)) & SymbolFlags.Value));
8920
+ return every(getNamespaceMembersForSerialization(symbol), m => !(getSymbolFlags (resolveSymbol(m)) & SymbolFlags.Value));
8914
8921
}
8915
8922
8916
8923
function serializeModule(symbol: Symbol, symbolName: string, modifierFlags: ModifierFlags) {
@@ -11421,7 +11428,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
11421
11428
links.type = exportSymbol?.declarations && isDuplicatedCommonJSExport(exportSymbol.declarations) && symbol.declarations!.length ? getFlowTypeFromCommonJSExport(exportSymbol)
11422
11429
: isDuplicatedCommonJSExport(symbol.declarations) ? autoType
11423
11430
: declaredType ? declaredType
11424
- : getAllSymbolFlags (targetSymbol) & SymbolFlags.Value ? getTypeOfSymbol(targetSymbol)
11431
+ : getSymbolFlags (targetSymbol) & SymbolFlags.Value ? getTypeOfSymbol(targetSymbol)
11425
11432
: errorType;
11426
11433
}
11427
11434
return links.type;
@@ -27815,7 +27822,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
27815
27822
}
27816
27823
if (isNonLocalAlias(symbol, /*excludes*/ SymbolFlags.Value) && !isInTypeQuery(location)) {
27817
27824
const target = resolveAlias(symbol);
27818
- if (getAllSymbolFlags(target , /*excludeTypeOnlyMeanings*/ true) & (SymbolFlags.Value | SymbolFlags.ExportValue)) {
27825
+ if (getSymbolFlags(symbol , /*excludeTypeOnlyMeanings*/ true) & (SymbolFlags.Value | SymbolFlags.ExportValue)) {
27819
27826
// An alias resolving to a const enum cannot be elided if (1) 'isolatedModules' is enabled
27820
27827
// (because the const enum value will not be inlined), or if (2) the alias is an export
27821
27828
// of a const enum declaration that will be preserved.
@@ -44240,7 +44247,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44240
44247
return;
44241
44248
}
44242
44249
44243
- const targetFlags = getAllSymbolFlags (target);
44250
+ const targetFlags = getSymbolFlags (target);
44244
44251
const excludedMeanings =
44245
44252
(symbol.flags & (SymbolFlags.Value | SymbolFlags.ExportValue) ? SymbolFlags.Value : 0) |
44246
44253
(symbol.flags & SymbolFlags.Type ? SymbolFlags.Type : 0) |
@@ -44442,7 +44449,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44442
44449
if (node.moduleReference.kind !== SyntaxKind.ExternalModuleReference) {
44443
44450
const target = resolveAlias(getSymbolOfDeclaration(node));
44444
44451
if (target !== unknownSymbol) {
44445
- const targetFlags = getAllSymbolFlags (target);
44452
+ const targetFlags = getSymbolFlags (target);
44446
44453
if (targetFlags & SymbolFlags.Value) {
44447
44454
// Target is a value symbol, check that it is not hidden by a local declaration with the same name
44448
44455
const moduleName = getFirstIdentifier(node.moduleReference);
@@ -44599,7 +44606,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44599
44606
markExportAsReferenced(node);
44600
44607
}
44601
44608
const target = symbol && (symbol.flags & SymbolFlags.Alias ? resolveAlias(symbol) : symbol);
44602
- if (!target || getAllSymbolFlags (target) & SymbolFlags.Value) {
44609
+ if (!target || getSymbolFlags (target) & SymbolFlags.Value) {
44603
44610
checkExpressionCached(node.propertyName || node.name);
44604
44611
}
44605
44612
}
@@ -44655,7 +44662,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
44655
44662
if (sym) {
44656
44663
markAliasReferenced(sym, id);
44657
44664
// If not a value, we're interpreting the identifier as a type export, along the lines of (`export { Id as default }`)
44658
- if (getAllSymbolFlags (sym) & SymbolFlags.Value) {
44665
+ if (getSymbolFlags (sym) & SymbolFlags.Value) {
44659
44666
// However if it is a value, we need to check it's being used correctly
44660
44667
checkExpressionCached(id);
44661
44668
if (!isIllegalExportDefaultInCJS && !(node.flags & NodeFlags.Ambient) && compilerOptions.verbatimModuleSyntax && getTypeOnlyAliasDeclaration(sym, SymbolFlags.Value)) {
@@ -46162,7 +46169,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
46162
46169
46163
46170
function isValue(s: Symbol): boolean {
46164
46171
s = resolveSymbol(s);
46165
- return s && !!(getAllSymbolFlags (s) & SymbolFlags.Value);
46172
+ return s && !!(getSymbolFlags (s) & SymbolFlags.Value);
46166
46173
}
46167
46174
}
46168
46175
@@ -46353,7 +46360,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
46353
46360
}
46354
46361
// const enums and modules that contain only const enums are not considered values from the emit perspective
46355
46362
// unless 'preserveConstEnums' option is set to true
46356
- return !!((getAllSymbolFlags(target , excludeTypeOnlyValues) ?? -1 ) & SymbolFlags.Value) &&
46363
+ return !!(getSymbolFlags(symbol , excludeTypeOnlyValues, /*excludeLocalMeanings*/ true ) & SymbolFlags.Value) &&
46357
46364
(shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target));
46358
46365
}
46359
46366
@@ -46371,7 +46378,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
46371
46378
}
46372
46379
const target = getSymbolLinks(symbol).aliasTarget;
46373
46380
if (target && getEffectiveModifierFlags(node) & ModifierFlags.Export &&
46374
- getAllSymbolFlags (target) & SymbolFlags.Value &&
46381
+ getSymbolFlags (target) & SymbolFlags.Value &&
46375
46382
(shouldPreserveConstEnums(compilerOptions) || !isConstEnumOrConstEnumOnlyModule(target))) {
46376
46383
// An `export import ... =` of a value symbol is always considered referenced
46377
46384
return true;
0 commit comments