@@ -15,24 +15,24 @@ namespace ts.codefix {
15
15
} ) ;
16
16
17
17
interface SynthIdentifier {
18
- identifier : Identifier ;
19
- types : Type [ ] ;
18
+ readonly identifier : Identifier ;
19
+ readonly types : Type [ ] ;
20
20
numberOfAssignmentsOriginal : number ; // number of times the variable should be assigned in the refactor
21
21
}
22
22
23
23
interface SymbolAndIdentifier {
24
- identifier : Identifier ;
25
- symbol : Symbol ;
24
+ readonly identifier : Identifier ;
25
+ readonly symbol : Symbol ;
26
26
}
27
27
28
28
interface Transformer {
29
- checker : TypeChecker ;
30
- synthNamesMap : Map < SynthIdentifier > ; // keys are the symbol id of the identifier
31
- allVarNames : SymbolAndIdentifier [ ] ;
32
- setOfExpressionsToReturn : Map < true > ; // keys are the node ids of the expressions
33
- constIdentifiers : Identifier [ ] ;
34
- originalTypeMap : Map < Type > ; // keys are the node id of the identifier
35
- isInJSFile : boolean ;
29
+ readonly checker : TypeChecker ;
30
+ readonly synthNamesMap : Map < SynthIdentifier > ; // keys are the symbol id of the identifier
31
+ readonly allVarNames : ReadonlyArray < SymbolAndIdentifier > ;
32
+ readonly setOfExpressionsToReturn : ReadonlyMap < true > ; // keys are the node ids of the expressions
33
+ readonly constIdentifiers : Identifier [ ] ;
34
+ readonly originalTypeMap : ReadonlyMap < Type > ; // keys are the node id of the identifier
35
+ readonly isInJSFile : boolean ;
36
36
}
37
37
38
38
function convertToAsyncFunction ( changes : textChanges . ChangeTracker , sourceFile : SourceFile , position : number , checker : TypeChecker , context : CodeFixContextBase ) : void {
@@ -61,7 +61,7 @@ namespace ts.codefix {
61
61
const functionToConvertRenamed : FunctionLikeDeclaration = renameCollidingVarNames ( functionToConvert , checker , synthNamesMap , context , setOfExpressionsToReturn , originalTypeMap , allVarNames ) ;
62
62
const constIdentifiers = getConstIdentifiers ( synthNamesMap ) ;
63
63
const returnStatements = getReturnStatementsWithPromiseHandlers ( functionToConvertRenamed ) ;
64
- const transformer = { checker, synthNamesMap, allVarNames, setOfExpressionsToReturn, constIdentifiers, originalTypeMap, isInJSFile : isInJavascript } ;
64
+ const transformer : Transformer = { checker, synthNamesMap, allVarNames, setOfExpressionsToReturn, constIdentifiers, originalTypeMap, isInJSFile : isInJavascript } ;
65
65
66
66
if ( ! returnStatements . length ) {
67
67
return ;
@@ -88,7 +88,7 @@ namespace ts.codefix {
88
88
}
89
89
90
90
// Returns the identifiers that are never reassigned in the refactor
91
- function getConstIdentifiers ( synthNamesMap : Map < SynthIdentifier > ) : Identifier [ ] {
91
+ function getConstIdentifiers ( synthNamesMap : ReadonlyMap < SynthIdentifier > ) : Identifier [ ] {
92
92
const constIdentifiers : Identifier [ ] = [ ] ;
93
93
synthNamesMap . forEach ( ( val ) => {
94
94
if ( val . numberOfAssignmentsOriginal === 0 ) {
@@ -249,18 +249,18 @@ namespace ts.codefix {
249
249
}
250
250
}
251
251
252
- function getNewNameIfConflict ( name : Identifier , originalNames : Map < Symbol [ ] > ) : SynthIdentifier {
253
- const numVarsSameName = ( originalNames . get ( name . text ) || [ ] ) . length ;
252
+ function getNewNameIfConflict ( name : Identifier , originalNames : ReadonlyMap < Symbol [ ] > ) : SynthIdentifier {
253
+ const numVarsSameName = ( originalNames . get ( name . text ) || emptyArray ) . length ;
254
254
const numberOfAssignmentsOriginal = 0 ;
255
255
const identifier = numVarsSameName === 0 ? name : createIdentifier ( name . text + "_" + numVarsSameName ) ;
256
256
return { identifier, types : [ ] , numberOfAssignmentsOriginal } ;
257
257
}
258
258
259
259
// dispatch function to recursively build the refactoring
260
260
// should be kept up to date with isFixablePromiseHandler in suggestionDiagnostics.ts
261
- function transformExpression ( node : Expression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthIdentifier ) : Statement [ ] {
261
+ function transformExpression ( node : Expression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthIdentifier ) : ReadonlyArray < Statement > {
262
262
if ( ! node ) {
263
- return [ ] ;
263
+ return emptyArray ;
264
264
}
265
265
266
266
const originalType = isIdentifier ( node ) && transformer . originalTypeMap . get ( getNodeId ( node ) . toString ( ) ) ;
@@ -280,10 +280,10 @@ namespace ts.codefix {
280
280
}
281
281
282
282
codeActionSucceeded = false ;
283
- return [ ] ;
283
+ return emptyArray ;
284
284
}
285
285
286
- function transformCatch ( node : CallExpression , transformer : Transformer , prevArgName ?: SynthIdentifier ) : Statement [ ] {
286
+ function transformCatch ( node : CallExpression , transformer : Transformer , prevArgName ?: SynthIdentifier ) : ReadonlyArray < Statement > {
287
287
const func = node . arguments [ 0 ] ;
288
288
const argName = getArgName ( func , transformer ) ;
289
289
const shouldReturn = transformer . setOfExpressionsToReturn . get ( getNodeId ( node ) . toString ( ) ) ;
@@ -336,7 +336,7 @@ namespace ts.codefix {
336
336
return newSynthName ;
337
337
}
338
338
339
- function transformThen ( node : CallExpression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthIdentifier ) : Statement [ ] {
339
+ function transformThen ( node : CallExpression , transformer : Transformer , outermostParent : CallExpression , prevArgName ?: SynthIdentifier ) : ReadonlyArray < Statement > {
340
340
const [ res , rej ] = node . arguments ;
341
341
342
342
if ( ! res ) {
@@ -356,23 +356,23 @@ namespace ts.codefix {
356
356
const catchArg = argNameRej ? argNameRej . identifier . text : "e" ;
357
357
const catchClause = createCatchClause ( catchArg , createBlock ( transformationBody2 ) ) ;
358
358
359
- return [ createTry ( tryBlock , catchClause , /* finallyBlock */ undefined ) as Statement ] ;
359
+ return [ createTry ( tryBlock , catchClause , /* finallyBlock */ undefined ) ] ;
360
360
}
361
361
362
362
return transformExpression ( node . expression , transformer , node , argNameRes ) . concat ( transformationBody ) ;
363
363
}
364
364
365
- function getFlagOfIdentifier ( node : Identifier , constIdentifiers : Identifier [ ] ) : NodeFlags {
365
+ function getFlagOfIdentifier ( node : Identifier , constIdentifiers : ReadonlyArray < Identifier > ) : NodeFlags {
366
366
const inArr : boolean = constIdentifiers . some ( elem => elem . text === node . text ) ;
367
367
return inArr ? NodeFlags . Const : NodeFlags . Let ;
368
368
}
369
369
370
- function transformPromiseCall ( node : Expression , transformer : Transformer , prevArgName ?: SynthIdentifier ) : Statement [ ] {
370
+ function transformPromiseCall ( node : Expression , transformer : Transformer , prevArgName ?: SynthIdentifier ) : ReadonlyArray < Statement > {
371
371
const shouldReturn = transformer . setOfExpressionsToReturn . get ( getNodeId ( node ) . toString ( ) ) ;
372
372
// the identifier is empty when the handler (.then()) ignores the argument - In this situation we do not need to save the result of the promise returning call
373
373
const originalNodeParent = node . original ? node . original . parent : node . parent ;
374
374
if ( prevArgName && ! shouldReturn && ( ! originalNodeParent || isPropertyAccessExpression ( originalNodeParent ) ) ) {
375
- return createTransformedStatement ( prevArgName , createAwait ( node ) , transformer ) . concat ( ) ; // hack to make the types match
375
+ return createTransformedStatement ( prevArgName , createAwait ( node ) , transformer ) ;
376
376
}
377
377
else if ( ! prevArgName && ! shouldReturn && ( ! originalNodeParent || isPropertyAccessExpression ( originalNodeParent ) ) ) {
378
378
return [ createStatement ( createAwait ( node ) ) ] ;
@@ -381,23 +381,23 @@ namespace ts.codefix {
381
381
return [ createReturn ( getSynthesizedDeepClone ( node ) ) ] ;
382
382
}
383
383
384
- function createTransformedStatement ( prevArgName : SynthIdentifier | undefined , rightHandSide : Expression , transformer : Transformer ) : NodeArray < Statement > {
384
+ function createTransformedStatement ( prevArgName : SynthIdentifier | undefined , rightHandSide : Expression , transformer : Transformer ) : ReadonlyArray < Statement > {
385
385
if ( ! prevArgName || prevArgName . identifier . text . length === 0 ) {
386
386
// if there's no argName to assign to, there still might be side effects
387
- return createNodeArray ( [ createStatement ( rightHandSide ) ] ) ;
387
+ return [ createStatement ( rightHandSide ) ] ;
388
388
}
389
389
390
390
if ( prevArgName . types . length < prevArgName . numberOfAssignmentsOriginal ) {
391
391
// if the variable has already been declared, we don't need "let" or "const"
392
- return createNodeArray ( [ createStatement ( createAssignment ( getSynthesizedDeepClone ( prevArgName . identifier ) , rightHandSide ) ) ] ) ;
392
+ return [ createStatement ( createAssignment ( getSynthesizedDeepClone ( prevArgName . identifier ) , rightHandSide ) ) ] ;
393
393
}
394
394
395
- return createNodeArray ( [ createVariableStatement ( /*modifiers*/ undefined ,
396
- ( createVariableDeclarationList ( [ createVariableDeclaration ( getSynthesizedDeepClone ( prevArgName . identifier ) , /*type*/ undefined , rightHandSide ) ] , getFlagOfIdentifier ( prevArgName . identifier , transformer . constIdentifiers ) ) ) ) ] ) ;
395
+ return [ createVariableStatement ( /*modifiers*/ undefined ,
396
+ ( createVariableDeclarationList ( [ createVariableDeclaration ( getSynthesizedDeepClone ( prevArgName . identifier ) , /*type*/ undefined , rightHandSide ) ] , getFlagOfIdentifier ( prevArgName . identifier , transformer . constIdentifiers ) ) ) ) ] ;
397
397
}
398
398
399
399
// should be kept up to date with isFixablePromiseArgument in suggestionDiagnostics.ts
400
- function getTransformationBody ( func : Expression , prevArgName : SynthIdentifier | undefined , argName : SynthIdentifier | undefined , parent : CallExpression , transformer : Transformer ) : NodeArray < Statement > {
400
+ function getTransformationBody ( func : Expression , prevArgName : SynthIdentifier | undefined , argName : SynthIdentifier | undefined , parent : CallExpression , transformer : Transformer ) : ReadonlyArray < Statement > {
401
401
402
402
const shouldReturn = transformer . setOfExpressionsToReturn . get ( getNodeId ( parent ) . toString ( ) ) ;
403
403
switch ( func . kind ) {
@@ -407,9 +407,9 @@ namespace ts.codefix {
407
407
case SyntaxKind . Identifier : // identifier includes undefined
408
408
if ( ! argName ) break ;
409
409
410
- const synthCall = createCall ( getSynthesizedDeepClone ( func ) as Identifier , /*typeArguments*/ undefined , argName ? [ argName . identifier ] : [ ] ) ;
410
+ const synthCall = createCall ( getSynthesizedDeepClone ( func as Identifier ) , /*typeArguments*/ undefined , argName ? [ argName . identifier ] : emptyArray ) ;
411
411
if ( shouldReturn ) {
412
- return createNodeArray ( [ createReturn ( synthCall ) ] ) ;
412
+ return [ createReturn ( synthCall ) ] ;
413
413
}
414
414
415
415
const type = transformer . originalTypeMap . get ( getNodeId ( func ) . toString ( ) ) || transformer . checker . getTypeAtLocation ( func ) ;
@@ -447,15 +447,15 @@ namespace ts.codefix {
447
447
}
448
448
}
449
449
450
- return shouldReturn ? getSynthesizedDeepClones ( createNodeArray ( refactoredStmts ) ) :
451
- removeReturns ( createNodeArray ( refactoredStmts ) , prevArgName ! . identifier , transformer , seenReturnStatement ) ;
450
+ return shouldReturn ? refactoredStmts . map ( s => getSynthesizedDeepClone ( s ) ) :
451
+ removeReturns ( refactoredStmts , prevArgName ! . identifier , transformer , seenReturnStatement ) ;
452
452
}
453
453
else {
454
454
const innerRetStmts = getReturnStatementsWithPromiseHandlers ( createReturn ( funcBody ) ) ;
455
455
const innerCbBody = getInnerTransformationBody ( transformer , innerRetStmts , prevArgName ) ;
456
456
457
457
if ( innerCbBody . length > 0 ) {
458
- return createNodeArray ( innerCbBody ) ;
458
+ return innerCbBody ;
459
459
}
460
460
461
461
if ( ! shouldReturn ) {
@@ -470,7 +470,7 @@ namespace ts.codefix {
470
470
return transformedStatement ;
471
471
}
472
472
else {
473
- return createNodeArray ( [ createReturn ( getSynthesizedDeepClone ( funcBody ) ) ] ) ;
473
+ return [ createReturn ( getSynthesizedDeepClone ( funcBody ) ) ] ;
474
474
}
475
475
}
476
476
}
@@ -479,7 +479,7 @@ namespace ts.codefix {
479
479
codeActionSucceeded = false ;
480
480
break ;
481
481
}
482
- return createNodeArray ( [ ] ) ;
482
+ return emptyArray ;
483
483
}
484
484
485
485
function getLastCallSignature ( type : Type , checker : TypeChecker ) : Signature | undefined {
@@ -488,7 +488,7 @@ namespace ts.codefix {
488
488
}
489
489
490
490
491
- function removeReturns ( stmts : NodeArray < Statement > , prevArgName : Identifier , transformer : Transformer , seenReturnStatement : boolean ) : NodeArray < Statement > {
491
+ function removeReturns ( stmts : ReadonlyArray < Statement > , prevArgName : Identifier , transformer : Transformer , seenReturnStatement : boolean ) : ReadonlyArray < Statement > {
492
492
const ret : Statement [ ] = [ ] ;
493
493
for ( const stmt of stmts ) {
494
494
if ( isReturnStatement ( stmt ) ) {
@@ -509,15 +509,15 @@ namespace ts.codefix {
509
509
( createVariableDeclarationList ( [ createVariableDeclaration ( prevArgName , /*type*/ undefined , createIdentifier ( "undefined" ) ) ] , getFlagOfIdentifier ( prevArgName , transformer . constIdentifiers ) ) ) ) ) ;
510
510
}
511
511
512
- return createNodeArray ( ret ) ;
512
+ return ret ;
513
513
}
514
514
515
515
516
- function getInnerTransformationBody ( transformer : Transformer , innerRetStmts : Node [ ] , prevArgName ?: SynthIdentifier ) {
516
+ function getInnerTransformationBody ( transformer : Transformer , innerRetStmts : ReadonlyArray < Node > , prevArgName ?: SynthIdentifier ) {
517
517
518
518
let innerCbBody : Statement [ ] = [ ] ;
519
519
for ( const stmt of innerRetStmts ) {
520
- forEachChild ( stmt , function visit ( node : Node ) {
520
+ forEachChild ( stmt , function visit ( node ) {
521
521
if ( isCallExpression ( node ) ) {
522
522
const temp = transformExpression ( node , transformer , node , prevArgName ) ;
523
523
innerCbBody = innerCbBody . concat ( temp ) ;
0 commit comments