Skip to content

Commit 08a86b1

Browse files
committed
Stop parsing #keyPath and #selector as special grammar productions
Instead, they'll be parsed as a macro expansion expression.
1 parent ef7f0a8 commit 08a86b1

File tree

4 files changed

+3
-108
lines changed

4 files changed

+3
-108
lines changed

Sources/SwiftParser/Expressions.swift

Lines changed: 0 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -973,8 +973,6 @@ extension Parser {
973973
/// primary-expression → implicit-member-expression
974974
/// primary-expression → wildcard-expression
975975
/// primary-expression → key-path-expression
976-
/// primary-expression → selector-expression
977-
/// primary-expression → key-path-string-expression
978976
/// primary-expression → macro-expansion-expression
979977
@_spi(RawSyntax)
980978
public mutating func parsePrimaryExpression(
@@ -1081,11 +1079,6 @@ extension Parser {
10811079
self.parseMacroExpansionExpr(pattern: pattern, flavor: flavor)
10821080
)
10831081

1084-
case (.poundSelectorKeyword, _)?:
1085-
return RawExprSyntax(self.parseObjectiveCSelectorLiteral())
1086-
case (.poundKeyPathKeyword, _)?:
1087-
return RawExprSyntax(self.parseObjectiveCKeyPathExpression())
1088-
10891082
case (.leftBrace, _)?: // expr-closure
10901083
return RawExprSyntax(self.parseClosureExpression())
10911084
case (.period, let handle)?, //=.foo
@@ -1653,53 +1646,6 @@ extension Parser {
16531646
}
16541647
}
16551648

1656-
extension Parser {
1657-
/// Parse an Objective-C #keypath literal.
1658-
///
1659-
/// Grammar
1660-
/// =======
1661-
///
1662-
/// key-path-string-expression → '#keyPath' '(' expression ')'
1663-
@_spi(RawSyntax)
1664-
public mutating func parseObjectiveCKeyPathExpression() -> RawObjcKeyPathExprSyntax {
1665-
let (unexpectedBeforeKeyword, keyword) = self.expect(.poundKeyPathKeyword)
1666-
// Parse the leading '('.
1667-
let (unexpectedBeforeLParen, lparen) = self.expect(.leftParen)
1668-
1669-
// Parse the sequence of unqualified-names.
1670-
var elements = [RawObjcNamePieceSyntax]()
1671-
do {
1672-
var flags: DeclNameOptions = []
1673-
var keepGoing: RawTokenSyntax? = nil
1674-
var loopProgress = LoopProgressCondition()
1675-
repeat {
1676-
// Parse the next name.
1677-
let (name, args) = self.parseDeclNameRef(flags)
1678-
assert(args == nil, "Found arguments but did not pass argument flag?")
1679-
1680-
// After the first component, we can start parsing keywords.
1681-
flags.formUnion(.keywords)
1682-
1683-
// Parse the next period to continue the path.
1684-
keepGoing = self.consume(if: .period)
1685-
elements.append(RawObjcNamePieceSyntax(
1686-
name: name, dot: keepGoing, arena: self.arena))
1687-
} while keepGoing != nil && loopProgress.evaluate(currentToken)
1688-
}
1689-
1690-
// Parse the closing ')'.
1691-
let (unexpectedBeforeRParen, rparen) = self.expect(.rightParen)
1692-
return RawObjcKeyPathExprSyntax(
1693-
unexpectedBeforeKeyword,
1694-
keyPath: keyword,
1695-
unexpectedBeforeLParen,
1696-
leftParen: lparen,
1697-
name: RawObjcNameSyntax(elements: elements, arena: self.arena),
1698-
unexpectedBeforeRParen,
1699-
rightParen: rparen, arena: self.arena)
1700-
}
1701-
}
1702-
17031649
extension Parser {
17041650
/// Parse a 'super' reference to the superclass instance of a class.
17051651
///
@@ -1925,48 +1871,6 @@ extension Parser {
19251871
}
19261872
}
19271873

1928-
extension Parser {
1929-
/// Parse a #selector expression.
1930-
///
1931-
/// Grammar
1932-
/// =======
1933-
///
1934-
/// selector-expression → '#selector' '(' expression )
1935-
/// selector-expression → '#selector' '(' 'getter' ':' expression ')'
1936-
/// selector-expression → '#selector' '(' 'setter' ':' expression ')'
1937-
@_spi(RawSyntax)
1938-
public mutating func parseObjectiveCSelectorLiteral() -> RawObjcSelectorExprSyntax {
1939-
// Consume '#selector'.
1940-
let (unexpectedBeforeSelector, selector) = self.expect(.poundSelectorKeyword)
1941-
// Parse the leading '('.
1942-
let (unexpectedBeforeLParen, lparen) = self.expect(.leftParen)
1943-
1944-
// Parse possible 'getter:' or 'setter:' modifiers, and determine
1945-
// the kind of selector we're working with.
1946-
let kindAndColon = self.consume(
1947-
if: { $0.isContextualKeyword(["getter", "setter"])},
1948-
followedBy: { $0.tokenKind == .colon }
1949-
)
1950-
let (kind, colon) = (kindAndColon?.0, kindAndColon?.1)
1951-
1952-
// Parse the subexpression.
1953-
let subexpr = self.parseExpression()
1954-
// Parse the closing ')'.
1955-
let (unexpectedBeforeRParen, rparen) = self.expect(.rightParen)
1956-
return RawObjcSelectorExprSyntax(
1957-
unexpectedBeforeSelector,
1958-
poundSelector: selector,
1959-
unexpectedBeforeLParen,
1960-
leftParen: lparen,
1961-
kind: kind,
1962-
colon: colon,
1963-
name: subexpr,
1964-
unexpectedBeforeRParen,
1965-
rightParen: rparen,
1966-
arena: self.arena)
1967-
}
1968-
}
1969-
19701874
extension Parser {
19711875
/// Parse a closure expression.
19721876
///

Sources/SwiftParser/Lexer.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1565,8 +1565,6 @@ extension Lexer.Cursor {
15651565

15661566
let kind: RawTokenKind
15671567
switch literal {
1568-
case "keyPath": kind = .poundKeyPathKeyword
1569-
case "selector": kind = .poundSelectorKeyword
15701568
case "assert": kind = .poundAssertKeyword
15711569
case "sourceLocation": kind = .poundSourceLocationKeyword
15721570
case "warning": kind = .poundWarningKeyword

Sources/SwiftParser/RawTokenKindSubset.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -700,8 +700,6 @@ enum PrimaryExpressionStart: RawTokenKindSubset {
700700
case nilKeyword
701701
case period
702702
case pound
703-
case poundKeyPathKeyword
704-
case poundSelectorKeyword
705703
case prefixPeriod
706704
case regexLiteral
707705
case selfKeyword
@@ -731,8 +729,6 @@ enum PrimaryExpressionStart: RawTokenKindSubset {
731729
case .nilKeyword: self = .nilKeyword
732730
case .period: self = .period
733731
case .pound: self = .pound
734-
case .poundKeyPathKeyword: self = .poundKeyPathKeyword
735-
case .poundSelectorKeyword: self = .poundSelectorKeyword
736732
case .prefixPeriod: self = .prefixPeriod
737733
case .regexLiteral: self = .regexLiteral
738734
case .selfKeyword: self = .selfKeyword
@@ -765,8 +761,6 @@ enum PrimaryExpressionStart: RawTokenKindSubset {
765761
case .nilKeyword: return .nilKeyword
766762
case .period: return .period
767763
case .pound: return .pound
768-
case .poundKeyPathKeyword: return .poundKeyPathKeyword
769-
case .poundSelectorKeyword: return .poundSelectorKeyword
770764
case .prefixPeriod: return .prefixPeriod
771765
case .regexLiteral: return .regexLiteral
772766
case .selfKeyword: return .selfKeyword

Tests/SwiftParserTest/ExpressionTests.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -637,11 +637,10 @@ final class ExpressionTests: XCTestCase {
637637
]
638638
)
639639

640-
AssertParse("#keyPath(1️⃣(b:2️⃣)",
640+
AssertParse("#keyPath((b:1️⃣)2️⃣",
641641
diagnostics: [
642-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected identifier in '#keyPath' expression"),
643-
DiagnosticSpec(locationMarker: "1️⃣", message: "expected ')' to end '#keyPath' expression"),
644-
DiagnosticSpec(locationMarker: "2️⃣", message: "expected value in function call"),
642+
DiagnosticSpec(locationMarker: "1️⃣", message: "expected value in tuple"),
643+
DiagnosticSpec(locationMarker: "2️⃣", message: "expected ')' to end pound literal expression"),
645644
])
646645
}
647646

0 commit comments

Comments
 (0)