Skip to content

Commit 9b5dc51

Browse files
committed
Add supporting code.
1 parent b97ca6e commit 9b5dc51

14 files changed

+495
-3
lines changed

Diff for: Sources/SwiftParser/generated/ExperimentalFeatures.swift

+5
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ extension Parser.ExperimentalFeatures {
4848
/// Whether to enable the parsing of @abi attribute.
4949
public static let abiAttribute = Self (rawValue: 1 << 7)
5050

51+
/// Whether to enable the parsing of keypaths with method members.
52+
public static let keypathWithMethodMembers = Self (rawValue: 1 << 8)
53+
5154
/// Creates a new value representing the experimental feature with the
5255
/// given name, or returns nil if the name is not recognized.
5356
public init?(name: String) {
@@ -68,6 +71,8 @@ extension Parser.ExperimentalFeatures {
6871
self = .valueGenerics
6972
case "ABIAttribute":
7073
self = .abiAttribute
74+
case "KeypathWithMethodMembers":
75+
self = .keypathWithMethodMembers
7176
default:
7277
return nil
7378
}

Diff for: Sources/SwiftParserDiagnostics/generated/ChildNameForDiagnostics.swift

+2
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,8 @@ private func childNameForDiagnostics(_ keyPath: AnyKeyPath) -> String? {
206206
return "generic where clause"
207207
case \KeyPathExprSyntax.root:
208208
return "root"
209+
case \KeyPathMethodComponentSyntax.arguments:
210+
return "arguments"
209211
case \KeyPathSubscriptComponentSyntax.arguments:
210212
return "arguments"
211213
case \LabeledExprSyntax.label:

Diff for: Sources/SwiftParserDiagnostics/generated/SyntaxKindNameForDiagnostics.swift

+2
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ extension SyntaxKind {
249249
return "key path component"
250250
case .keyPathExpr:
251251
return "key path"
252+
case .keyPathMethodComponent:
253+
return "key path method component"
252254
case .keyPathOptionalComponent:
253255
return "key path optional component"
254256
case .keyPathPropertyComponent:

Diff for: Sources/SwiftSyntax/generated/ChildNameForKeyPath.swift

+18
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,24 @@ public func childName(_ keyPath: AnyKeyPath) -> String? {
19511951
return "components"
19521952
case \KeyPathExprSyntax.unexpectedAfterComponents:
19531953
return "unexpectedAfterComponents"
1954+
case \KeyPathMethodComponentSyntax.unexpectedBeforeDeclName:
1955+
return "unexpectedBeforeDeclName"
1956+
case \KeyPathMethodComponentSyntax.declName:
1957+
return "declName"
1958+
case \KeyPathMethodComponentSyntax.unexpectedBetweenDeclNameAndLeftParen:
1959+
return "unexpectedBetweenDeclNameAndLeftParen"
1960+
case \KeyPathMethodComponentSyntax.leftParen:
1961+
return "leftParen"
1962+
case \KeyPathMethodComponentSyntax.unexpectedBetweenLeftParenAndArguments:
1963+
return "unexpectedBetweenLeftParenAndArguments"
1964+
case \KeyPathMethodComponentSyntax.arguments:
1965+
return "arguments"
1966+
case \KeyPathMethodComponentSyntax.unexpectedBetweenArgumentsAndRightParen:
1967+
return "unexpectedBetweenArgumentsAndRightParen"
1968+
case \KeyPathMethodComponentSyntax.rightParen:
1969+
return "rightParen"
1970+
case \KeyPathMethodComponentSyntax.unexpectedAfterRightParen:
1971+
return "unexpectedAfterRightParen"
19541972
case \KeyPathOptionalComponentSyntax.unexpectedBeforeQuestionOrExclamationMark:
19551973
return "unexpectedBeforeQuestionOrExclamationMark"
19561974
case \KeyPathOptionalComponentSyntax.questionOrExclamationMark:

Diff for: Sources/SwiftSyntax/generated/SyntaxAnyVisitor.swift

+10
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,16 @@ open class SyntaxAnyVisitor: SyntaxVisitor {
13241324
visitAnyPost(node._syntaxNode)
13251325
}
13261326

1327+
@_spi(ExperimentalLanguageFeatures)
1328+
override open func visit(_ node: KeyPathMethodComponentSyntax) -> SyntaxVisitorContinueKind {
1329+
return visitAny(node._syntaxNode)
1330+
}
1331+
1332+
@_spi(ExperimentalLanguageFeatures)
1333+
override open func visitPost(_ node: KeyPathMethodComponentSyntax) {
1334+
visitAnyPost(node._syntaxNode)
1335+
}
1336+
13271337
override open func visit(_ node: KeyPathOptionalComponentSyntax) -> SyntaxVisitorContinueKind {
13281338
return visitAny(node._syntaxNode)
13291339
}

Diff for: Sources/SwiftSyntax/generated/SyntaxBaseNodes.swift

+1
Original file line numberDiff line numberDiff line change
@@ -1676,6 +1676,7 @@ extension Syntax {
16761676
.node(KeyPathComponentListSyntax.self),
16771677
.node(KeyPathComponentSyntax.self),
16781678
.node(KeyPathExprSyntax.self),
1679+
.node(KeyPathMethodComponentSyntax.self),
16791680
.node(KeyPathOptionalComponentSyntax.self),
16801681
.node(KeyPathPropertyComponentSyntax.self),
16811682
.node(KeyPathSubscriptComponentSyntax.self),

Diff for: Sources/SwiftSyntax/generated/SyntaxEnum.swift

+4
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ public enum SyntaxEnum: Sendable {
178178
case keyPathComponentList(KeyPathComponentListSyntax)
179179
case keyPathComponent(KeyPathComponentSyntax)
180180
case keyPathExpr(KeyPathExprSyntax)
181+
@_spi(ExperimentalLanguageFeatures)
182+
case keyPathMethodComponent(KeyPathMethodComponentSyntax)
181183
case keyPathOptionalComponent(KeyPathOptionalComponentSyntax)
182184
case keyPathPropertyComponent(KeyPathPropertyComponentSyntax)
183185
case keyPathSubscriptComponent(KeyPathSubscriptComponentSyntax)
@@ -638,6 +640,8 @@ extension Syntax {
638640
return .keyPathComponent(KeyPathComponentSyntax(self)!)
639641
case .keyPathExpr:
640642
return .keyPathExpr(KeyPathExprSyntax(self)!)
643+
case .keyPathMethodComponent:
644+
return .keyPathMethodComponent(KeyPathMethodComponentSyntax(self)!)
641645
case .keyPathOptionalComponent:
642646
return .keyPathOptionalComponent(KeyPathOptionalComponentSyntax(self)!)
643647
case .keyPathPropertyComponent:

Diff for: Sources/SwiftSyntax/generated/SyntaxKind.swift

+4
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ public enum SyntaxKind: Sendable {
178178
case keyPathComponentList
179179
case keyPathComponent
180180
case keyPathExpr
181+
@_spi(ExperimentalLanguageFeatures)
182+
case keyPathMethodComponent
181183
case keyPathOptionalComponent
182184
case keyPathPropertyComponent
183185
case keyPathSubscriptComponent
@@ -763,6 +765,8 @@ public enum SyntaxKind: Sendable {
763765
return KeyPathComponentSyntax.self
764766
case .keyPathExpr:
765767
return KeyPathExprSyntax.self
768+
case .keyPathMethodComponent:
769+
return KeyPathMethodComponentSyntax.self
766770
case .keyPathOptionalComponent:
767771
return KeyPathOptionalComponentSyntax.self
768772
case .keyPathPropertyComponent:

Diff for: Sources/SwiftSyntax/generated/SyntaxRewriter.swift

+17
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,14 @@ open class SyntaxRewriter {
12031203
return ExprSyntax(KeyPathExprSyntax(unsafeCasting: visitChildren(node._syntaxNode)))
12041204
}
12051205

1206+
/// Visit a `KeyPathMethodComponentSyntax`.
1207+
/// - Parameter node: the node that is being visited
1208+
/// - Returns: the rewritten node
1209+
@_spi(ExperimentalLanguageFeatures)
1210+
open func visit(_ node: KeyPathMethodComponentSyntax) -> KeyPathMethodComponentSyntax {
1211+
return KeyPathMethodComponentSyntax(unsafeCasting: visitChildren(node._syntaxNode))
1212+
}
1213+
12061214
/// Visit a ``KeyPathOptionalComponentSyntax``.
12071215
/// - Parameter node: the node that is being visited
12081216
/// - Returns: the rewritten node
@@ -2964,6 +2972,11 @@ open class SyntaxRewriter {
29642972
Syntax(visit(KeyPathExprSyntax(unsafeCasting: node)))
29652973
}
29662974

2975+
@inline(never)
2976+
private func visitKeyPathMethodComponentSyntaxImpl(_ node: Syntax) -> Syntax {
2977+
Syntax(visit(KeyPathMethodComponentSyntax(unsafeCasting: node)))
2978+
}
2979+
29672980
@inline(never)
29682981
private func visitKeyPathOptionalComponentSyntaxImpl(_ node: Syntax) -> Syntax {
29692982
Syntax(visit(KeyPathOptionalComponentSyntax(unsafeCasting: node)))
@@ -3971,6 +3984,8 @@ open class SyntaxRewriter {
39713984
return self.visitKeyPathComponentSyntaxImpl(_:)
39723985
case .keyPathExpr:
39733986
return self.visitKeyPathExprSyntaxImpl(_:)
3987+
case .keyPathMethodComponent:
3988+
return self.visitKeyPathMethodComponentSyntaxImpl(_:)
39743989
case .keyPathOptionalComponent:
39753990
return self.visitKeyPathOptionalComponentSyntaxImpl(_:)
39763991
case .keyPathPropertyComponent:
@@ -4561,6 +4576,8 @@ open class SyntaxRewriter {
45614576
return visitKeyPathComponentSyntaxImpl(node)
45624577
case .keyPathExpr:
45634578
return visitKeyPathExprSyntaxImpl(node)
4579+
case .keyPathMethodComponent:
4580+
return visitKeyPathMethodComponentSyntaxImpl(node)
45644581
case .keyPathOptionalComponent:
45654582
return visitKeyPathOptionalComponentSyntaxImpl(node)
45664583
case .keyPathPropertyComponent:

Diff for: Sources/SwiftSyntax/generated/SyntaxVisitor.swift

+26
Original file line numberDiff line numberDiff line change
@@ -1930,6 +1930,20 @@ open class SyntaxVisitor {
19301930
open func visitPost(_ node: KeyPathExprSyntax) {
19311931
}
19321932

1933+
/// Visiting `KeyPathMethodComponentSyntax` specifically.
1934+
/// - Parameter node: the node we are visiting.
1935+
/// - Returns: how should we continue visiting.
1936+
@_spi(ExperimentalLanguageFeatures)
1937+
open func visit(_ node: KeyPathMethodComponentSyntax) -> SyntaxVisitorContinueKind {
1938+
return .visitChildren
1939+
}
1940+
1941+
/// The function called after visiting `KeyPathMethodComponentSyntax` and its descendants.
1942+
/// - node: the node we just finished visiting.
1943+
@_spi(ExperimentalLanguageFeatures)
1944+
open func visitPost(_ node: KeyPathMethodComponentSyntax) {
1945+
}
1946+
19331947
/// Visiting ``KeyPathOptionalComponentSyntax`` specifically.
19341948
/// - Parameter node: the node we are visiting.
19351949
/// - Returns: how should we continue visiting.
@@ -4811,6 +4825,14 @@ open class SyntaxVisitor {
48114825
visitPost(KeyPathExprSyntax(unsafeCasting: node))
48124826
}
48134827

4828+
@inline(never)
4829+
private func visitKeyPathMethodComponentSyntaxImpl(_ node: Syntax) {
4830+
if visit(KeyPathMethodComponentSyntax(unsafeCasting: node)) == .visitChildren {
4831+
visitChildren(node)
4832+
}
4833+
visitPost(KeyPathMethodComponentSyntax(unsafeCasting: node))
4834+
}
4835+
48144836
@inline(never)
48154837
private func visitKeyPathOptionalComponentSyntaxImpl(_ node: Syntax) {
48164838
if visit(KeyPathOptionalComponentSyntax(unsafeCasting: node)) == .visitChildren {
@@ -6217,6 +6239,8 @@ open class SyntaxVisitor {
62176239
return self.visitKeyPathComponentSyntaxImpl(_:)
62186240
case .keyPathExpr:
62196241
return self.visitKeyPathExprSyntaxImpl(_:)
6242+
case .keyPathMethodComponent:
6243+
return self.visitKeyPathMethodComponentSyntaxImpl(_:)
62206244
case .keyPathOptionalComponent:
62216245
return self.visitKeyPathOptionalComponentSyntaxImpl(_:)
62226246
case .keyPathPropertyComponent:
@@ -6807,6 +6831,8 @@ open class SyntaxVisitor {
68076831
self.visitKeyPathComponentSyntaxImpl(node)
68086832
case .keyPathExpr:
68096833
self.visitKeyPathExprSyntaxImpl(node)
6834+
case .keyPathMethodComponent:
6835+
self.visitKeyPathMethodComponentSyntaxImpl(node)
68106836
case .keyPathOptionalComponent:
68116837
self.visitKeyPathOptionalComponentSyntaxImpl(node)
68126838
case .keyPathPropertyComponent:

Diff for: Sources/SwiftSyntax/generated/raw/RawSyntaxNodesJKLMN.swift

+103-1
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,22 @@ public struct RawKeyPathComponentListSyntax: RawSyntaxNodeProtocol {
6666
public struct RawKeyPathComponentSyntax: RawSyntaxNodeProtocol {
6767
public enum Component: RawSyntaxNodeProtocol {
6868
case property(RawKeyPathPropertyComponentSyntax)
69+
/// - Note: Requires experimental feature `keypathWithMethodMembers`.
70+
@_spi(ExperimentalLanguageFeatures)
71+
case method(RawKeyPathMethodComponentSyntax)
6972
case `subscript`(RawKeyPathSubscriptComponentSyntax)
7073
case optional(RawKeyPathOptionalComponentSyntax)
7174

7275
public static func isKindOf(_ raw: RawSyntax) -> Bool {
73-
RawKeyPathPropertyComponentSyntax.isKindOf(raw) || RawKeyPathSubscriptComponentSyntax.isKindOf(raw) || RawKeyPathOptionalComponentSyntax.isKindOf(raw)
76+
RawKeyPathPropertyComponentSyntax.isKindOf(raw) || RawKeyPathMethodComponentSyntax.isKindOf(raw) || RawKeyPathSubscriptComponentSyntax.isKindOf(raw) || RawKeyPathOptionalComponentSyntax.isKindOf(raw)
7477
}
7578

7679
public var raw: RawSyntax {
7780
switch self {
7881
case .property(let node):
7982
return node.raw
83+
case .method(let node):
84+
return node.raw
8085
case .subscript(let node):
8186
return node.raw
8287
case .optional(let node):
@@ -87,6 +92,8 @@ public struct RawKeyPathComponentSyntax: RawSyntaxNodeProtocol {
8792
public init?(_ node: __shared some RawSyntaxNodeProtocol) {
8893
if let node = node.as(RawKeyPathPropertyComponentSyntax.self) {
8994
self = .property(node)
95+
} else if let node = node.as(RawKeyPathMethodComponentSyntax.self) {
96+
self = .method(node)
9097
} else if let node = node.as(RawKeyPathSubscriptComponentSyntax.self) {
9198
self = .subscript(node)
9299
} else if let node = node.as(RawKeyPathOptionalComponentSyntax.self) {
@@ -247,6 +254,101 @@ public struct RawKeyPathExprSyntax: RawExprSyntaxNodeProtocol {
247254
}
248255
}
249256

257+
@_spi(ExperimentalLanguageFeatures)
258+
@_spi(RawSyntax)
259+
public struct RawKeyPathMethodComponentSyntax: RawSyntaxNodeProtocol {
260+
@_spi(RawSyntax)
261+
public var layoutView: RawSyntaxLayoutView {
262+
return raw.layoutView!
263+
}
264+
265+
public static func isKindOf(_ raw: RawSyntax) -> Bool {
266+
return raw.kind == .keyPathMethodComponent
267+
}
268+
269+
public var raw: RawSyntax
270+
271+
init(raw: RawSyntax) {
272+
precondition(Self.isKindOf(raw))
273+
self.raw = raw
274+
}
275+
276+
private init(unchecked raw: RawSyntax) {
277+
self.raw = raw
278+
}
279+
280+
public init?(_ other: some RawSyntaxNodeProtocol) {
281+
guard Self.isKindOf(other.raw) else {
282+
return nil
283+
}
284+
self.init(unchecked: other.raw)
285+
}
286+
287+
public init(
288+
_ unexpectedBeforeDeclName: RawUnexpectedNodesSyntax? = nil,
289+
declName: RawDeclReferenceExprSyntax,
290+
_ unexpectedBetweenDeclNameAndLeftParen: RawUnexpectedNodesSyntax? = nil,
291+
leftParen: RawTokenSyntax,
292+
_ unexpectedBetweenLeftParenAndArguments: RawUnexpectedNodesSyntax? = nil,
293+
arguments: RawLabeledExprListSyntax,
294+
_ unexpectedBetweenArgumentsAndRightParen: RawUnexpectedNodesSyntax? = nil,
295+
rightParen: RawTokenSyntax,
296+
_ unexpectedAfterRightParen: RawUnexpectedNodesSyntax? = nil,
297+
arena: __shared RawSyntaxArena
298+
) {
299+
let raw = RawSyntax.makeLayout(
300+
kind: .keyPathMethodComponent, uninitializedCount: 9, arena: arena) { layout in
301+
layout.initialize(repeating: nil)
302+
layout[0] = unexpectedBeforeDeclName?.raw
303+
layout[1] = declName.raw
304+
layout[2] = unexpectedBetweenDeclNameAndLeftParen?.raw
305+
layout[3] = leftParen.raw
306+
layout[4] = unexpectedBetweenLeftParenAndArguments?.raw
307+
layout[5] = arguments.raw
308+
layout[6] = unexpectedBetweenArgumentsAndRightParen?.raw
309+
layout[7] = rightParen.raw
310+
layout[8] = unexpectedAfterRightParen?.raw
311+
}
312+
self.init(unchecked: raw)
313+
}
314+
315+
public var unexpectedBeforeDeclName: RawUnexpectedNodesSyntax? {
316+
layoutView.children[0].map(RawUnexpectedNodesSyntax.init(raw:))
317+
}
318+
319+
public var declName: RawDeclReferenceExprSyntax {
320+
layoutView.children[1].map(RawDeclReferenceExprSyntax.init(raw:))!
321+
}
322+
323+
public var unexpectedBetweenDeclNameAndLeftParen: RawUnexpectedNodesSyntax? {
324+
layoutView.children[2].map(RawUnexpectedNodesSyntax.init(raw:))
325+
}
326+
327+
public var leftParen: RawTokenSyntax {
328+
layoutView.children[3].map(RawTokenSyntax.init(raw:))!
329+
}
330+
331+
public var unexpectedBetweenLeftParenAndArguments: RawUnexpectedNodesSyntax? {
332+
layoutView.children[4].map(RawUnexpectedNodesSyntax.init(raw:))
333+
}
334+
335+
public var arguments: RawLabeledExprListSyntax {
336+
layoutView.children[5].map(RawLabeledExprListSyntax.init(raw:))!
337+
}
338+
339+
public var unexpectedBetweenArgumentsAndRightParen: RawUnexpectedNodesSyntax? {
340+
layoutView.children[6].map(RawUnexpectedNodesSyntax.init(raw:))
341+
}
342+
343+
public var rightParen: RawTokenSyntax {
344+
layoutView.children[7].map(RawTokenSyntax.init(raw:))!
345+
}
346+
347+
public var unexpectedAfterRightParen: RawUnexpectedNodesSyntax? {
348+
layoutView.children[8].map(RawUnexpectedNodesSyntax.init(raw:))
349+
}
350+
}
351+
250352
@_spi(RawSyntax)
251353
public struct RawKeyPathOptionalComponentSyntax: RawSyntaxNodeProtocol {
252354
@_spi(RawSyntax)

Diff for: Sources/SwiftSyntax/generated/raw/RawSyntaxValidation.swift

+14
Original file line numberDiff line numberDiff line change
@@ -1822,6 +1822,18 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
18221822
assertNoError(kind, 5, verify(layout[5], as: RawKeyPathComponentListSyntax.self))
18231823
assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self))
18241824
}
1825+
func validateKeyPathMethodComponentSyntax(kind: SyntaxKind, layout: RawSyntaxBuffer) {
1826+
assert(layout.count == 9)
1827+
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
1828+
assertNoError(kind, 1, verify(layout[1], as: RawDeclReferenceExprSyntax.self))
1829+
assertNoError(kind, 2, verify(layout[2], as: RawUnexpectedNodesSyntax?.self))
1830+
assertNoError(kind, 3, verify(layout[3], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.leftParen)]))
1831+
assertNoError(kind, 4, verify(layout[4], as: RawUnexpectedNodesSyntax?.self))
1832+
assertNoError(kind, 5, verify(layout[5], as: RawLabeledExprListSyntax.self))
1833+
assertNoError(kind, 6, verify(layout[6], as: RawUnexpectedNodesSyntax?.self))
1834+
assertNoError(kind, 7, verify(layout[7], as: RawTokenSyntax.self, tokenChoices: [.tokenKind(.rightParen)]))
1835+
assertNoError(kind, 8, verify(layout[8], as: RawUnexpectedNodesSyntax?.self))
1836+
}
18251837
func validateKeyPathOptionalComponentSyntax(kind: SyntaxKind, layout: RawSyntaxBuffer) {
18261838
assert(layout.count == 3)
18271839
assertNoError(kind, 0, verify(layout[0], as: RawUnexpectedNodesSyntax?.self))
@@ -3462,6 +3474,8 @@ func validateLayout(layout: RawSyntaxBuffer, as kind: SyntaxKind) {
34623474
validateKeyPathComponentSyntax(kind: kind, layout: layout)
34633475
case .keyPathExpr:
34643476
validateKeyPathExprSyntax(kind: kind, layout: layout)
3477+
case .keyPathMethodComponent:
3478+
validateKeyPathMethodComponentSyntax(kind: kind, layout: layout)
34653479
case .keyPathOptionalComponent:
34663480
validateKeyPathOptionalComponentSyntax(kind: kind, layout: layout)
34673481
case .keyPathPropertyComponent:

0 commit comments

Comments
 (0)