@@ -29,6 +29,7 @@ namespace ts {
2929 // Used to rehydrate `symbol` and `moduleSymbol` when transient
3030 id : number ;
3131 symbolName : string ;
32+ symbolTableKey : __String ;
3233 moduleName : string ;
3334 moduleFile : SourceFile | undefined ;
3435
@@ -44,7 +45,7 @@ namespace ts {
4445 export interface ExportInfoMap {
4546 isUsableByFile ( importingFile : Path ) : boolean ;
4647 clear ( ) : void ;
47- add ( importingFile : Path , symbol : Symbol , moduleSymbol : Symbol , moduleFile : SourceFile | undefined , exportKind : ExportKind , isFromPackageJson : boolean , scriptTarget : ScriptTarget , checker : TypeChecker ) : void ;
48+ add ( importingFile : Path , symbol : Symbol , key : __String , moduleSymbol : Symbol , moduleFile : SourceFile | undefined , exportKind : ExportKind , isFromPackageJson : boolean , scriptTarget : ScriptTarget , checker : TypeChecker ) : void ;
4849 get ( importingFile : Path , importedName : string , symbol : Symbol , moduleName : string , checker : TypeChecker ) : readonly SymbolExportInfo [ ] | undefined ;
4950 forEach ( importingFile : Path , action : ( info : readonly SymbolExportInfo [ ] , name : string , isFromAmbientModule : boolean ) => void ) : void ;
5051 releaseSymbols ( ) : void ;
@@ -71,13 +72,19 @@ namespace ts {
7172 symbols . clear ( ) ;
7273 usableByFileName = undefined ;
7374 } ,
74- add : ( importingFile , symbol , moduleSymbol , moduleFile , exportKind , isFromPackageJson , scriptTarget , checker ) => {
75+ add : ( importingFile , symbol , symbolTableKey , moduleSymbol , moduleFile , exportKind , isFromPackageJson , scriptTarget , checker ) => {
7576 if ( importingFile !== usableByFileName ) {
7677 cache . clear ( ) ;
7778 usableByFileName = importingFile ;
7879 }
7980 const isDefault = exportKind === ExportKind . Default ;
80- const importedName = getNameForExportedSymbol ( isDefault && getLocalSymbolForExportDefault ( symbol ) || symbol , scriptTarget ) ;
81+ const namedSymbol = isDefault && getLocalSymbolForExportDefault ( symbol ) || symbol ;
82+ // A re-export merged with an export from a module augmentation can result in `symbol`
83+ // being an external module symbol; the name it is re-exported by will be `symbolTableKey`
84+ // (which comes from the keys of `moduleSymbol.exports`.)
85+ const importedName = isExternalModuleSymbol ( namedSymbol )
86+ ? unescapeLeadingUnderscores ( symbolTableKey )
87+ : getNameForExportedSymbol ( namedSymbol , scriptTarget ) ;
8188 const moduleName = stripQuotes ( moduleSymbol . name ) ;
8289 const id = exportInfoId ++ ;
8390 const storedSymbol = symbol . flags & SymbolFlags . Transient ? undefined : symbol ;
@@ -86,6 +93,7 @@ namespace ts {
8693
8794 exportInfo . add ( key ( importedName , symbol , moduleName , checker ) , {
8895 id,
96+ symbolTableKey,
8997 symbolName : importedName ,
9098 moduleName,
9199 moduleFile,
@@ -160,12 +168,10 @@ namespace ts {
160168 const moduleSymbol = info . moduleSymbol || cachedModuleSymbol || Debug . checkDefined ( info . moduleFile
161169 ? checker . getMergedSymbol ( info . moduleFile . symbol )
162170 : checker . tryFindAmbientModule ( info . moduleName ) ) ;
163- const symbolName = exportKind === ExportKind . Default
164- ? InternalSymbolName . Default
165- : info . symbolName ;
166171 const symbol = info . symbol || cachedSymbol || Debug . checkDefined ( exportKind === ExportKind . ExportEquals
167172 ? checker . resolveExternalModuleSymbol ( moduleSymbol )
168- : checker . tryGetMemberInModuleExportsAndProperties ( symbolName , moduleSymbol ) ) ;
173+ : checker . tryGetMemberInModuleExportsAndProperties ( unescapeLeadingUnderscores ( info . symbolTableKey ) , moduleSymbol ) ,
174+ `Could not find symbol '${ info . symbolName } ' by key '${ info . symbolTableKey } ' in module ${ moduleSymbol . name } ` ) ;
169175 symbols . set ( id , [ symbol , moduleSymbol ] ) ;
170176 return {
171177 symbol,
@@ -330,30 +336,32 @@ namespace ts {
330336 const defaultInfo = getDefaultLikeExportInfo ( moduleSymbol , checker , compilerOptions ) ;
331337 // Note: I think we shouldn't actually see resolved module symbols here, but weird merges
332338 // can cause it to happen: see 'completionsImport_mergedReExport.ts'
333- if ( defaultInfo && ! checker . isUndefinedSymbol ( defaultInfo . symbol ) && ! isExternalModuleSymbol ( defaultInfo . symbol ) ) {
339+ if ( defaultInfo && isImportableSymbol ( defaultInfo . symbol , checker ) ) {
334340 cache . add (
335341 importingFile . path ,
336342 defaultInfo . symbol ,
343+ defaultInfo . exportKind === ExportKind . Default ? InternalSymbolName . Default : InternalSymbolName . ExportEquals ,
337344 moduleSymbol ,
338345 moduleFile ,
339346 defaultInfo . exportKind ,
340347 isFromPackageJson ,
341348 scriptTarget ,
342349 checker ) ;
343350 }
344- for ( const exported of checker . getExportsAndPropertiesOfModule ( moduleSymbol ) ) {
345- if ( exported !== defaultInfo ?. symbol && ! isKnownSymbol ( exported ) && ! isExternalModuleSymbol ( exported ) && addToSeen ( seenExports , exported ) ) {
351+ checker . forEachExportAndPropertyOfModule ( moduleSymbol , ( exported , key ) => {
352+ if ( exported !== defaultInfo ?. symbol && isImportableSymbol ( exported , checker ) && addToSeen ( seenExports , exported ) ) {
346353 cache . add (
347354 importingFile . path ,
348355 exported ,
356+ key ,
349357 moduleSymbol ,
350358 moduleFile ,
351359 ExportKind . Named ,
352360 isFromPackageJson ,
353361 scriptTarget ,
354362 checker ) ;
355363 }
356- }
364+ } ) ;
357365 } ) ;
358366
359367 host . log ?.( `getExportInfoMap: done in ${ timestamp ( ) - start } ms` ) ;
@@ -368,6 +376,10 @@ namespace ts {
368376 return info && { symbol, exportKind, ...info } ;
369377 }
370378
379+ function isImportableSymbol ( symbol : Symbol , checker : TypeChecker ) {
380+ return ! checker . isUndefinedSymbol ( symbol ) && ! checker . isUnknownSymbol ( symbol ) && ! isKnownSymbol ( symbol ) && ! isPrivateIdentifierSymbol ( symbol ) ;
381+ }
382+
371383 function getDefaultLikeExportWorker ( moduleSymbol : Symbol , checker : TypeChecker ) : { readonly symbol : Symbol , readonly exportKind : ExportKind } | undefined {
372384 const exportEquals = checker . resolveExternalModuleSymbol ( moduleSymbol ) ;
373385 if ( exportEquals !== moduleSymbol ) return { symbol : exportEquals , exportKind : ExportKind . ExportEquals } ;
0 commit comments