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
1919extension 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