@@ -14,15 +14,22 @@ namespace ts.codefix {
1414 getAllCodeActions : context => codeFixAll ( context , errorCodes , ( changes , err ) => convertToAsyncFunction ( changes , err . file , err . start , context . program . getTypeChecker ( ) , context ) ) ,
1515 } ) ;
1616
17+ const enum SynthBindingNameKind {
18+ Identifier ,
19+ BindingPattern ,
20+ }
21+
1722 type SynthBindingName = SynthBindingPattern | SynthIdentifier ;
1823
1924 interface SynthBindingPattern {
25+ readonly kind : SynthBindingNameKind . BindingPattern ;
2026 readonly elements : ReadonlyArray < SynthBindingName > ;
2127 readonly bindingPattern : BindingPattern ;
2228 readonly types : Type [ ] ;
2329 }
2430
2531 interface SynthIdentifier {
32+ readonly kind : SynthBindingNameKind . Identifier ;
2633 readonly identifier : Identifier ;
2734 readonly types : Type [ ] ;
2835 numberOfAssignmentsOriginal : number ; // number of times the variable should be assigned in the refactor
@@ -212,7 +219,7 @@ namespace ts.codefix {
212219 else {
213220 const identifier = getSynthesizedDeepClone ( node ) ;
214221 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*/ ) ) ;
216223 if ( ( isParameter ( node . parent ) && isExpressionOrCallOnTypePromise ( node . parent . parent ) ) || isVariableDeclaration ( node . parent ) ) {
217224 allVarNames . push ( { identifier, symbol } ) ;
218225 addNameToFrequencyMap ( collidingSymbolMap , originalName , symbol ) ;
@@ -269,7 +276,7 @@ namespace ts.codefix {
269276 const numVarsSameName = ( originalNames . get ( name . text ) || emptyArray ) . length ;
270277 const numberOfAssignmentsOriginal = 0 ;
271278 const identifier = numVarsSameName === 0 ? name : createIdentifier ( name . text + "_" + numVarsSameName ) ;
272- return { identifier, types : [ ] , numberOfAssignmentsOriginal } ;
279+ return createSynthIdentifier ( identifier , [ ] , numberOfAssignmentsOriginal ) ;
273280 }
274281
275282 // dispatch function to recursively build the refactoring
@@ -321,11 +328,7 @@ namespace ts.codefix {
321328 } ) ;
322329 }
323330 else {
324- possibleNameForVarDecl = createUniqueSynthName ( {
325- identifier : createOptimisticUniqueName ( "result" ) ,
326- types : prevArgName . types ,
327- numberOfAssignmentsOriginal : 0
328- } ) ;
331+ possibleNameForVarDecl = createSynthIdentifier ( createOptimisticUniqueName ( "result" ) , prevArgName . types ) ;
329332 }
330333
331334 possibleNameForVarDecl . numberOfAssignmentsOriginal = 2 ; // Try block and catch block
@@ -372,8 +375,7 @@ namespace ts.codefix {
372375
373376 function createUniqueSynthName ( prevArgName : SynthIdentifier ) : SynthIdentifier {
374377 const renamedPrevArg = createOptimisticUniqueName ( prevArgName . identifier . text ) ;
375- const newSynthName = { identifier : renamedPrevArg , types : [ ] , numberOfAssignmentsOriginal : 0 } ;
376- return newSynthName ;
378+ return createSynthIdentifier ( renamedPrevArg ) ;
377379 }
378380
379381 function transformThen ( node : CallExpression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthBindingName ) : ReadonlyArray < Statement > {
@@ -618,19 +620,19 @@ namespace ts.codefix {
618620 return [ getMappedBindingNameOrDefault ( element . name ) ] ;
619621 } ) ;
620622
621- return { elements , bindingPattern : bindingName , types : [ ] } ;
623+ return createSynthBindingPattern ( bindingName , elements ) ;
622624 }
623625
624626 function getMapEntryOrDefault ( identifier : Identifier ) : SynthIdentifier {
625627 const originalNode = getOriginalNode ( identifier ) ;
626628 const symbol = getSymbol ( originalNode ) ;
627629
628630 if ( ! symbol ) {
629- return { identifier, types, numberOfAssignmentsOriginal } ;
631+ return createSynthIdentifier ( identifier , types , numberOfAssignmentsOriginal ) ;
630632 }
631633
632634 const mapEntry = transformer . synthNamesMap . get ( getSymbolId ( symbol ) . toString ( ) ) ;
633- return mapEntry || { identifier, types, numberOfAssignmentsOriginal } ;
635+ return mapEntry || createSynthIdentifier ( identifier , types , numberOfAssignmentsOriginal ) ;
634636 }
635637
636638 function getSymbol ( node : Node ) : Symbol | undefined {
@@ -656,11 +658,19 @@ namespace ts.codefix {
656658 return isSynthIdentifier ( bindingName ) ? bindingName . identifier : bindingName . bindingPattern ;
657659 }
658660
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+
659669 function isSynthIdentifier ( bindingName : SynthBindingName ) : bindingName is SynthIdentifier {
660- return "identifier" in bindingName ;
670+ return bindingName . kind === SynthBindingNameKind . Identifier ;
661671 }
662672
663673 function isSynthBindingPattern ( bindingName : SynthBindingName ) : bindingName is SynthBindingPattern {
664- return "elements" in bindingName ;
674+ return bindingName . kind === SynthBindingNameKind . BindingPattern ;
665675 }
666676}
0 commit comments