@@ -29,6 +29,7 @@ namespace ts {
29
29
// Used to rehydrate `symbol` and `moduleSymbol` when transient
30
30
id : number ;
31
31
symbolName : string ;
32
+ symbolTableKey : __String ;
32
33
moduleName : string ;
33
34
moduleFile : SourceFile | undefined ;
34
35
@@ -44,7 +45,7 @@ namespace ts {
44
45
export interface ExportInfoMap {
45
46
isUsableByFile ( importingFile : Path ) : boolean ;
46
47
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 ;
48
49
get ( importingFile : Path , importedName : string , symbol : Symbol , moduleName : string , checker : TypeChecker ) : readonly SymbolExportInfo [ ] | undefined ;
49
50
forEach ( importingFile : Path , action : ( info : readonly SymbolExportInfo [ ] , name : string , isFromAmbientModule : boolean ) => void ) : void ;
50
51
releaseSymbols ( ) : void ;
@@ -71,13 +72,19 @@ namespace ts {
71
72
symbols . clear ( ) ;
72
73
usableByFileName = undefined ;
73
74
} ,
74
- add : ( importingFile , symbol , moduleSymbol , moduleFile , exportKind , isFromPackageJson , scriptTarget , checker ) => {
75
+ add : ( importingFile , symbol , symbolTableKey , moduleSymbol , moduleFile , exportKind , isFromPackageJson , scriptTarget , checker ) => {
75
76
if ( importingFile !== usableByFileName ) {
76
77
cache . clear ( ) ;
77
78
usableByFileName = importingFile ;
78
79
}
79
80
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 ) ;
81
88
const moduleName = stripQuotes ( moduleSymbol . name ) ;
82
89
const id = exportInfoId ++ ;
83
90
const storedSymbol = symbol . flags & SymbolFlags . Transient ? undefined : symbol ;
@@ -86,6 +93,7 @@ namespace ts {
86
93
87
94
exportInfo . add ( key ( importedName , symbol , moduleName , checker ) , {
88
95
id,
96
+ symbolTableKey,
89
97
symbolName : importedName ,
90
98
moduleName,
91
99
moduleFile,
@@ -160,12 +168,10 @@ namespace ts {
160
168
const moduleSymbol = info . moduleSymbol || cachedModuleSymbol || Debug . checkDefined ( info . moduleFile
161
169
? checker . getMergedSymbol ( info . moduleFile . symbol )
162
170
: checker . tryFindAmbientModule ( info . moduleName ) ) ;
163
- const symbolName = exportKind === ExportKind . Default
164
- ? InternalSymbolName . Default
165
- : info . symbolName ;
166
171
const symbol = info . symbol || cachedSymbol || Debug . checkDefined ( exportKind === ExportKind . ExportEquals
167
172
? 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 } ` ) ;
169
175
symbols . set ( id , [ symbol , moduleSymbol ] ) ;
170
176
return {
171
177
symbol,
@@ -330,30 +336,32 @@ namespace ts {
330
336
const defaultInfo = getDefaultLikeExportInfo ( moduleSymbol , checker , compilerOptions ) ;
331
337
// Note: I think we shouldn't actually see resolved module symbols here, but weird merges
332
338
// 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 ) ) {
334
340
cache . add (
335
341
importingFile . path ,
336
342
defaultInfo . symbol ,
343
+ defaultInfo . exportKind === ExportKind . Default ? InternalSymbolName . Default : InternalSymbolName . ExportEquals ,
337
344
moduleSymbol ,
338
345
moduleFile ,
339
346
defaultInfo . exportKind ,
340
347
isFromPackageJson ,
341
348
scriptTarget ,
342
349
checker ) ;
343
350
}
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 ) ) {
346
353
cache . add (
347
354
importingFile . path ,
348
355
exported ,
356
+ key ,
349
357
moduleSymbol ,
350
358
moduleFile ,
351
359
ExportKind . Named ,
352
360
isFromPackageJson ,
353
361
scriptTarget ,
354
362
checker ) ;
355
363
}
356
- }
364
+ } ) ;
357
365
} ) ;
358
366
359
367
host . log ?.( `getExportInfoMap: done in ${ timestamp ( ) - start } ms` ) ;
@@ -368,6 +376,10 @@ namespace ts {
368
376
return info && { symbol, exportKind, ...info } ;
369
377
}
370
378
379
+ function isImportableSymbol ( symbol : Symbol , checker : TypeChecker ) {
380
+ return ! checker . isUndefinedSymbol ( symbol ) && ! checker . isUnknownSymbol ( symbol ) && ! isKnownSymbol ( symbol ) && ! isPrivateIdentifierSymbol ( symbol ) ;
381
+ }
382
+
371
383
function getDefaultLikeExportWorker ( moduleSymbol : Symbol , checker : TypeChecker ) : { readonly symbol : Symbol , readonly exportKind : ExportKind } | undefined {
372
384
const exportEquals = checker . resolveExternalModuleSymbol ( moduleSymbol ) ;
373
385
if ( exportEquals !== moduleSymbol ) return { symbol : exportEquals , exportKind : ExportKind . ExportEquals } ;
0 commit comments