Skip to content

Commit c7b2500

Browse files
authored
Merge pull request #2477 from RoBo-Inc/build_expression_overload
buildExpression overload for ListBuilder proposal
2 parents bff0b28 + a6197d8 commit c7b2500

File tree

3 files changed

+85
-25
lines changed

3 files changed

+85
-25
lines changed

Sources/SwiftSyntaxBuilder/ListBuilder.swift

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public protocol ListBuilder {
3232
/// Provides contextual type information for statement
3333
/// expressions to translate them into partial results.
3434
static func buildExpression(_ expression: Expression) -> Component
35+
static func buildExpression(_ expression: some Sequence<Expression>) -> Component
3536

3637
/// Add all the elements of `expression` to this result builder, effectively flattening them.
3738
///
@@ -66,39 +67,42 @@ public protocol ListBuilder {
6667
static func buildFinalResult(_ component: Component) -> FinalResult
6768
}
6869

69-
public extension ListBuilder {
70-
static func buildBlock(_ components: Component...) -> Component {
70+
extension ListBuilder {
71+
public static func buildBlock(_ components: Component...) -> Component {
7172
components.flatMap { $0 }
7273
}
73-
static func buildExpression(_ expression: Expression) -> Component {
74+
public static func buildExpression(_ expression: Expression) -> Component {
7475
[expression]
7576
}
77+
public static func buildExpression(_ expression: some Sequence<Expression>) -> Component {
78+
.init(expression)
79+
}
7680
@_disfavoredOverload
77-
static func buildExpression(_ expression: FinalResult) -> Component {
81+
public static func buildExpression(_ expression: FinalResult) -> Component {
7882
expression.map { $0 }
7983
}
80-
static func buildOptional(_ component: Component?) -> Component {
84+
public static func buildOptional(_ component: Component?) -> Component {
8185
component ?? []
8286
}
83-
static func buildEither(first component: Component) -> Component {
87+
public static func buildEither(first component: Component) -> Component {
8488
component
8589
}
86-
static func buildEither(second component: Component) -> Component {
90+
public static func buildEither(second component: Component) -> Component {
8791
component
8892
}
89-
static func buildArray(_ components: [Component]) -> Component {
93+
public static func buildArray(_ components: [Component]) -> Component {
9094
components.flatMap { $0 }
9195
}
92-
static func buildLimitedAvailability(_ component: Component) -> Component {
96+
public static func buildLimitedAvailability(_ component: Component) -> Component {
9397
component
9498
}
95-
static func buildFinalResult(_ component: Component) -> FinalResult {
99+
public static func buildFinalResult(_ component: Component) -> FinalResult {
96100
.init(component)
97101
}
98102
}
99103

100-
public extension ListBuilder where Expression: WithTrailingCommaSyntax {
101-
static func buildFinalResult(_ component: Component) -> FinalResult {
104+
extension ListBuilder where Expression: WithTrailingCommaSyntax {
105+
public static func buildFinalResult(_ component: Component) -> FinalResult {
102106
.init(
103107
component.enumerated().map { index, expression in
104108
index < component.endIndex - 1 ? expression.ensuringTrailingComma() : expression

Sources/SwiftSyntaxBuilder/ResultBuilderExtensions.swift

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,50 +14,90 @@ import SwiftSyntax
1414

1515
extension CodeBlockItemListBuilder {
1616
public static func buildExpression(_ expression: some ExprSyntaxProtocol) -> Component {
17-
return buildExpression(CodeBlockItemSyntax(item: .expr(ExprSyntax(expression))))
17+
buildExpression(CodeBlockItemSyntax(item: .expr(ExprSyntax(expression))))
18+
}
19+
20+
public static func buildExpression(_ expression: some Sequence<ExprSyntaxProtocol>) -> Component {
21+
buildExpression(expression.map { CodeBlockItemSyntax(item: .expr(ExprSyntax($0))) })
1822
}
1923

2024
public static func buildExpression(_ expression: some StmtSyntaxProtocol) -> Component {
21-
return buildExpression(CodeBlockItemSyntax(item: .stmt(StmtSyntax(expression))))
25+
buildExpression(CodeBlockItemSyntax(item: .stmt(StmtSyntax(expression))))
26+
}
27+
28+
public static func buildExpression(_ expression: some Sequence<StmtSyntaxProtocol>) -> Component {
29+
buildExpression(expression.map { CodeBlockItemSyntax(item: .stmt(StmtSyntax($0))) })
2230
}
2331

2432
public static func buildExpression(_ expression: some DeclSyntaxProtocol) -> Component {
25-
return buildExpression(CodeBlockItemSyntax(item: .decl(DeclSyntax(expression))))
33+
buildExpression(CodeBlockItemSyntax(item: .decl(DeclSyntax(expression))))
34+
}
35+
36+
public static func buildExpression(_ expression: some Sequence<DeclSyntaxProtocol>) -> Component {
37+
buildExpression(expression.map { CodeBlockItemSyntax(item: .decl(DeclSyntax($0))) })
2638
}
2739
}
2840

2941
extension ConditionElementListBuilder {
3042
public static func buildExpression(_ expression: some ExprSyntaxProtocol) -> Component {
31-
return buildExpression(ConditionElementSyntax(condition: .expression(ExprSyntax(expression))))
43+
buildExpression(ConditionElementSyntax(condition: .expression(ExprSyntax(expression))))
44+
}
45+
46+
public static func buildExpression(_ expression: some Sequence<ExprSyntaxProtocol>) -> Component {
47+
buildExpression(expression.map { ConditionElementSyntax(condition: .expression(ExprSyntax($0))) })
3248
}
3349

3450
public static func buildExpression(_ expression: AvailabilityConditionSyntax) -> Component {
35-
return buildExpression(ConditionElementSyntax(condition: .availability(expression)))
51+
buildExpression(ConditionElementSyntax(condition: .availability(expression)))
52+
}
53+
54+
public static func buildExpression(_ expression: some Sequence<AvailabilityConditionSyntax>) -> Component {
55+
buildExpression(expression.map { ConditionElementSyntax(condition: .availability($0)) })
3656
}
3757

3858
public static func buildExpression(_ expression: MatchingPatternConditionSyntax) -> Component {
39-
return buildExpression(ConditionElementSyntax(condition: .matchingPattern(expression)))
59+
buildExpression(ConditionElementSyntax(condition: .matchingPattern(expression)))
60+
}
61+
62+
public static func buildExpression(_ expression: some Sequence<MatchingPatternConditionSyntax>) -> Component {
63+
buildExpression(expression.map { ConditionElementSyntax(condition: .matchingPattern($0)) })
4064
}
4165

4266
public static func buildExpression(_ expression: OptionalBindingConditionSyntax) -> Component {
43-
return buildExpression(ConditionElementSyntax(condition: .optionalBinding(expression)))
67+
buildExpression(ConditionElementSyntax(condition: .optionalBinding(expression)))
68+
}
69+
70+
public static func buildExpression(_ expression: some Sequence<OptionalBindingConditionSyntax>) -> Component {
71+
buildExpression(expression.map { ConditionElementSyntax(condition: .optionalBinding($0)) })
4472
}
4573
}
4674

4775
extension MemberBlockItemListBuilder {
4876
public static func buildExpression(_ expression: some DeclSyntaxProtocol) -> Component {
49-
return buildExpression(MemberBlockItemSyntax(decl: expression))
77+
buildExpression(MemberBlockItemSyntax(decl: expression))
78+
}
79+
80+
public static func buildExpression(_ expression: some Sequence<DeclSyntaxProtocol>) -> Component {
81+
buildExpression(expression.map { MemberBlockItemSyntax(decl: $0) })
5082
}
5183
}
5284

5385
extension ExprListBuilder {
5486
public static func buildExpression(_ expression: some ExprSyntaxProtocol) -> Component {
55-
return buildExpression(ExprSyntax(fromProtocol: expression))
87+
buildExpression(ExprSyntax(fromProtocol: expression))
88+
}
89+
90+
public static func buildExpression(_ expression: some Sequence<ExprSyntaxProtocol>) -> Component {
91+
buildExpression(expression.map { ExprSyntax(fromProtocol: $0) })
5692
}
5793
}
5894

5995
extension UnexpectedNodesBuilder {
6096
public static func buildExpression(_ expression: some SyntaxProtocol) -> Component {
61-
return buildExpression(Syntax(fromProtocol: expression))
97+
buildExpression(Syntax(fromProtocol: expression))
98+
}
99+
100+
public static func buildExpression(_ expression: some Sequence<SyntaxProtocol>) -> Component {
101+
buildExpression(expression.map { Syntax(fromProtocol: $0) })
62102
}
63103
}

Tests/SwiftSyntaxBuilderTest/CollectionNodeFlatteningTests.swift

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ final class CollectionNodeFlatteningTests: XCTestCase {
1818
func test_FlattenCodeBlockItemListWithBuilder() {
1919
@CodeBlockItemListBuilder
2020
func buildInnerCodeBlockItemList() -> CodeBlockItemListSyntax {
21-
FunctionCallExprSyntax(callee: ExprSyntax("innerBuilder"))
21+
[ExprSyntax("innerBuilder1"), ExprSyntax("innerBuilder2")].lazy.map {
22+
FunctionCallExprSyntax(callee: $0)
23+
}
2224
}
2325

2426
@CodeBlockItemListBuilder
2527
func buildOuterCodeBlockItemList() -> CodeBlockItemListSyntax {
2628
FunctionCallExprSyntax(callee: ExprSyntax("outerBuilder"))
27-
2829
buildInnerCodeBlockItemList()
2930
}
3031

@@ -39,7 +40,8 @@ final class CollectionNodeFlatteningTests: XCTestCase {
3940
{
4041
outsideBuilder()
4142
outerBuilder()
42-
innerBuilder()
43+
innerBuilder1()
44+
innerBuilder2()
4345
}
4446
"""
4547
)
@@ -59,4 +61,18 @@ final class CollectionNodeFlatteningTests: XCTestCase {
5961
"""
6062
)
6163
}
64+
65+
func test_FlattenCodeBlockItemListWithCodeBlockItemStringArray() {
66+
let buildable = CodeBlockItemListSyntax {
67+
["let one = object.methodOne()", "let two = object.methodTwo()"]
68+
}
69+
70+
assertBuildResult(
71+
buildable,
72+
"""
73+
let one = object.methodOne()
74+
let two = object.methodTwo()
75+
"""
76+
)
77+
}
6278
}

0 commit comments

Comments
 (0)