@@ -297,14 +297,14 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
297297 rule!( ( sequenceExpr elements: _* @els) => ( unresolved_operator_sequence element: { els} ) ) ,
298298 // Prefix unary operators (`!a`, `-x`).
299299 rule!( ( prefixOperatorExpr operator: @op expression: @operand) => ( unary_expr operator: ( prefix_operator #{ op} ) operand: { operand} ) ) ,
300- // A `tupleExpr` is a tuple literal (`(a, b)`) or a parenthesised
301- // expression (`(x)`). For now it is kept as an opaque `tuple_expr` leaf
302- // (its source text); its elements are not descended into .
303- //
304- // TODO: a parenthesised single-element `tupleExpr` is really a grouping
305- // expression and should be elided (unwrapped to its inner expression )
306- // rather than modelled as a tuple.
307- rule!( ( tupleExpr) => ( tuple_expr) ) ,
300+ // A parenthesised expression has a single tuple element; elide the
301+ // grouping and preserve the expression itself. Actual tuple literals
302+ // retain their translated labeled elements as `argument` children .
303+ rule! ( ( tupleExpr
304+ elements : ( labeledExpr label : _? @@lbl expression : @element )
305+ elements : _ * @@rest )
306+ where rest . is_empty ( ) && lbl . is_none ( ) => expr { element } ) ,
307+ rule!( ( tupleExpr elements : _ * @elements ) => ( tuple_expr element : { elements } ) ) ,
308308 // A code block contains its statements directly.
309309 rule!( ( codeBlock statements: _* @stmts) => ( block stmt: { stmts} ) ) ,
310310 // ---- Properties with accessors ----
0 commit comments