15
15
#else
16
16
@_spi ( RawSyntax) import SwiftSyntax
17
17
#endif
18
-
18
+ #if compiler(>=5.8)
19
+ @_spi ( RawSyntax) @_spi ( ExperimentalLanguageFeatures) internal import SwiftSyntax
20
+ #endif
19
21
extension TokenConsumer {
20
22
mutating func atStartOfExpression( ) -> Bool {
21
23
switch self . at ( anyIn: ExpressionStart . self) {
@@ -1103,11 +1105,54 @@ extension Parser {
1103
1105
continue
1104
1106
}
1105
1107
1106
- // Check for a .name or .1 suffix.
1108
+ // Check for a .name, .1, .name(), .name("Kiwi"), .name(fruit:),
1109
+ // .name(_:), .name(fruit: "Kiwi) suffix.
1107
1110
if self . at ( . period) {
1108
1111
let ( unexpectedPeriod, period, declName, generics) = parseDottedExpressionSuffix (
1109
1112
previousNode: components. last? . raw ?? rootType? . raw ?? backslash. raw
1110
1113
)
1114
+
1115
+ // If fully applied method component, parse as a keypath method..
1116
+ if self . experimentalFeatures. contains ( . keypathWithMethodMembers)
1117
+ && self . at ( . leftParen)
1118
+ {
1119
+ var ( unexpectedBeforeLParen, leftParen) = self . expect ( . leftParen)
1120
+ if let generics = generics {
1121
+ unexpectedBeforeLParen = RawUnexpectedNodesSyntax (
1122
+ ( unexpectedBeforeLParen? . elements ?? [ ] ) + [ RawSyntax ( generics) ] ,
1123
+ arena: self . arena
1124
+ )
1125
+ }
1126
+ let args = self . parseArgumentListElements (
1127
+ pattern: pattern,
1128
+ allowTrailingComma: true
1129
+ )
1130
+ let ( unexpectedBeforeRParen, rightParen) = self . expect ( . rightParen)
1131
+
1132
+ components. append (
1133
+ RawKeyPathComponentSyntax (
1134
+ unexpectedPeriod,
1135
+ period: period,
1136
+ component: . method(
1137
+ RawKeyPathMethodComponentSyntax (
1138
+ declName: declName,
1139
+ unexpectedBeforeLParen,
1140
+ leftParen: leftParen,
1141
+ arguments: RawLabeledExprListSyntax (
1142
+ elements: args,
1143
+ arena: self . arena
1144
+ ) ,
1145
+ unexpectedBeforeRParen,
1146
+ rightParen: rightParen,
1147
+ arena: self . arena
1148
+ )
1149
+ ) ,
1150
+ arena: self . arena
1151
+ )
1152
+ )
1153
+ continue
1154
+ }
1155
+ // Else, parse as a property.
1111
1156
components. append (
1112
1157
RawKeyPathComponentSyntax (
1113
1158
unexpectedPeriod,
@@ -1128,7 +1173,6 @@ extension Parser {
1128
1173
// No more postfix expressions.
1129
1174
break
1130
1175
}
1131
-
1132
1176
return RawKeyPathExprSyntax (
1133
1177
unexpectedBeforeBackslash,
1134
1178
backslash: backslash,
0 commit comments