From d27e1e3cb36003ec8adb472e02290c28ba0d0fbf Mon Sep 17 00:00:00 2001 From: Cal Stephens Date: Sat, 20 Sep 2025 10:08:40 -0700 Subject: [PATCH] Fix support for trailing commas in tuples in generic arguments --- Sources/SwiftParser/Types.swift | 3 +- Tests/SwiftParserTest/ExpressionTests.swift | 47 +++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftParser/Types.swift b/Sources/SwiftParser/Types.swift index 94fa029b0f5..91441f903c5 100644 --- a/Sources/SwiftParser/Types.swift +++ b/Sources/SwiftParser/Types.swift @@ -1025,7 +1025,8 @@ extension Parser.Lookahead { } self.consumeIfContextualPunctuator("...") - } while self.consume(if: .comma) != nil && self.hasProgressed(&loopProgress) + + } while self.consume(if: .comma) != nil && !self.at(.rightParen) && self.hasProgressed(&loopProgress) return self.consume(if: .rightParen) != nil } diff --git a/Tests/SwiftParserTest/ExpressionTests.swift b/Tests/SwiftParserTest/ExpressionTests.swift index 791620ad652..9533e6b4f56 100644 --- a/Tests/SwiftParserTest/ExpressionTests.swift +++ b/Tests/SwiftParserTest/ExpressionTests.swift @@ -2225,6 +2225,53 @@ final class ExpressionTests: ParserTestCase { let _ = ((Int, Bool, String,) -> Void).self """ ) + + assertParse( + """ + let _ = Array<( + bar: String, + baaz: String, + )>() + """, + substructure: FunctionCallExprSyntax( + calledExpression: GenericSpecializationExprSyntax( + expression: DeclReferenceExprSyntax(baseName: .identifier("Array")), + genericArgumentClause: GenericArgumentClauseSyntax( + leftAngle: .leftAngleToken(), + arguments: GenericArgumentListSyntax([ + GenericArgumentSyntax( + argument: .type( + TypeSyntax( + TupleTypeSyntax( + leftParen: .leftParenToken(), + elements: TupleTypeElementListSyntax([ + TupleTypeElementSyntax( + firstName: .identifier("bar"), + colon: .colonToken(), + type: TypeSyntax(IdentifierTypeSyntax(name: .identifier("String"))), + trailingComma: .commaToken() + ), + TupleTypeElementSyntax( + firstName: .identifier("baaz"), + colon: .colonToken(), + type: TypeSyntax(IdentifierTypeSyntax(name: .identifier("String"))), + trailingComma: .commaToken() + ), + ]), + rightParen: .rightParenToken() + ) + ) + ) + ) + ]), + rightAngle: .rightAngleToken() + ) + ), + leftParen: .leftParenToken(), + arguments: LabeledExprListSyntax([]), + rightParen: .rightParenToken() + ) + ) } func testSecondaryArgumentLabelDollarIdentifierInClosure() {