@@ -163,7 +163,7 @@ namespace ts.codefix {
163163 position : number ,
164164 preferences : UserPreferences ,
165165 ) : { readonly moduleSpecifier : string , readonly codeAction : CodeAction } {
166- const exportInfos = getAllReExportingModules ( exportedSymbol , moduleSymbol , symbolName , sourceFile , program . getTypeChecker ( ) , program . getSourceFiles ( ) ) ;
166+ const exportInfos = getAllReExportingModules ( exportedSymbol , moduleSymbol , symbolName , sourceFile , program . getCompilerOptions ( ) , program . getTypeChecker ( ) , program . getSourceFiles ( ) ) ;
167167 Debug . assert ( exportInfos . some ( info => info . moduleSymbol === moduleSymbol ) ) ;
168168 // We sort the best codefixes first, so taking `first` is best for completions.
169169 const moduleSpecifier = first ( getNewImportInfos ( program , sourceFile , position , exportInfos , host , preferences ) ) . moduleSpecifier ;
@@ -175,18 +175,22 @@ namespace ts.codefix {
175175 return { description, changes, commands } ;
176176 }
177177
178- function getAllReExportingModules ( exportedSymbol : Symbol , exportingModuleSymbol : Symbol , symbolName : string , sourceFile : SourceFile , checker : TypeChecker , allSourceFiles : ReadonlyArray < SourceFile > ) : ReadonlyArray < SymbolExportInfo > {
178+ function getAllReExportingModules ( exportedSymbol : Symbol , exportingModuleSymbol : Symbol , symbolName : string , sourceFile : SourceFile , compilerOptions : CompilerOptions , checker : TypeChecker , allSourceFiles : ReadonlyArray < SourceFile > ) : ReadonlyArray < SymbolExportInfo > {
179179 const result : SymbolExportInfo [ ] = [ ] ;
180180 forEachExternalModule ( checker , allSourceFiles , ( moduleSymbol , moduleFile ) => {
181181 // Don't import from a re-export when looking "up" like to `./index` or `../index`.
182182 if ( moduleFile && moduleSymbol !== exportingModuleSymbol && startsWith ( sourceFile . fileName , getDirectoryPath ( moduleFile . fileName ) ) ) {
183183 return ;
184184 }
185185
186+ const defaultInfo = getDefaultLikeExportInfo ( moduleSymbol , checker , compilerOptions ) ;
187+ if ( defaultInfo && defaultInfo . name === symbolName && skipAlias ( defaultInfo . symbol , checker ) === exportedSymbol ) {
188+ result . push ( { moduleSymbol, importKind : defaultInfo . kind , exportedSymbolIsTypeOnly : isTypeOnlySymbol ( defaultInfo . symbol ) } ) ;
189+ }
190+
186191 for ( const exported of checker . getExportsOfModule ( moduleSymbol ) ) {
187- if ( ( exported . escapedName === InternalSymbolName . Default || exported . name === symbolName ) && skipAlias ( exported , checker ) === exportedSymbol ) {
188- const isDefaultExport = checker . tryGetMemberInModuleExports ( InternalSymbolName . Default , moduleSymbol ) === exported ;
189- result . push ( { moduleSymbol, importKind : isDefaultExport ? ImportKind . Default : ImportKind . Named , exportedSymbolIsTypeOnly : isTypeOnlySymbol ( exported ) } ) ;
192+ if ( exported . name === symbolName && skipAlias ( exported , checker ) === exportedSymbol ) {
193+ result . push ( { moduleSymbol, importKind : ImportKind . Named , exportedSymbolIsTypeOnly : isTypeOnlySymbol ( exported ) } ) ;
190194 }
191195 }
192196 } ) ;
@@ -400,13 +404,9 @@ namespace ts.codefix {
400404 forEachExternalModuleToImportFrom ( checker , sourceFile , program . getSourceFiles ( ) , moduleSymbol => {
401405 cancellationToken . throwIfCancellationRequested ( ) ;
402406
403- // check the default export
404- const defaultExport = checker . tryGetMemberInModuleExports ( InternalSymbolName . Default , moduleSymbol ) ;
405- if ( defaultExport ) {
406- const info = getDefaultExportInfo ( defaultExport , moduleSymbol , program ) ;
407- if ( info && info . name === symbolName && symbolHasMeaning ( info . symbolForMeaning , currentTokenMeaning ) ) {
408- addSymbol ( moduleSymbol , defaultExport , ImportKind . Default ) ;
409- }
407+ const defaultInfo = getDefaultLikeExportInfo ( moduleSymbol , checker , program . getCompilerOptions ( ) ) ;
408+ if ( defaultInfo && defaultInfo . name === symbolName && symbolHasMeaning ( defaultInfo . symbolForMeaning , currentTokenMeaning ) ) {
409+ addSymbol ( moduleSymbol , defaultInfo . symbol , defaultInfo . kind ) ;
410410 }
411411
412412 // check exports with the same name
@@ -418,19 +418,36 @@ namespace ts.codefix {
418418 return originalSymbolToExportInfos ;
419419 }
420420
421- function getDefaultExportInfo ( defaultExport : Symbol , moduleSymbol : Symbol , program : Program ) : { readonly symbolForMeaning : Symbol , readonly name : string } | undefined {
421+ function getDefaultLikeExportInfo (
422+ moduleSymbol : Symbol , checker : TypeChecker , compilerOptions : CompilerOptions ,
423+ ) : { readonly symbol : Symbol , readonly symbolForMeaning : Symbol , readonly name : string , readonly kind : ImportKind . Default | ImportKind . Equals } | undefined {
424+ const exported = getDefaultLikeExportWorker ( moduleSymbol , checker ) ;
425+ if ( ! exported ) return undefined ;
426+ const { symbol, kind } = exported ;
427+ const info = getDefaultExportInfoWorker ( symbol , moduleSymbol , checker , compilerOptions ) ;
428+ return info && { symbol, symbolForMeaning : info . symbolForMeaning , name : info . name , kind } ;
429+ }
430+
431+ function getDefaultLikeExportWorker ( moduleSymbol : Symbol , checker : TypeChecker ) : { readonly symbol : Symbol , readonly kind : ImportKind . Default | ImportKind . Equals } | undefined {
432+ const defaultExport = checker . tryGetMemberInModuleExports ( InternalSymbolName . Default , moduleSymbol ) ;
433+ if ( defaultExport ) return { symbol : defaultExport , kind : ImportKind . Default } ;
434+ const exportEquals = checker . resolveExternalModuleSymbol ( moduleSymbol ) ;
435+ return exportEquals === moduleSymbol ? undefined : { symbol : exportEquals , kind : ImportKind . Equals } ;
436+ }
437+
438+ function getDefaultExportInfoWorker ( defaultExport : Symbol , moduleSymbol : Symbol , checker : TypeChecker , compilerOptions : CompilerOptions ) : { readonly symbolForMeaning : Symbol , readonly name : string } | undefined {
422439 const localSymbol = getLocalSymbolForExportDefault ( defaultExport ) ;
423440 if ( localSymbol ) return { symbolForMeaning : localSymbol , name : localSymbol . name } ;
424441
425442 const name = getNameForExportDefault ( defaultExport ) ;
426443 if ( name !== undefined ) return { symbolForMeaning : defaultExport , name } ;
427444
428445 if ( defaultExport . flags & SymbolFlags . Alias ) {
429- const aliased = program . getTypeChecker ( ) . getImmediateAliasedSymbol ( defaultExport ) ;
430- return aliased && getDefaultExportInfo ( aliased , Debug . assertDefined ( aliased . parent ) , program ) ;
446+ const aliased = checker . getImmediateAliasedSymbol ( defaultExport ) ;
447+ return aliased && getDefaultExportInfoWorker ( aliased , Debug . assertDefined ( aliased . parent ) , checker , compilerOptions ) ;
431448 }
432449 else {
433- return { symbolForMeaning : defaultExport , name : moduleSymbolToValidIdentifier ( moduleSymbol , program . getCompilerOptions ( ) . target ! ) } ;
450+ return { symbolForMeaning : defaultExport , name : moduleSymbolToValidIdentifier ( moduleSymbol , compilerOptions . target ! ) } ;
434451 }
435452 }
436453
0 commit comments