@@ -250,7 +250,7 @@ namespace ts {
250
250
node . decorators = undefined ;
251
251
node . modifiers = undefined ;
252
252
node . typeParameters = undefined ;
253
- node . parameters = createSynthesizedNodeArray ( parameters ) ;
253
+ node . parameters = createNodeArray ( parameters ) ;
254
254
node . type = undefined ;
255
255
node . body = body ;
256
256
return node ;
@@ -286,15 +286,15 @@ namespace ts {
286
286
node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
287
287
node . questionToken = undefined ;
288
288
node . type = undefined ;
289
- node . initializer = initializer ;
289
+ node . initializer = initializer ? parenthesizeExpressionForList ( initializer ) : undefined ;
290
290
return node ;
291
291
}
292
292
293
293
// Expression
294
294
295
295
export function createArrayLiteral ( elements ?: Expression [ ] ) {
296
296
const node = < ArrayLiteralExpression > createNode ( SyntaxKind . ArrayLiteralExpression ) ;
297
- node . elements = createNodeArray ( elements ) ;
297
+ node . elements = parenthesizeListElements ( createNodeArray ( elements ) ) ;
298
298
return node ;
299
299
}
300
300
@@ -322,14 +322,16 @@ namespace ts {
322
322
export function createCall ( expression : Expression , argumentsArray : Expression [ ] , location ?: TextRange ) {
323
323
const node = < CallExpression > createNode ( SyntaxKind . CallExpression , location ) ;
324
324
node . expression = parenthesizeForAccess ( expression ) ;
325
- node . arguments = createNodeArray ( argumentsArray ) ;
325
+ node . arguments = parenthesizeListElements ( createNodeArray ( argumentsArray ) ) ;
326
326
return node ;
327
327
}
328
328
329
329
export function createNew ( expression : Expression , argumentsArray : Expression [ ] , location ?: TextRange ) {
330
330
const node = < NewExpression > createNode ( SyntaxKind . NewExpression , location ) ;
331
331
node . expression = parenthesizeForAccess ( expression ) ;
332
- node . arguments = argumentsArray ? createNodeArray ( argumentsArray ) : undefined ;
332
+ node . arguments = argumentsArray
333
+ ? parenthesizeListElements ( createNodeArray ( argumentsArray ) )
334
+ : undefined ;
333
335
return node ;
334
336
}
335
337
@@ -358,7 +360,7 @@ namespace ts {
358
360
node . parameters = createNodeArray ( parameters ) ;
359
361
node . type = undefined ;
360
362
node . equalsGreaterThanToken = createNode ( SyntaxKind . EqualsGreaterThanToken ) ;
361
- node . body = body ;
363
+ node . body = parenthesizeConciseBody ( body ) ;
362
364
return node ;
363
365
}
364
366
@@ -414,7 +416,7 @@ namespace ts {
414
416
415
417
export function createSpread ( expression : Expression ) {
416
418
const node = < SpreadElementExpression > createNode ( SyntaxKind . SpreadElementExpression ) ;
417
- node . expression = expression ;
419
+ node . expression = parenthesizeExpressionForList ( expression ) ;
418
420
return node ;
419
421
}
420
422
@@ -424,8 +426,8 @@ namespace ts {
424
426
node . modifiers = undefined ;
425
427
node . name = name ;
426
428
node . typeParameters = undefined ;
427
- node . heritageClauses = createSynthesizedNodeArray ( heritageClauses ) ;
428
- node . members = createSynthesizedNodeArray ( members ) ;
429
+ node . heritageClauses = createNodeArray ( heritageClauses ) ;
430
+ node . members = createNodeArray ( members ) ;
429
431
return node ;
430
432
}
431
433
@@ -469,7 +471,7 @@ namespace ts {
469
471
export function createVariableDeclaration ( name : string | BindingPattern | Identifier , initializer ?: Expression , location ?: TextRange ) : VariableDeclaration {
470
472
const node = < VariableDeclaration > createNode ( SyntaxKind . VariableDeclaration , location ) ;
471
473
node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
472
- node . initializer = initializer ;
474
+ node . initializer = initializer !== undefined ? parenthesizeExpressionForList ( initializer ) : undefined ;
473
475
return node ;
474
476
}
475
477
@@ -479,7 +481,7 @@ namespace ts {
479
481
480
482
export function createStatement ( expression : Expression , location ?: TextRange ) : ExpressionStatement {
481
483
const node = < ExpressionStatement > createNode ( SyntaxKind . ExpressionStatement , location ) ;
482
- node . expression = expression ;
484
+ node . expression = parenthesizeExpressionForExpressionStatement ( expression ) ;
483
485
return node ;
484
486
}
485
487
@@ -562,8 +564,8 @@ namespace ts {
562
564
setModifiers ( node , modifiers ) ;
563
565
node . name = name ;
564
566
node . typeParameters = undefined ;
565
- node . heritageClauses = createSynthesizedNodeArray ( heritageClauses ) ;
566
- node . members = createSynthesizedNodeArray ( members ) ;
567
+ node . heritageClauses = createNodeArray ( heritageClauses ) ;
568
+ node . members = createNodeArray ( members ) ;
567
569
return node ;
568
570
}
569
571
@@ -599,7 +601,14 @@ namespace ts {
599
601
export function createHeritageClause ( token : SyntaxKind , types : ExpressionWithTypeArguments [ ] , location ?: TextRange ) {
600
602
const node = < HeritageClause > createNode ( SyntaxKind . HeritageClause , location ) ;
601
603
node . token = token ;
602
- node . types = createSynthesizedNodeArray ( types ) ;
604
+ node . types = createNodeArray ( types ) ;
605
+ return node ;
606
+ }
607
+
608
+ export function createCaseClause ( expression : Expression , statements : Statement [ ] , location ?: TextRange ) {
609
+ const node = < CaseClause > createNode ( SyntaxKind . CaseClause , location ) ;
610
+ node . expression = parenthesizeExpressionForList ( expression ) ;
611
+ node . statements = createNodeArray ( statements ) ;
603
612
return node ;
604
613
}
605
614
@@ -609,7 +618,7 @@ namespace ts {
609
618
const node = < PropertyAssignment > createNode ( SyntaxKind . PropertyAssignment , location ) ;
610
619
node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
611
620
node . questionToken = undefined ;
612
- node . initializer = initializer ;
621
+ node . initializer = initializer !== undefined ? parenthesizeExpressionForList ( initializer ) : undefined ;
613
622
return node ;
614
623
}
615
624
@@ -734,7 +743,7 @@ namespace ts {
734
743
export function createJsxCreateElement ( reactNamespace : string , tagName : Expression , props : Expression , children : Expression [ ] ) : LeftHandSideExpression {
735
744
const argumentsList = [ tagName ] ;
736
745
if ( props ) {
737
- argumentsList . push ( props )
746
+ argumentsList . push ( props ) ;
738
747
}
739
748
740
749
if ( children && children . length > 0 ) {
@@ -1206,6 +1215,26 @@ namespace ts {
1206
1215
: createParen ( operand , /*location*/ operand ) ;
1207
1216
}
1208
1217
1218
+ function parenthesizeListElements ( elements : NodeArray < Expression > ) {
1219
+ let result : Expression [ ] ;
1220
+ for ( let i = 0 ; i < elements . length ; i ++ ) {
1221
+ const element = parenthesizeExpressionForList ( elements [ i ] ) ;
1222
+ if ( result !== undefined || element !== elements [ i ] ) {
1223
+ if ( result === undefined ) {
1224
+ result = elements . slice ( 0 , i ) ;
1225
+ }
1226
+
1227
+ result . push ( element ) ;
1228
+ }
1229
+ }
1230
+
1231
+ if ( result !== undefined ) {
1232
+ return createNodeArray ( result , elements , elements . hasTrailingComma ) ;
1233
+ }
1234
+
1235
+ return elements ;
1236
+ }
1237
+
1209
1238
export function parenthesizeExpressionForList ( expression : Expression ) {
1210
1239
const expressionPrecedence = getExpressionPrecedence ( expression ) ;
1211
1240
const commaPrecedence = getOperatorPrecedence ( SyntaxKind . BinaryExpression , SyntaxKind . CommaToken ) ;
@@ -1231,6 +1260,14 @@ namespace ts {
1231
1260
return expression ;
1232
1261
}
1233
1262
1263
+<
10000
/span> export function parenthesizeConciseBody ( body : ConciseBody ) : ConciseBody {
1264
+ if ( body . kind === SyntaxKind . ObjectLiteralExpression ) {
1265
+ return createParen ( < Expression > body , /*location*/ body ) ;
1266
+ }
1267
+
1268
+ return body ;
1269
+ }
1270
+
1234
1271
function getLeftmostExpression ( node : Expression ) : Expression {
1235
1272
while ( true ) {
1236
1273
switch ( node . kind ) {
0 commit comments