Skip to content

Commit 646b14f

Browse files
committed
Parse method and initializer keypaths.
1 parent fb60b61 commit 646b14f

File tree

2 files changed

+405
-4
lines changed

2 files changed

+405
-4
lines changed

Sources/SwiftParser/Expressions.swift

+46-4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#if compiler(>=6)
14-
@_spi(RawSyntax) internal import SwiftSyntax
14+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) internal import SwiftSyntax
1515
#else
16-
@_spi(RawSyntax) import SwiftSyntax
16+
@_spi(RawSyntax) @_spi(ExperimentalLanguageFeatures) import SwiftSyntax
1717
#endif
1818

1919
extension TokenConsumer {
@@ -1103,11 +1103,54 @@ extension Parser {
11031103
continue
11041104
}
11051105

1106-
// Check for a .name or .1 suffix.
1106+
// Check for a .name, .1, .name(), .name("Kiwi"), .name(fruit:),
1107+
// .name(_:), .name(fruit: "Kiwi) suffix.
11071108
if self.at(.period) {
11081109
let (unexpectedPeriod, period, declName, generics) = parseDottedExpressionSuffix(
11091110
previousNode: components.last?.raw ?? rootType?.raw ?? backslash.raw
11101111
)
1112+
1113+
// If fully applied method component, parse as a keypath method.
1114+
if self.experimentalFeatures.contains(.keypathWithMethodMembers)
1115+
&& self.at(.leftParen)
1116+
{
1117+
var (unexpectedBeforeLParen, leftParen) = self.expect(.leftParen)
1118+
if let generics = generics {
1119+
unexpectedBeforeLParen = RawUnexpectedNodesSyntax(
1120+
(unexpectedBeforeLParen?.elements ?? []) + [RawSyntax(generics)],
1121+
arena: self.arena
1122+
)
1123+
}
1124+
let args = self.parseArgumentListElements(
1125+
pattern: pattern,
1126+
allowTrailingComma: true
1127+
)
1128+
let (unexpectedBeforeRParen, rightParen) = self.expect(.rightParen)
1129+
1130+
components.append(
1131+
RawKeyPathComponentSyntax(
1132+
unexpectedPeriod,
1133+
period: period,
1134+
component: .method(
1135+
RawKeyPathMethodComponentSyntax(
1136+
declName: declName,
1137+
unexpectedBeforeLParen,
1138+
leftParen: leftParen,
1139+
arguments: RawLabeledExprListSyntax(
1140+
elements: args,
1141+
arena: self.arena
1142+
),
1143+
unexpectedBeforeRParen,
1144+
rightParen: rightParen,
1145+
arena: self.arena
1146+
)
1147+
),
1148+
arena: self.arena
1149+
)
1150+
)
1151+
continue
1152+
}
1153+
// Else, parse as a property.
11111154
components.append(
11121155
RawKeyPathComponentSyntax(
11131156
unexpectedPeriod,
@@ -1128,7 +1171,6 @@ extension Parser {
11281171
// No more postfix expressions.
11291172
break
11301173
}
1131-
11321174
return RawKeyPathExprSyntax(
11331175
unexpectedBeforeBackslash,
11341176
backslash: backslash,

0 commit comments

Comments
 (0)