Skip to content

Commit 76e2cdc

Browse files
committed
ASTGen: Translate enum element payloads
1 parent fa1c9fd commit 76e2cdc

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

lib/ASTGen/Sources/ASTGen/ParameterClause.swift

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,65 @@ import SwiftSyntax
1818

1919
// MARK: - ParamDecl
2020

21+
fileprivate protocol ValueParameterSyntax: SyntaxProtocol {
22+
/// The `firstName` with optional type.
23+
///
24+
/// This is the lowest denominator between `FunctionParameterSyntax` and `EnumCaseParameterSyntax`.
25+
// FIXME: Rename once we support covariant witnesses.
26+
var optionalFirstName: TokenSyntax? { get }
27+
28+
var secondName: TokenSyntax? { get }
29+
30+
/// The `firstName` with optional type.
31+
///
32+
/// This is the lowest denominator between `FunctionParameterSyntax` and `EnumCaseParameterSyntax`.
33+
// FIXME: Rename once we support covariant witnesses.
34+
var optionalType: TypeSyntax? { get }
35+
36+
var defaultValue: InitializerClauseSyntax? { get }
37+
}
38+
39+
extension FunctionParameterSyntax: ValueParameterSyntax {
40+
fileprivate var optionalFirstName: TokenSyntax? {
41+
firstName
42+
}
43+
44+
fileprivate var optionalType: TypeSyntax? {
45+
type
46+
}
47+
}
48+
49+
extension EnumCaseParameterSyntax: ValueParameterSyntax {
50+
fileprivate var optionalFirstName: TokenSyntax? {
51+
firstName
52+
}
53+
54+
fileprivate var optionalType: TypeSyntax? {
55+
type
56+
}
57+
}
58+
2159
extension ASTGenVisitor {
2260
func visit(_ node: FunctionParameterSyntax) -> ASTNode {
61+
self.makeParamDecl(node)
62+
}
63+
64+
func visit(_ node: EnumCaseParameterSyntax) -> ASTNode {
65+
self.makeParamDecl(node)
66+
}
67+
68+
private func makeParamDecl(_ node: some ValueParameterSyntax) -> ASTNode {
2369
// FIXME: This location should be derived from the type repr.
2470
let specifierLoc: BridgedSourceLoc = nil
2571

2672
let firstName: BridgedIdentifier
27-
if node.firstName.tokenKind != .wildcard {
28-
// Swift AST represents "_" as nil.
29-
firstName = node.firstName.bridgedIdentifier(in: self)
30-
} else {
73+
if node.optionalFirstName?.tokenKind == .wildcard {
74+
// Swift AST represents "_" as a null identifier.
3175
firstName = nil
76+
} else {
77+
firstName = node.optionalFirstName.bridgedIdentifier(in: self)
3278
}
79+
3380
let (secondName, secondNameLoc) = node.secondName.bridgedIdentifierAndSourceLoc(in: self)
3481

3582
return .decl(
@@ -38,10 +85,10 @@ extension ASTGenVisitor {
3885
self.declContext,
3986
specifierLoc,
4087
firstName,
41-
self.bridgedSourceLoc(for: node.firstName),
88+
self.bridgedSourceLoc(for: node.optionalFirstName),
4289
secondName,
4390
secondNameLoc,
44-
self.visit(node.type).rawValue,
91+
self.visit(node.optionalType)?.rawValue,
4592
self.visit(node.defaultValue?.value)?.rawValue
4693
)
4794
)
@@ -62,6 +109,19 @@ extension ASTGenVisitor {
62109
)
63110
}
64111

112+
func visit(_ node: EnumCaseParameterClauseSyntax) -> ASTNode {
113+
.misc(
114+
ParameterList_create(
115+
self.ctx,
116+
self.bridgedSourceLoc(for: node.leftParen),
117+
node.parameters.lazy.map { self.visit($0).rawValue }.bridgedArray(in: self),
118+
self.bridgedSourceLoc(for: node.rightParen)
119+
)
120+
)
121+
}
122+
}
123+
124+
extension ASTGenVisitor {
65125
@inline(__always)
66126
func visit(_ node: FunctionParameterListSyntax) -> BridgedArrayRef {
67127
node.lazy.map { self.visit($0).rawValue }.bridgedArray(in: self)

test/ASTGen/verify-parse.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,14 @@ Enum<T>: Int, Proto1 where T: Proto1 {
116116
func method(_ b: Bool) {}
117117
}
118118

119+
enum WithPayload {
120+
case a(
121+
b: Int
122+
), c(
123+
d: Bool = false
124+
)
125+
}
126+
119127
struct
120128
Struct
121129
<

0 commit comments

Comments
 (0)