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 {
@@ -1103,11 +1103,54 @@ extension Parser {
1103
1103
continue
1104
1104
}
1105
1105
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.
1107
1108
if self . at ( . period) {
1108
1109
let ( unexpectedPeriod, period, declName, generics) = parseDottedExpressionSuffix (
1109
1110
previousNode: components. last? . raw ?? rootType? . raw ?? backslash. raw
1110
1111
)
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.
1111
1154
components. append (
1112
1155
RawKeyPathComponentSyntax (
1113
1156
unexpectedPeriod,
@@ -1128,7 +1171,6 @@ extension Parser {
1128
1171
// No more postfix expressions.
1129
1172
break
1130
1173
}
1131
-
1132
1174
return RawKeyPathExprSyntax (
1133
1175
unexpectedBeforeBackslash,
1134
1176
backslash: backslash,
0 commit comments