@@ -250,7 +250,7 @@ namespace ts {
250250 node . decorators = undefined ;
251251 node . modifiers = undefined ;
252252 node . typeParameters = undefined ;
253- node . parameters = createSynthesizedNodeArray ( parameters ) ;
253+ node . parameters = createNodeArray ( parameters ) ;
254254 node . type = undefined ;
255255 node . body = body ;
256256 return node ;
@@ -286,15 +286,15 @@ namespace ts {
286286 node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
287287 node . questionToken = undefined ;
288288 node . type = undefined ;
289- node . initializer = initializer ;
289+ node . initializer = initializer ? parenthesizeExpressionForList ( initializer ) : undefined ;
290290 return node ;
291291 }
292292
293293 // Expression
294294
295295 export function createArrayLiteral ( elements ?: Expression [ ] ) {
296296 const node = < ArrayLiteralExpression > createNode ( SyntaxKind . ArrayLiteralExpression ) ;
297- node . elements = createNodeArray ( elements ) ;
297+ node . elements = parenthesizeListElements ( createNodeArray ( elements ) ) ;
298298 return node ;
299299 }
300300
@@ -322,14 +322,16 @@ namespace ts {
322322 export function createCall ( expression : Expression , argumentsArray : Expression [ ] , location ?: TextRange ) {
323323 const node = < CallExpression > createNode ( SyntaxKind . CallExpression , location ) ;
324324 node . expression = parenthesizeForAccess ( expression ) ;
325- node . arguments = createNodeArray ( argumentsArray ) ;
325+ node . arguments = parenthesizeListElements ( createNodeArray ( argumentsArray ) ) ;
326326 return node ;
327327 }
328328
329329 export function createNew ( expression : Expression , argumentsArray : Expression [ ] , location ?: TextRange ) {
330330 const node = < NewExpression > createNode ( SyntaxKind . NewExpression , location ) ;
331331 node . expression = parenthesizeForAccess ( expression ) ;
332- node . arguments = argumentsArray ? createNodeArray ( argumentsArray ) : undefined ;
332+ node . arguments = argumentsArray
333+ ? parenthesizeListElements ( createNodeArray ( argumentsArray ) )
334+ : undefined ;
333335 return node ;
334336 }
335337
@@ -358,7 +360,7 @@ namespace ts {
358360 node . parameters = createNodeArray ( parameters ) ;
359361 node . type = undefined ;
360362 node . equalsGreaterThanToken = createNode ( SyntaxKind . EqualsGreaterThanToken ) ;
361- node . body = body ;
363+ node . body = parenthesizeConciseBody ( body ) ;
362364 return node ;
363365 }
364366
@@ -414,7 +416,7 @@ namespace ts {
414416
415417 export function createSpread ( expression : Expression ) {
416418 const node = < SpreadElementExpression > createNode ( SyntaxKind . SpreadElementExpression ) ;
417- node . expression = expression ;
419+ node . expression = parenthesizeExpressionForList ( expression ) ;
418420 return node ;
419421 }
420422
@@ -424,8 +426,8 @@ namespace ts {
424426 node . modifiers = undefined ;
425427 node . name = name ;
426428 node . typeParameters = undefined ;
427- node . heritageClauses = createSynthesizedNodeArray ( heritageClauses ) ;
428- node . members = createSynthesizedNodeArray ( members ) ;
429+ node . heritageClauses = createNodeArray ( heritageClauses ) ;
430+ node . members = createNodeArray ( members ) ;
429431 return node ;
430432 }
431433
@@ -469,7 +471,7 @@ namespace ts {
469471 export function createVariableDeclaration ( name : string | BindingPattern | Identifier , initializer ?: Expression , location ?: TextRange ) : VariableDeclaration {
470472 const node = < VariableDeclaration > createNode ( SyntaxKind . VariableDeclaration , location ) ;
471473 node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
472- node . initializer = initializer ;
474+ node . initializer = initializer !== undefined ? parenthesizeExpressionForList ( initializer ) : undefined ;
473475 return node ;
474476 }
475477
@@ -479,7 +481,7 @@ namespace ts {
479481
480482 export function createStatement ( expression : Expression , location ?: TextRange ) : ExpressionStatement {
481483 const node = < ExpressionStatement > createNode ( SyntaxKind . ExpressionStatement , location ) ;
482- node . expression = expression ;
484+ node . expression = parenthesizeExpressionForExpressionStatement ( expression ) ;
483485 return node ;
484486 }
485487
@@ -562,8 +564,8 @@ namespace ts {
562564 setModifiers ( node , modifiers ) ;
563565 node . name = name ;
564566 node . typeParameters = undefined ;
565- node . heritageClauses = createSynthesizedNodeArray ( heritageClauses ) ;
566- node . members = createSynthesizedNodeArray ( members ) ;
567+ node . heritageClauses = createNodeArray ( heritageClauses ) ;
568+ node . members = createNodeArray ( members ) ;
567569 return node ;
568570 }
569571
@@ -599,7 +601,14 @@ namespace ts {
599601 export function createHeritageClause ( token : SyntaxKind , types : ExpressionWithTypeArguments [ ] , location ?: TextRange ) {
600602 const node = < HeritageClause > createNode ( SyntaxKind . HeritageClause , location ) ;
601603 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 ) ;
603612 return node ;
604613 }
605614
@@ -609,7 +618,7 @@ namespace ts {
609618 const node = < PropertyAssignment > createNode ( SyntaxKind . PropertyAssignment , location ) ;
610619 node . name = typeof name === "string" ? createIdentifier ( name ) : name ;
611620 node . questionToken = undefined ;
612- node . initializer = initializer ;
621+ node . initializer = initializer !== undefined ? parenthesizeExpressionForList ( initializer ) : undefined ;
613622 return node ;
614623 }
615624
@@ -1206,6 +1215,26 @@ namespace ts {
12061215 : createParen ( operand , /*location*/ operand ) ;
12071216 }
12081217
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+
12091238 export function parenthesizeExpressionForList ( expression : Expression ) {
12101239 const expressionPrecedence = getExpressionPrecedence ( expression ) ;
12111240 const commaPrecedence = getOperatorPrecedence ( SyntaxKind . BinaryExpression , SyntaxKind . CommaToken ) ;
@@ -1231,6 +1260,14 @@ namespace ts {
12311260 return expression ;
12321261 }
12331262
1263+ 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+
12341271 function getLeftmostExpression ( node : Expression ) : Expression {
12351272 while ( true ) {
12361273 switch ( node . kind ) {
0 commit comments