@@ -53,9 +53,9 @@ namespace ts.codefix {
53
53
const flags = quotePreference === QuotePreference . Single ? NodeBuilderFlags . UseSingleQuotesForStringLiteralType : undefined ;
54
54
let typeNode = checker . typeToTypeNode ( type , enclosingDeclaration , flags , getNoopSymbolTrackerWithResolver ( context ) ) ;
55
55
if ( importAdder ) {
56
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( typeNode , type , scriptTarget ) ;
56
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
57
57
if ( importableReference ) {
58
- typeNode = importableReference . typeReference ;
58
+ typeNode = importableReference . typeNode ;
59
59
importSymbols ( importAdder , importableReference . symbols ) ;
60
60
}
61
61
}
@@ -75,9 +75,9 @@ namespace ts.codefix {
75
75
? [ allAccessors . firstAccessor , allAccessors . secondAccessor ]
76
76
: [ allAccessors . firstAccessor ] ;
77
77
if ( importAdder ) {
78
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( typeNode , type , scriptTarget ) ;
78
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
79
79
if ( importableReference ) {
80
- typeNode = importableReference . typeReference ;
80
+ typeNode = importableReference . typeNode ;
81
81
importSymbols ( importAdder , importableReference . symbols ) ;
82
82
}
83
83
}
@@ -175,21 +175,20 @@ namespace ts.codefix {
175
175
let type = signatureDeclaration . type ;
176
176
if ( importAdder ) {
177
177
if ( typeParameters ) {
178
- const newTypeParameters = sameMap ( typeParameters , ( typeParameterDecl , i ) => {
179
- const typeParameter = signature . typeParameters ! [ i ] ;
178
+ const newTypeParameters = sameMap ( typeParameters , typeParameterDecl => {
180
179
let constraint = typeParameterDecl . constraint ;
181
180
let defaultType = typeParameterDecl . default ;
182
181
if ( constraint ) {
183
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( constraint , typeParameter . constraint , scriptTarget ) ;
182
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( constraint , scriptTarget ) ;
184
183
if ( importableReference ) {
185
- constraint = importableReference . typeReference ;
184
+ constraint = importableReference . typeNode ;
186
185
importSymbols ( importAdder , importableReference . symbols ) ;
187
186
}
188
187
}
189
188
if ( defaultType ) {
190
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( defaultType , typeParameter . default , scriptTarget ) ;
189
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( defaultType , scriptTarget ) ;
191
190
if ( importableReference ) {
192
- defaultType = importableReference . typeReference ;
191
+ defaultType = importableReference . typeNode ;
193
192
importSymbols ( importAdder , importableReference . symbols ) ;
194
193
}
195
194
}
@@ -204,12 +203,11 @@ namespace ts.codefix {
204
203
typeParameters = setTextRange ( factory . createNodeArray ( newTypeParameters , typeParameters . hasTrailingComma ) , typeParameters ) ;
205
204
}
206
205
}
207
- const newParameters = sameMap ( parameters , ( parameterDecl , i ) => {
208
- const parameter = signature . parameters [ i ] ;
209
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( parameterDecl . type , checker . getTypeAtLocation ( parameter . valueDeclaration ) , scriptTarget ) ;
206
+ const newParameters = sameMap ( parameters , parameterDecl => {
207
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( parameterDecl . type , scriptTarget ) ;
210
208
let type = parameterDecl . type ;
211
209
if ( importableReference ) {
212
- type = importableReference . typeReference ;
210
+ type = importableReference . typeNode ;
213
211
importSymbols ( importAdder , importableReference . symbols ) ;
214
212
}
215
213
return factory . updateParameterDeclaration (
@@ -227,9 +225,9 @@ namespace ts.codefix {
227
225
parameters = setTextRange ( factory . createNodeArray ( newParameters , parameters . hasTrailingComma ) , parameters ) ;
228
226
}
229
227
if ( type ) {
230
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( type , signature . resolvedReturnType , scriptTarget ) ;
228
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( type , scriptTarget ) ;
231
229
if ( importableReference ) {
232
- type = importableReference . typeReference ;
230
+ type = importableReference . typeNode ;
233
231
importSymbols ( importAdder , importableReference . symbols ) ;
234
232
}
235
233
}
@@ -286,10 +284,10 @@ namespace ts.codefix {
286
284
export function typeToAutoImportableTypeNode ( checker : TypeChecker , importAdder : ImportAdder , type : Type , contextNode : Node , scriptTarget : ScriptTarget , flags ?: NodeBuilderFlags , tracker ?: SymbolTracker ) : TypeNode | undefined {
287
285
const typeNode = checker . typeToTypeNode ( type , contextNode , flags , tracker ) ;
288
286
if ( typeNode && isImportTypeNode ( typeNode ) ) {
289
- const importableReference = tryGetAutoImportableReferenceFromImportTypeNode ( typeNode , type , scriptTarget ) ;
287
+ const importableReference = tryGetAutoImportableReferenceFromTypeNode ( typeNode , scriptTarget ) ;
290
288
if ( importableReference ) {
291
289
importSymbols ( importAdder , importableReference . symbols ) ;
292
- return importableReference . typeReference ;
290
+ return importableReference . typeNode ;
293
291
}
294
292
}
295
293
return typeNode ;
@@ -454,38 +452,32 @@ namespace ts.codefix {
454
452
}
455
453
456
454
/**
457
- * Given an ImportTypeNode 'import("./a").SomeType<import("./b").OtherType<...>>',
455
+ * Given a type node containing 'import("./a").SomeType<import("./b").OtherType<...>>',
458
456
* returns an equivalent type reference node with any nested ImportTypeNodes also replaced
459
457
* with type references, and a list of symbols that must be imported to use the type reference.
460
458
*/
461
- export function tryGetAutoImportableReferenceFromImportTypeNode ( importTypeNode : TypeNode | undefined , type : Type | undefined , scriptTarget : ScriptTarget ) {
462
- if ( importTypeNode && isLiteralImportTypeNode ( importTypeNode ) && importTypeNode . qualifier && ( ! type || type . symbol ) ) {
463
- // Symbol for the left-most thing after the dot
464
- const firstIdentifier = getFirstIdentifier ( importTypeNode . qualifier ) ;
465
- const name = getNameForExportedSymbol ( firstIdentifier . symbol , scriptTarget ) ;
466
- const qualifier = name !== firstIdentifier . text
467
- ? replaceFirstIdentifierOfEntityName ( importTypeNode . qualifier , factory . createIdentifier ( name ) )
468
- : importTypeNode . qualifier ;
469
-
470
- const symbols = [ firstIdentifier . symbol ] ;
471
- const typeArguments : TypeNode [ ] = [ ] ;
472
- if ( importTypeNode . typeArguments ) {
473
- importTypeNode . typeArguments . forEach ( arg => {
474
- const ref = tryGetAutoImportableReferenceFromImportTypeNode ( arg , /*undefined*/ type , scriptTarget ) ;
475
- if ( ref ) {
476
- symbols . push ( ...ref . symbols ) ;
477
- typeArguments . push ( ref . typeReference ) ;
478
- }
479
- else {
480
- typeArguments . push ( arg ) ;
481
- }
482
- } ) ;
483
- }
459
+ export function tryGetAutoImportableReferenceFromTypeNode ( importTypeNode : TypeNode | undefined , scriptTarget : ScriptTarget ) {
460
+ let symbols : Symbol [ ] | undefined ;
461
+ const typeNode = visitNode ( importTypeNode , visit ) ;
462
+ if ( symbols && typeNode ) {
463
+ return { typeNode, symbols } ;
464
+ }
484
465
485
- return {
486
- symbols,
487
- typeReference : factory . createTypeReferenceNode ( qualifier , typeArguments )
488
- } ;
466
+ function visit ( node : TypeNode ) : TypeNode ;
467
+ function visit ( node : Node ) : Node {
468
+ if ( isLiteralImportTypeNode ( node ) && node . qualifier ) {
469
+ // Symbol for the left-most thing after the dot
470
+ const firstIdentifier = getFirstIdentifier ( node . qualifier ) ;
471
+ const name = getNameForExportedSymbol ( firstIdentifier . symbol , scriptTarget ) ;
472
+ const qualifier = name !== firstIdentifier . text
473
+ ? replaceFirstIdentifierOfEntityName ( node . qualifier , factory . createIdentifier ( name ) )
474
+ : node . qualifier ;
475
+
476
+ symbols = append ( symbols , firstIdentifier . symbol ) ;
477
+ const typeArguments = node . typeArguments ?. map ( visit ) ;
478
+ return factory . createTypeReferenceNode ( qualifier , typeArguments ) ;
479
+ }
480
+ return visitEachChild ( node , visit , nullTransformationContext ) ;
489
481
}
490
482
}
491
483
0 commit comments