@@ -14,15 +14,22 @@ namespace ts.codefix {
14
14
getAllCodeActions : context => codeFixAll ( context , errorCodes , ( changes , err ) => convertToAsyncFunction ( changes , err . file , err . start , context . program . getTypeChecker ( ) , context ) ) ,
15
15
} ) ;
16
16
17
+ const enum SynthBindingNameKind {
18
+ Identifier ,
19
+ BindingPattern ,
20
+ }
21
+
17
22
type SynthBindingName = SynthBindingPattern | SynthIdentifier ;
18
23
19
24
interface SynthBindingPattern {
25
+ readonly kind : SynthBindingNameKind . BindingPattern ;
20
26
readonly elements : ReadonlyArray < SynthBindingName > ;
21
27
readonly bindingPattern : BindingPattern ;
22
28
readonly types : Type [ ] ;
23
29
}
24
30
25
31
interface SynthIdentifier {
32
+ readonly kind : SynthBindingNameKind . Identifier ;
26
33
readonly identifier : Identifier ;
27
34
readonly types : Type [ ] ;
28
35
numberOfAssignmentsOriginal : number ; // number of times the variable should be assigned in the refactor
@@ -212,7 +219,7 @@ namespace ts.codefix {
212
219
else {
213
220
const identifier = getSynthesizedDeepClone ( node ) ;
214
221
identsToRenameMap . set ( symbolIdString , identifier ) ;
215
- synthNamesMap . set ( symbolIdString , { identifier, types : [ ] , numberOfAssignmentsOriginal : allVarNames . filter ( elem => elem . identifier . text === node . text ) . length /*, numberOfAssignmentsSynthesized: 0*/ } ) ;
222
+ synthNamesMap . set ( symbolIdString , createSynthIdentifier ( identifier , [ ] , allVarNames . filter ( elem => elem . identifier . text === node . text ) . length /*, numberOfAssignmentsSynthesized: 0*/ ) ) ;
216
223
if ( ( isParameter ( node . parent ) && isExpressionOrCallOnTypePromise ( node . parent . parent ) ) || isVariableDeclaration ( node . parent ) ) {
217
224
allVarNames . push ( { identifier, symbol } ) ;
218
225
addNameToFrequencyMap ( collidingSymbolMap , originalName , symbol ) ;
@@ -269,7 +276,7 @@ namespace ts.codefix {
269
276
const numVarsSameName = ( originalNames . get ( name . text ) || emptyArray ) . length ;
270
277
const numberOfAssignmentsOriginal = 0 ;
271
278
const identifier = numVarsSameName === 0 ? name : createIdentifier ( name . text + "_" + numVarsSameName ) ;
272
- return { identifier, types : [ ] , numberOfAssignmentsOriginal } ;
279
+ return createSynthIdentifier ( identifier , [ ] , numberOfAssignmentsOriginal ) ;
273
280
}
274
281
275
282
// dispatch function to recursively build the refactoring
@@ -321,11 +328,7 @@ namespace ts.codefix {
321
328
} ) ;
322
329
}
323
330
else {
324
- possibleNameForVarDecl = createUniqueSynthName ( {
325
- identifier : createOptimisticUniqueName ( "result" ) ,
326
- types : prevArgName . types ,
327
- numberOfAssignmentsOriginal : 0
328
- } ) ;
331
+ possibleNameForVarDecl = createSynthIdentifier ( createOptimisticUniqueName ( "result" ) , prevArgName . types ) ;
329
332
}
330
333
331
334
possibleNameForVarDecl . numberOfAssignmentsOriginal = 2 ; // Try block and catch block
@@ -372,8 +375,7 @@ namespace ts.codefix {
372
375
373
376
function createUniqueSynthName ( prevArgName : SynthIdentifier ) : SynthIdentifier {
374
377
const renamedPrevArg = createOptimisticUniqueName ( prevArgName . identifier . text ) ;
375
- const newSynthName = { identifier : renamedPrevArg , types : [ ] , numberOfAssignmentsOriginal : 0 } ;
376
- return newSynthName ;
378
+ return createSynthIdentifier ( renamedPrevArg ) ;
377
379
}
378
380
379
381
function transformThen ( node : CallExpression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthBindingName ) : ReadonlyArray < Statement > {
@@ -618,19 +620,19 @@ namespace ts.codefix {
618
620
return [ getMappedBindingNameOrDefault ( element . name ) ] ;
619
621
} ) ;
620
622
621
- return { elements , bindingPattern : bindingName , types : [ ] } ;
623
+ return createSynthBindingPattern ( bindingName , elements ) ;
622
624
}
623
625
624
626
function getMapEntryOrDefault ( identifier : Identifier ) : SynthIdentifier {
625
627
const originalNode = getOriginalNode ( identifier ) ;
626
628
const symbol = getSymbol ( originalNode ) ;
627
629
628
630
if ( ! symbol ) {
629
- return { identifier, types, numberOfAssignmentsOriginal } ;
631
+ return createSynthIdentifier ( identifier , types , numberOfAssignmentsOriginal ) ;
630
632
}
631
633
632
634
const mapEntry = transformer . synthNamesMap . get ( getSymbolId ( symbol ) . toString ( ) ) ;
633
- return mapEntry || { identifier, types, numberOfAssignmentsOriginal } ;
635
+ return mapEntry || createSynthIdentifier ( identifier , types , numberOfAssignmentsOriginal ) ;
634
636
}
635
637
636
638
function getSymbol ( node : Node ) : Symbol | undefined {
@@ -656,11 +658,19 @@ namespace ts.codefix {
656
658
return isSynthIdentifier ( bindingName ) ? bindingName . identifier : bindingName . bindingPattern ;
657
659
}
658
660
661
+ function createSynthIdentifier ( identifier : Identifier , types : Type [ ] = [ ] , numberOfAssignmentsOriginal = 0 ) : SynthIdentifier {
662
+ return { kind : SynthBindingNameKind . Identifier , identifier, types, numberOfAssignmentsOriginal } ;
663
+ }
664
+
665
+ function createSynthBindingPattern ( bindingPattern : BindingPattern , elements : ReadonlyArray < SynthBindingName > = emptyArray , types : Type [ ] = [ ] ) : SynthBindingPattern {
666
+ return { kind : SynthBindingNameKind . BindingPattern , bindingPattern, elements, types } ;
667
+ }
668
+
659
669
function isSynthIdentifier ( bindingName : SynthBindingName ) : bindingName is SynthIdentifier {
660
- return "identifier" in bindingName ;
670
+ return bindingName . kind === SynthBindingNameKind . Identifier ;
661
671
}
662
672
663
673
function isSynthBindingPattern ( bindingName : SynthBindingName ) : bindingName is SynthBindingPattern {
664
- return "elements" in bindingName ;
674
+ return bindingName . kind === SynthBindingNameKind . BindingPattern ;
665
675
}
666
676
}
0 commit comments