Skip to content

Commit bd5dc8d

Browse files
Add buildFinalResult to CodeBlockItemListBuilder to ensure newline between expressions
1 parent c2c7980 commit bd5dc8d

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

Sources/SwiftSyntaxBuilder/ResultBuilderExtensions.swift

+12
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ extension CodeBlockItemListBuilder {
4040
public static func buildExpression(_ expression: some Sequence<DeclSyntaxProtocol>) -> Component {
4141
buildExpression(expression.map { CodeBlockItemSyntax(item: .decl(DeclSyntax($0))) })
4242
}
43+
44+
public static func buildFinalResult(_ component: Component) -> CodeBlockItemListSyntax {
45+
.init(
46+
component.enumerated().map { (index, expression) in
47+
if index > component.startIndex, !expression.leadingTrivia.contains(where: \.isNewline) {
48+
return expression.with(\.leadingTrivia, .newline.merging(expression.leadingTrivia))
49+
} else {
50+
return expression
51+
}
52+
}
53+
)
54+
}
4355
}
4456

4557
extension ConditionElementListBuilder {

Tests/SwiftSyntaxBuilderTest/CollectionNodeFlatteningTests.swift

+27
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,31 @@ final class CollectionNodeFlatteningTests: XCTestCase {
7575
"""
7676
)
7777
}
78+
79+
func test_FlattenCodeBlockItemListWithCodeBlockInterpolated() {
80+
let block = CodeBlockItemListSyntax {
81+
"let a = 1"
82+
"let b = 2"
83+
"let c = 3"
84+
}
85+
86+
let buildable = CodeBlockItemListSyntax {
87+
"let one = object.methodOne()"
88+
"let two = object.methodTwo()"
89+
"let three = {\(block)}()"
90+
}
91+
92+
assertBuildResult(
93+
buildable,
94+
"""
95+
let one = object.methodOne()
96+
let two = object.methodTwo()
97+
let three = {
98+
let a = 1
99+
let b = 2
100+
let c = 3
101+
}()
102+
"""
103+
)
104+
}
78105
}

0 commit comments

Comments
 (0)