Skip to content

Commit 96439c4

Browse files
committed
Fix parsing error if @objc selector contains an underscore
1 parent 5fbdde7 commit 96439c4

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

Sources/SwiftParser/Attributes.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ extension Parser {
607607
mutating func parseObjectiveCSelector() -> RawObjCSelectorSyntax {
608608
var elements = [RawObjCSelectorPieceSyntax]()
609609
var loopProgress = LoopProgressCondition()
610-
while !self.at(.eof, .rightParen) && loopProgress.evaluate(currentToken) {
610+
while loopProgress.evaluate(currentToken) {
611611
// Empty selector piece.
612612
if let colon = self.consume(if: .colon) {
613613
elements.append(
@@ -618,10 +618,8 @@ extension Parser {
618618
)
619619
)
620620
continue
621-
}
622-
623-
if self.at(.identifier) || self.currentToken.isLexerClassifiedKeyword {
624-
let name = self.consumeAnyToken()
621+
} else if self.at(.identifier, .wildcard) || self.currentToken.isLexerClassifiedKeyword {
622+
let name = self.consumeAnyToken(remapping: .identifier)
625623

626624
// If we hit a ')' we may have a zero-argument selector.
627625
if self.at(.rightParen) && elements.isEmpty {
@@ -644,6 +642,8 @@ extension Parser {
644642
arena: self.arena
645643
)
646644
)
645+
} else {
646+
break
647647
}
648648
}
649649
return RawObjCSelectorSyntax(elements: elements, arena: self.arena)

Tests/SwiftParserTest/AttributeTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ final class AttributeTests: XCTestCase {
9090
func f(_: Int, _: Int, _: Int, _: Int, _: Int) { }
9191
"""
9292
)
93+
94+
AssertParse(
95+
"""
96+
@objc(_:)
97+
func f(_: Int)
98+
"""
99+
)
93100
}
94101

95102
func testRethrowsAttribute() {

0 commit comments

Comments
 (0)