From 04a449fcc6a345712d413264f6feddcfa75864b2 Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 12 Oct 2020 23:12:55 +0800 Subject: [PATCH] Add test again --- src/compiler/checker.ts | 22 +++++++++++++++++++++- src/compiler/types.ts | 3 ++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 11ca8d273f8a2..9ddd8384a90b0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3471,8 +3471,28 @@ namespace ts { : getPropertyOfType(type, memberName); } + function isLateBindingContainer(symbol: Symbol): boolean { + if (!(symbol.flags & (SymbolFlags.LateBindingContainer | SymbolFlags.Enum))) { + return false; + } + + if (symbol.flags & SymbolFlags.Enum) { + const links = getSymbolLinks(symbol); + if (links.enumHasLateBoundMember === undefined) { + for (const declaration of symbol.declarations) { + if (isEnumDeclaration(declaration) && some(declaration.members, isSpreadEnumMember)) { + return links.enumHasLateBoundMember = true; + } + } + return links.enumHasLateBoundMember = false; + } + return links.enumHasLateBoundMember; + } + return true; + } + function getExportsOfSymbol(symbol: Symbol): SymbolTable { - return symbol.flags & SymbolFlags.LateBindingContainer ? getResolvedMembersOrExportsOfSymbol(symbol, MembersOrExportsResolutionKind.resolvedExports) : + return isLateBindingContainer(symbol) ? getResolvedMembersOrExportsOfSymbol(symbol, MembersOrExportsResolutionKind.resolvedExports) : symbol.flags & SymbolFlags.Module ? getExportsOfModule(symbol) : symbol.exports || emptySymbols; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 6b849cee72ffc..7ab7efdbf7dca 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -4642,7 +4642,7 @@ namespace ts { Classifiable = Class | Enum | TypeAlias | Interface | TypeParameter | Module | Alias, /* @internal */ - LateBindingContainer = Class | Interface | TypeLiteral | ObjectLiteral | Function | Enum, + LateBindingContainer = Class | Interface | TypeLiteral | ObjectLiteral | Function, } /* @internal */ @@ -4707,6 +4707,7 @@ namespace ts { typeOnlyDeclaration?: TypeOnlyCompatibleAliasDeclaration | false; // First resolved alias declaration that makes the symbol only usable in type constructs isConstructorDeclaredProperty?: boolean; // Property declared through 'this.x = ...' assignment in constructor tupleLabelDeclaration?: NamedTupleMember | ParameterDeclaration; // Declaration associated with the tuple's label + enumHasLateBoundMember?: boolean // True if enum declaration contains spread enum member } /* @internal */