@@ -351,6 +351,25 @@ module PrinterExtensions =
351351 printer.Print( expr)
352352 printer.Print( " )" )
353353
354+ /// True when the expression's leftmost token would otherwise be parsed as the start of
355+ /// a block/function/class declaration, e.g. ` { A: 1 }; ` parses as an invalid block.
356+ member printer.NeedsParensAsExpressionStatement ( expr : Expression ) =
357+ match expr with
358+ | CommentedExpression(_, e) -> printer.NeedsParensAsExpressionStatement( e)
359+ | ObjectExpression _
360+ | ClassExpression _
361+ | FunctionExpression _ -> true
362+ | SequenceExpression( exprs, _) when exprs.Length > 0 -> printer.NeedsParensAsExpressionStatement( exprs[ 0 ])
363+ | BinaryExpression( left, _, _, _)
364+ | LogicalExpression( left, _, _, _)
365+ | AssignmentExpression( left, _, _, _) -> printer.NeedsParensAsExpressionStatement( left)
366+ | ConditionalExpression( test, _, _, _) -> printer.NeedsParensAsExpressionStatement( test)
367+ | MemberExpression( object, _, _, _) -> printer.NeedsParensAsExpressionStatement( object)
368+ | CallExpression( callee, _, _, _) -> printer.NeedsParensAsExpressionStatement( callee)
369+ | UpdateExpression( false , argument, _, _) -> printer.NeedsParensAsExpressionStatement( argument)
370+ | AsExpression( e, _) -> printer.NeedsParensAsExpressionStatement( e)
371+ | _ -> false
372+
354373 /// Should the expression be printed with parens when nested?
355374 member printer.IsComplex ( expr : Expression ) =
356375 match expr with
@@ -642,9 +661,15 @@ module PrinterExtensions =
642661 printer.PrintOptional( label, " " )
643662
644663 | ExpressionStatement( expr) ->
645- match expr with
646- | UnaryExpression( argument, " void" , false , _ loc) -> printer.Print( argument)
647- | _ -> printer.Print( expr)
664+ let expr =
665+ match expr with
666+ | UnaryExpression( argument, " void" , false , _ loc) -> argument
667+ | expr -> expr
668+
669+ if printer.NeedsParensAsExpressionStatement( expr) then
670+ printer.WithParens( expr)
671+ else
672+ printer.Print( expr)
648673
649674 member printer.PrintJsDoc ( doc : string option ) =
650675 match doc with
0 commit comments