@@ -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
@@ -734,7 +743,7 @@ namespace ts {
734743 export function createJsxCreateElement ( reactNamespace : string , tagName : Expression , props : Expression , children : Expression [ ] ) : LeftHandSideExpression {
735744 const argumentsList = [ tagName ] ;
736745 if ( props ) {
737- argumentsList . push ( props )
746+ argumentsList . push ( props ) ;
738747 }
739748
740749 if ( children && children . length > 0 ) {
@@ -834,7 +843,7 @@ namespace ts {
834843 addPropertyAssignment ( properties , "enumerable" , enumerable , preferNewLine ) ;
835844 addPropertyAssignment ( properties , "configurable" , configurable , preferNewLine ) ;
836845 addPropertyAssignment ( properties , "writable" , writable , preferNewLine ) ;
837- return createObjectLiteral ( properties , location )
846+ return createObjectLiteral ( properties , location ) ;
838847 }
839848
840849 function addPropertyAssignment ( properties : ObjectLiteralElement [ ] , name : string , value : boolean | Expression , preferNewLine : boolean ) {
@@ -848,7 +857,7 @@ namespace ts {
848857 startOnNewLine ( property ) ;
849858 }
850859
851- addNode ( properties , property ) ;
860+ properties . push ( property ) ;
852861 }
853862 }
854863
@@ -1205,6 +1214,26 @@ namespace ts {
12051214 : createParen ( operand , /*location*/ operand ) ;
12061215 }
12071216
1217+ function parenthesizeListElements ( elements : NodeArray < Expression > ) {
1218+ let result : Expression [ ] ;
1219+ for ( let i = 0 ; i < elements . length ; i ++ ) {
1220+ const element = parenthesizeExpressionForList ( elements [ i ] ) ;
1221+ if ( result !== undefined || element !== elements [ i ] ) {
1222+ if ( result === undefined ) {
1223+ result = elements . slice ( 0 , i ) ;
1224+ }
1225+
1226+ result . push ( element ) ;
1227+ }
1228+ }
1229+
1230+ if ( result !== undefined ) {
1231+ return createNodeArray ( result , elements , elements . hasTrailingComma ) ;
1232+ }
1233+
1234+ return elements ;
1235+ }
1236+
12081237 export function parenthesizeExpressionForList ( expression : Expression ) {
12091238 const expressionPrecedence = getExpressionPrecedence ( expression ) ;
12101239 const commaPrecedence = getOperatorPrecedence ( SyntaxKind . BinaryExpression , SyntaxKind . CommaToken ) ;
@@ -1230,6 +1259,14 @@ namespace ts {
12301259 return expression ;
12311260 }
12321261
1262+ export function parenthesizeConciseBody ( body : ConciseBody ) : ConciseBody {
1263+ if ( body . kind === SyntaxKind . ObjectLiteralExpression ) {
1264+ return createParen ( < Expression > body , /*location*/ body ) ;
1265+ }
1266+
1267+ return body ;
1268+ }
1269+
12331270 function getLeftmostExpression ( node : Expression ) : Expression {
12341271 while ( true ) {
12351272 switch ( node . kind ) {
@@ -1266,20 +1303,6 @@ namespace ts {
12661303 return node ;
12671304 }
12681305
1269- /**
1270- * Skips past any TypeAssertionExpression or AsExpression nodes to their inner expression.
1271- *
1272- * @param node The expression node.
1273- */
1274- function skipAssertions ( node : Expression ) {
1275- while ( node . kind === SyntaxKind . TypeAssertionExpression
1276- || node . kind === SyntaxKind . AsExpression ) {
1277- node = ( < AssertionExpression > node ) . expression ;
1278- }
1279-
1280- return node ;
1281- }
1282-
12831306 export function startOnNewLine < T extends Node > ( node : T ) : T {
12841307 node . startsOnNewLine = true ;
12851308 return node ;
0 commit comments