Skip to content

Commit 94c6987

Browse files
committed
[ASTGen] Reduce usage of generate(choices:)
`generate(choices:)` is not good because it expects "ASTNode". Not all `SyntaxChildChoices` can generate ASTNode. * `generate(codeBlockItem:)` to manually switch over the cases * switch on `IfExpr.ElseBody` insdie `makeIfStmt()`, now supports `else if` case
1 parent 23effda commit 94c6987

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

lib/ASTGen/Sources/ASTGen/ASTGen.swift

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,14 @@ extension ASTGenVisitor {
241241
}
242242

243243
public func generate(codeBlockItem node: CodeBlockItemSyntax) -> ASTNode {
244-
generate(choices: node.item)
244+
switch node.item {
245+
case .decl(let node):
246+
return .decl(self.generate(decl: node))
247+
case .stmt(let node):
248+
return .stmt(self.generate(stmt: node))
249+
case .expr(let node):
250+
return .expr(self.generate(expr: node))
251+
}
245252
}
246253

247254
public func generate(arrayElement node: ArrayElementSyntax) -> BridgedExpr {
@@ -275,16 +282,6 @@ extension ASTGenVisitor {
275282
return self.generate(expr: node)
276283
}
277284

278-
/// DO NOT introduce another usage of this. Not all choices can produce 'ASTNode'.
279-
@inline(__always)
280-
func generate(optional node: (some SyntaxChildChoices)?) -> ASTNode? {
281-
guard let node else {
282-
return nil
283-
}
284-
285-
return self.generate(choices: node)
286-
}
287-
288285
@inline(__always)
289286
func generate(optional node: GenericParameterClauseSyntax?) -> BridgedGenericParamList? {
290287
guard let node else {
@@ -329,6 +326,15 @@ extension ASTGenVisitor {
329326

330327
return self.generate(precedenceGroupNameList: node)
331328
}
329+
330+
/// Generate AST from an optional node.
331+
/// This is `node.map(body)` but with `self.generate(...)` syntax.
332+
/// Usage:
333+
/// self.generate(optional: node.initializer, generate(expr:))
334+
@inline(__always)
335+
func generate<T: SyntaxProtocol, U>(optional node: T?, _ body: (T) -> U) -> U? {
336+
return node.map(body)
337+
}
332338
}
333339

334340
extension Collection {

lib/ASTGen/Sources/ASTGen/Stmts.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,14 @@ extension ASTGenVisitor {
7575
condition: conditions.first!.castToExpr,
7676
thenStmt: self.generate(codeBlock: node.body).asStmt,
7777
elseLoc: node.elseKeyword.bridgedSourceLoc(in: self),
78-
elseStmt: (self.generate(optional: node.elseBody)?.castToStmt).asNullable
78+
elseStmt: self.generate(optional: node.elseBody) {
79+
switch $0 {
80+
case .codeBlock(let node):
81+
return self.generate(codeBlock: node).asStmt
82+
case .ifExpr(let node):
83+
return self.makeIfStmt(node).asStmt
84+
}
85+
}.asNullable
7986
)
8087
}
8188

test/ASTGen/verify-parse.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ func test5(_ b: Swift.Bool) -> Int {
7676
return if b { 0 } else { 1 }
7777
}
7878

79-
func test6(_ b: Bool) -> Int {
80-
let x = if b { 0 } else { 1 }
79+
func test6(_ b1: Bool, b2: Bool) -> Int {
80+
let x = if b1 { 0 } else if b2 { 1 } else { 2 }
8181
return x
8282
}
8383

0 commit comments

Comments
 (0)