Skip to content

Commit b02a7f1

Browse files
Skip tokens in canRecoverTo when a closing delimiter is found at the same line
1 parent b2c6854 commit b02a7f1

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

Sources/SwiftParser/Recovery.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,33 @@ extension Parser.Lookahead {
123123
if currentTokenPrecedence >= recoveryPrecedence {
124124
break
125125
}
126-
self.consumeAnyToken()
127126
if let closingDelimiter = currentTokenPrecedence.closingTokenKind {
128127
let closingDelimiterSpec = TokenSpec(closingDelimiter)
128+
let canCloseAtSameLine: Int? = self.withLookahead { lookahead in
129+
var tokensToSkip = 0
130+
while !lookahead.at(.endOfFile), !lookahead.currentToken.isAtStartOfLine {
131+
tokensToSkip += 1
132+
if lookahead.at(closingDelimiterSpec) {
133+
return tokensToSkip
134+
} else {
135+
lookahead.consumeAnyToken()
136+
}
137+
}
138+
return nil
139+
}
140+
if let tokensToSkip = canCloseAtSameLine {
141+
for _ in 0..<tokensToSkip {
142+
self.consumeAnyToken()
143+
}
144+
continue
145+
}
146+
self.consumeAnyToken()
129147
guard self.canRecoverTo(closingDelimiterSpec) != nil else {
130148
continue
131149
}
132150
self.eat(closingDelimiterSpec)
151+
} else {
152+
self.consumeAnyToken()
133153
}
134154
}
135155

Tests/SwiftBasicFormatTest/BasicFormatTests.swift

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,6 @@ fileprivate func assertFormattingRoundTrips(
5353
}
5454

5555
final class BasicFormatTest: XCTestCase {
56-
func testClosureParameter() {
57-
let source = """
58-
myFunc({
59-
return true
60-
})
61-
"""
62-
assertFormatted(source: source, expected: source)
63-
}
64-
6556
func testNotIndented() {
6657
assertFormatted(
6758
source: """

Tests/SwiftParserTest/translated/RecoveryTests.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,19 +1935,12 @@ final class RecoveryTests: ParserTestCase {
19351935
assertParse(
19361936
"""
19371937
struct ErrorInFunctionSignatureResultArrayType11 {
1938-
func foo() -> Int1️⃣[(a){a++}2️⃣] {
1938+
func foo() -> Int1️⃣[(a){a++}] {
19391939
}
19401940
}
19411941
""",
19421942
diagnostics: [
1943-
DiagnosticSpec(
1944-
locationMarker: "1️⃣",
1945-
message: "unexpected code '[(a)' in function"
1946-
),
1947-
DiagnosticSpec(
1948-
locationMarker: "2️⃣",
1949-
message: "unexpected code in struct"
1950-
)
1943+
DiagnosticSpec(message: "unexpected code '[(a){a++}]' in function")
19511944
]
19521945
)
19531946
}

0 commit comments

Comments
 (0)