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