@@ -29,6 +29,7 @@ namespace ts {
2929 // Used to rehydrate `symbol` and `moduleSymbol` when transient
3030 id : number ;
3131 symbolName : string ;
32+ capitalizedSymbolName : string | undefined ;
3233 symbolTableKey : __String ;
3334 moduleName : string ;
3435 moduleFile : SourceFile | undefined ;
@@ -48,7 +49,7 @@ namespace ts {
4849 clear ( ) : void ;
4950 add ( importingFile : Path , symbol : Symbol , key : __String , moduleSymbol : Symbol , moduleFile : SourceFile | undefined , exportKind : ExportKind , isFromPackageJson : boolean , checker : TypeChecker ) : void ;
5051 get ( importingFile : Path , key : string ) : readonly SymbolExportInfo [ ] | undefined ;
51- forEach ( importingFile : Path , action : ( info : readonly SymbolExportInfo [ ] , getSymbolName : ( preferCapitalized ?: boolean ) => string , isFromAmbientModule : boolean , key : string ) => void ) : void ;
52+ search ( importingFile : Path , preferCapitalized : boolean , matches : ( name : string , targetFlags : SymbolFlags ) => boolean , action : ( info : readonly SymbolExportInfo [ ] , symbolName : string , isFromAmbientModule : boolean , key : string ) => void ) : void ;
5253 releaseSymbols ( ) : void ;
5354 isEmpty ( ) : boolean ;
5455 /** @returns Whether the change resulted in the cache being cleared */
@@ -121,9 +122,12 @@ namespace ts {
121122 // 3. Otherwise, we have a default/namespace import that can be imported by any name, and
122123 // `symbolTableKey` will be something undesirable like `export=` or `default`, so we try to
123124 // get a better name.
124- const importedName = exportKind === ExportKind . Named || isExternalModuleSymbol ( namedSymbol )
125+ const names = exportKind === ExportKind . Named || isExternalModuleSymbol ( namedSymbol )
125126 ? unescapeLeadingUnderscores ( symbolTableKey )
126- : getNameForExportedSymbol ( namedSymbol , /*scriptTarget*/ undefined ) ;
127+ : getNamesForExportedSymbol ( namedSymbol , /*scriptTarget*/ undefined ) ;
128+
129+ const symbolName = typeof names === "string" ? names : names [ 0 ] ;
130+ const capitalizedSymbolName = typeof names === "string" ? undefined : names [ 1 ] ;
127131
128132 const moduleName = stripQuotes ( moduleSymbol . name ) ;
129133 const id = exportInfoId ++ ;
@@ -132,10 +136,11 @@ namespace ts {
132136 const storedModuleSymbol = moduleSymbol . flags & SymbolFlags . Transient ? undefined : moduleSymbol ;
133137 if ( ! storedSymbol || ! storedModuleSymbol ) symbols . set ( id , [ symbol , moduleSymbol ] ) ;
134138
135- exportInfo . add ( key ( importedName , symbol , isExternalModuleNameRelative ( moduleName ) ? undefined : moduleName , checker ) , {
139+ exportInfo . add ( key ( symbolName , symbol , isExternalModuleNameRelative ( moduleName ) ? undefined : moduleName , checker ) , {
136140 id,
137141 symbolTableKey,
138- symbolName : importedName ,
142+ symbolName,
143+ capitalizedSymbolName,
139144 moduleName,
140145 moduleFile,
141146 moduleFileName : moduleFile ?. fileName ,
@@ -152,24 +157,17 @@ namespace ts {
152157 const result = exportInfo . get ( key ) ;
153158 return result ?. map ( rehydrateCachedInfo ) ;
154159 } ,
155- forEach : ( importingFile , action ) => {
160+ search : ( importingFile , preferCapitalized , matches , action ) => {
156161 if ( importingFile !== usableByFileName ) return ;
157162 exportInfo . forEach ( ( info , key ) => {
158163 const { symbolName, ambientModuleName } = parseKey ( key ) ;
159- const rehydrated = info . map ( rehydrateCachedInfo ) ;
160- const filtered = rehydrated . filter ( ( r , i ) => isNotShadowedByDeeperNodeModulesPackage ( r , info [ i ] . packageName ) ) ;
161- if ( filtered . length ) {
162- action (
163- filtered ,
164- preferCapitalized => {
165- const { symbol, exportKind } = rehydrated [ 0 ] ;
166- const namedSymbol = exportKind === ExportKind . Default && getLocalSymbolForExportDefault ( symbol ) || symbol ;
167- return preferCapitalized
168- ? getNameForExportedSymbol ( namedSymbol , /*scriptTarget*/ undefined , /*preferCapitalized*/ true )
169- : symbolName ;
170- } ,
171- ! ! ambientModuleName ,
172- key ) ;
164+ const name = preferCapitalized && info [ 0 ] . capitalizedSymbolName || symbolName ;
165+ if ( matches ( name , info [ 0 ] . targetFlags ) ) {
166+ const rehydrated = info . map ( rehydrateCachedInfo ) ;
167+ const filtered = rehydrated . filter ( ( r , i ) => isNotShadowedByDeeperNodeModulesPackage ( r , info [ i ] . packageName ) ) ;
168+ if ( filtered . length ) {
169+ action ( filtered , name , ! ! ambientModuleName , key ) ;
170+ }
173171 }
174172 } ) ;
175173 } ,
0 commit comments