11
11
//===----------------------------------------------------------------------===//
12
12
13
13
#if compiler(>=6)
14
- @_spi ( RawSyntax) internal import SwiftSyntax
14
+ @_spi ( RawSyntax) @ _spi ( ExperimentalLanguageFeatures ) internal import SwiftSyntax
15
15
#else
16
- @_spi ( RawSyntax) import SwiftSyntax
16
+ @_spi ( RawSyntax) @ _spi ( ExperimentalLanguageFeatures ) import SwiftSyntax
17
17
#endif
18
18
19
19
extension TokenConsumer {
@@ -1115,11 +1115,54 @@ extension Parser {
1115
1115
continue
1116
1116
}
1117
1117
1118
- // Check for a .name or .1 suffix.
1118
+ // Check for a .name, .1, .name(), .name("Kiwi"), .name(fruit:),
1119
+ // .name(_:), .name(fruit: "Kiwi) suffix.
1119
1120
if self . at ( . period) {
1120
1121
let ( unexpectedPeriod, period, declName, generics) = parseDottedExpressionSuffix (
1121
1122
previousNode: components. last? . raw ?? rootType? . raw ?? backslash. raw
1122
1123
)
1124
+
1125
+ // If fully applied method component, parse as a keypath method.
1126
+ if self . experimentalFeatures. contains ( . keypathWithMethodMembers)
1127
+ && self . at ( . leftParen)
1128
+ {
1129
+ var ( unexpectedBeforeLParen, leftParen) = self . expect ( . leftParen)
1130
+ if let generics = generics {
1131
+ unexpectedBeforeLParen = RawUnexpectedNodesSyntax (
1132
+ ( unexpectedBeforeLParen? . elements ?? [ ] ) + [ RawSyntax ( generics) ] ,
1133
+ arena: self . arena
1134
+ )
1135
+ }
1136
+ let args = self . parseArgumentListElements (
1137
+ pattern: pattern,
1138
+ allowTrailingComma: true
1139
+ )
1140
+ let ( unexpectedBeforeRParen, rightParen) = self . expect ( . rightParen)
1141
+
1142
+ components. append (
1143
+ RawKeyPathComponentSyntax (
1144
+ unexpectedPeriod,
1145
+ period: period,
1146
+ component: . method(
1147
+ RawKeyPathMethodComponentSyntax (
1148
+ declName: declName,
1149
+ unexpectedBeforeLParen,
1150
+ leftParen: leftParen,
1151
+ arguments: RawLabeledExprListSyntax (
1152
+ elements: args,
1153
+ arena: self . arena
1154
+ ) ,
1155
+ unexpectedBeforeRParen,
1156
+ rightParen: rightParen,
1157
+ arena: self . arena
1158
+ )
1159
+ ) ,
1160
+ arena: self . arena
1161
+ )
1162
+ )
1163
+ continue
1164
+ }
1165
+ // Else, parse as a property.
1123
1166
components. append (
1124
1167
RawKeyPathComponentSyntax (
1125
1168
unexpectedPeriod,
@@ -1140,7 +1183,6 @@ extension Parser {
1140
1183
// No more postfix expressions.
1141
1184
break
1142
1185
}
1143
-
1144
1186
return RawKeyPathExprSyntax (
1145
1187
unexpectedBeforeBackslash,
1146
1188
backslash: backslash,
0 commit comments