Skip to content

Commit 4f3f7f8

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

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
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/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)