@@ -163,7 +163,7 @@ namespace ts.codefix {
163
163
position : number ,
164
164
preferences : UserPreferences ,
165
165
) : { 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 ( ) ) ;
167
167
Debug . assert ( exportInfos . some ( info => info . moduleSymbol === moduleSymbol ) ) ;
168
168
// We sort the best codefixes first, so taking `first` is best for completions.
169
169
const moduleSpecifier = first ( getNewImportInfos ( program , sourceFile , position , exportInfos , host , preferences ) ) . moduleSpecifier ;
@@ -175,18 +175,22 @@ namespace ts.codefix {
175
175
return { description, changes, commands } ;
176
176
}
177
177
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 > {
179
179
const result : SymbolExportInfo [ ] = [ ] ;
180
180
forEachExternalModule ( checker , allSourceFiles , ( moduleSymbol , moduleFile ) => {
181
181
// Don't import from a re-export when looking "up" like to `./index` or `../index`.
182
182
if ( moduleFile && moduleSymbol !== exportingModuleSymbol && startsWith ( sourceFile . fileName , getDirectoryPath ( moduleFile . fileName ) ) ) {
183
183
return ;
184
184
}
185
185
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
+
186
191
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 ) } ) ;
190
194
}
191
195
}
192
196
} ) ;
@@ -400,13 +404,9 @@ namespace ts.codefix {
400
404
forEachExternalModuleToImportFrom ( checker , sourceFile , program . getSourceFiles ( ) , moduleSymbol => {
401
405
cancellationToken . throwIfCancellationRequested ( ) ;
402
406
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 ) ;
410
410
}
411
411
412
412
// check exports with the same name
@@ -418,19 +418,36 @@ namespace ts.codefix {
418
418
return originalSymbolToExportInfos ;
419
419
}
420
420
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 {
422
439
const localSymbol = getLocalSymbolForExportDefault ( defaultExport ) ;
423
440
if ( localSymbol ) return { symbolForMeaning : localSymbol , name : localSymbol . name } ;
424
441
425
442
const name = getNameForExportDefault ( defaultExport ) ;
426
443
if ( name !== undefined ) return { symbolForMeaning : defaultExport , name } ;
427
444
428
445
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 ) ;
431
448
}
432
449
else {
433
- return { symbolForMeaning : defaultExport , name : moduleSymbolToValidIdentifier ( moduleSymbol , program . getCompilerOptions ( ) . target ! ) } ;
450
+ return { symbolForMeaning : defaultExport , name : moduleSymbolToValidIdentifier ( moduleSymbol , compilerOptions . target ! ) } ;
434
451
}
435
452
}
436
453
0 commit comments