Skip to content

Commit eacd42d

Browse files
committed
Handle missing comma i func params
1 parent 82eb5b9 commit eacd42d

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

Sources/SwiftParser/Parameters.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,16 @@ extension Parser {
156156
defaultValue = nil
157157
}
158158

159-
let trailingComma = self.consume(if: .comma)
159+
let canParseIdentifier: Bool = withLookahead {
160+
$0.canParseTypeIdentifier(allowKeyword: false)
161+
}
162+
163+
var trailingComma: Token?
164+
if canParseIdentifier && !self.at(.rightParen) && !self.at(.comma) {
165+
trailingComma = Token(missing: .comma, arena: self.arena)
166+
} else {
167+
trailingComma = self.consume(if: .comma)
168+
}
160169

161170
return RawFunctionParameterSyntax(
162171
attributes: attrs,

Tests/SwiftParserTest/DeclarationTests.swift

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,7 +1516,8 @@ final class DeclarationTests: ParserTestCase {
15161516
leftSquare: .leftSquareToken(),
15171517
element: IdentifierTypeSyntax(name: .identifier("third")),
15181518
rightSquare: .rightSquareToken(presence: .missing)
1519-
)
1519+
),
1520+
trailingComma: .commaToken(presence: .missing)
15201521
),
15211522
diagnostics: [
15221523
DiagnosticSpec(
@@ -1532,11 +1533,12 @@ final class DeclarationTests: ParserTestCase {
15321533
),
15331534
DiagnosticSpec(
15341535
locationMarker: "4️⃣",
1535-
message: "unexpected code 'fourth: Int' in parameter clause"
1536+
message: "expected ',' in parameter",
1537+
fixIts: ["insert ','"]
15361538
),
15371539
],
15381540
fixedSource: """
1539-
func foo(first second: [third]fourth: Int) {}
1541+
func foo(first second: [third], fourth: Int) {}
15401542
"""
15411543
)
15421544
}
@@ -3402,4 +3404,36 @@ final class DeclarationTests: ParserTestCase {
34023404
]
34033405
)
34043406
}
3407+
3408+
func testMissingCommaInParameters() {
3409+
assertParse(
3410+
"func a(foo: Bar1️⃣ foo2: Bar2) {}",
3411+
diagnostics: [
3412+
DiagnosticSpec(
3413+
message: "expected ',' in parameter",
3414+
fixIts: ["insert ','"]
3415+
),
3416+
],
3417+
fixedSource: "func a(foo: Bar, foo2: Bar2) {}"
3418+
)
3419+
}
3420+
3421+
func testMissingMultipleCommasInParameters() {
3422+
assertParse(
3423+
"func a(foo: Bar1️⃣ foo2: Bar2, foo3: Bar32️⃣ foo4: Bar4) {}",
3424+
diagnostics: [
3425+
DiagnosticSpec(
3426+
locationMarker: "1️⃣",
3427+
message: "expected ',' in parameter",
3428+
fixIts: ["insert ','"]
3429+
),
3430+
DiagnosticSpec(
3431+
locationMarker: "2️⃣",
3432+
message: "expected ',' in parameter",
3433+
fixIts: ["insert ','"]
3434+
),
3435+
],
3436+
fixedSource: "func a(foo: Bar, foo2: Bar2, foo3: Bar3, foo4: Bar4) {}"
3437+
)
3438+
}
34053439
}

0 commit comments

Comments
 (0)