Skip to content

Commit 224c1c5

Browse files
committed
Add throws to result builder
1 parent 97a05cc commit 224c1c5

File tree

4 files changed

+163
-108
lines changed

4 files changed

+163
-108
lines changed

CodeGeneration/Sources/generate-swiftsyntax/templates/swiftsyntaxbuilder/BuildableNodesFile.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ private func createConvenienceInitializer(node: Node) -> InitializerDeclSyntax?
7575
produceExpr = ExprSyntax(FunctionCallExprSyntax("\(raw: child.swiftName)Builder()"))
7676
}
7777
builderParameters.append(FunctionParameterSyntax(
78-
"@\(builderInitializableType.resultBuilderBaseName) \(child.swiftName)Builder: () -> \(builderInitializableType.syntax)",
78+
"@\(builderInitializableType.resultBuilderBaseName) \(child.swiftName)Builder: () throws-> \(builderInitializableType.syntax)",
7979
for: .functionParameters
8080
))
8181
} else {
@@ -104,10 +104,10 @@ private func createConvenienceInitializer(node: Node) -> InitializerDeclSyntax?
104104
param
105105
}
106106
FunctionParameterSyntax("trailingTrivia: Trivia? = nil", for: .functionParameters)
107-
}
108-
)
107+
},
108+
throwsOrRethrowsKeyword: .keyword(.rethrows))
109109
) {
110-
FunctionCallExprSyntax(callee: ExprSyntax("self.init")) {
110+
FunctionCallExprSyntax(callee: ExprSyntax("try self.init")) {
111111
TupleExprElementSyntax(label: "leadingTrivia", expression: ExprSyntax("leadingTrivia"))
112112
for arg in delegatedInitArgs {
113113
arg

Sources/SwiftSyntaxBuilder/SyntaxNodeWithBody.swift

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,24 @@ extension SyntaxStringInterpolation {
4040
public protocol HasTrailingCodeBlock {
4141
var body: CodeBlockSyntax { get set }
4242

43-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax) throws
43+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax) throws
4444
}
4545

4646
public extension HasTrailingCodeBlock where Self: StmtSyntaxProtocol {
47-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax) throws {
47+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax) throws {
4848
let stmt = StmtSyntax("\(header) {}")
4949
guard let castedStmt = stmt.as(Self.self) else {
5050
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: stmt)
5151
}
5252
self = castedStmt
53-
self.body = CodeBlockSyntax(statements: bodyBuilder())
53+
self.body = try CodeBlockSyntax(statements: bodyBuilder())
5454
}
5555
}
5656

5757
extension CatchClauseSyntax: HasTrailingCodeBlock {
58-
public init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax) throws {
58+
public init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax) throws {
5959
self = CatchClauseSyntax("\(header) {}")
60-
self.body = CodeBlockSyntax(statements: bodyBuilder())
60+
self.body = try CodeBlockSyntax(statements: bodyBuilder())
6161
}
6262
}
6363
extension DeferStmtSyntax: HasTrailingCodeBlock {}
@@ -71,17 +71,17 @@ extension WhileStmtSyntax: HasTrailingCodeBlock {}
7171
public protocol HasTrailingOptionalCodeBlock {
7272
var body: CodeBlockSyntax? { get set }
7373

74-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax) throws
74+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax) throws
7575
}
7676

7777
public extension HasTrailingOptionalCodeBlock where Self: DeclSyntaxProtocol {
78-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax) throws {
78+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax) throws {
7979
let decl = DeclSyntax("\(header) {}")
8080
guard let castedDecl = decl.as(Self.self) else {
8181
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: decl)
8282
}
8383
self = castedDecl
84-
self.body = CodeBlockSyntax(statements: bodyBuilder())
84+
self.body = try CodeBlockSyntax(statements: bodyBuilder())
8585
}
8686
}
8787

@@ -95,17 +95,17 @@ extension InitializerDeclSyntax: HasTrailingOptionalCodeBlock {}
9595
public protocol HasTrailingMemberDeclBlock {
9696
var members: MemberDeclBlockSyntax { get set }
9797

98-
init(_ header: PartialSyntaxNodeString, @MemberDeclListBuilder membersBuilder: () -> MemberDeclListSyntax) throws
98+
init(_ header: PartialSyntaxNodeString, @MemberDeclListBuilder membersBuilder: () throws -> MemberDeclListSyntax) throws
9999
}
100100

101101
public extension HasTrailingMemberDeclBlock where Self: DeclSyntaxProtocol {
102-
init(_ header: PartialSyntaxNodeString, @MemberDeclListBuilder membersBuilder: () -> MemberDeclListSyntax) throws {
102+
init(_ header: PartialSyntaxNodeString, @MemberDeclListBuilder membersBuilder: () throws -> MemberDeclListSyntax) throws {
103103
let decl = DeclSyntax("\(header) {}")
104104
guard let castedDecl = decl.as(Self.self) else {
105105
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: decl)
106106
}
107107
self = castedDecl
108-
self.members = MemberDeclBlockSyntax(members: membersBuilder())
108+
self.members = try MemberDeclBlockSyntax(members: membersBuilder())
109109
}
110110
}
111111

@@ -121,14 +121,14 @@ extension StructDeclSyntax: HasTrailingMemberDeclBlock {}
121121
// So we cannot conform to `HasTrailingCodeBlock`
122122

123123
public extension IfStmtSyntax {
124-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () -> CodeBlockItemListSyntax, @CodeBlockItemListBuilder `else` elseBuilder: () -> CodeBlockItemListSyntax? = { nil }) throws {
124+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder bodyBuilder: () throws -> CodeBlockItemListSyntax, @CodeBlockItemListBuilder `else` elseBuilder: () throws -> CodeBlockItemListSyntax? = { nil }) throws {
125125
let stmt = StmtSyntax("\(header) {}")
126126
guard let ifStmt = stmt.as(IfStmtSyntax.self) else {
127127
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: stmt)
128128
}
129129
self = ifStmt
130-
self.body = CodeBlockSyntax(statements: bodyBuilder())
131-
self.elseBody = elseBuilder().map { .codeBlock(CodeBlockSyntax(statements: $0)) }
130+
self.body = try CodeBlockSyntax(statements: bodyBuilder())
131+
self.elseBody = try elseBuilder().map { .codeBlock(CodeBlockSyntax(statements: $0)) }
132132
self.elseKeyword = elseBody != nil ? .keyword(.else) : nil
133133
}
134134

@@ -149,13 +149,13 @@ public extension IfStmtSyntax {
149149
// So we cannot conform to `HasTrailingCodeBlock` or `HasTrailingMemberDeclBlock`
150150

151151
public extension SwitchStmtSyntax {
152-
init(_ header: PartialSyntaxNodeString, @SwitchCaseListBuilder casesBuilder: () -> SwitchCaseListSyntax = { SwitchCaseListSyntax([]) }) throws {
152+
init(_ header: PartialSyntaxNodeString, @SwitchCaseListBuilder casesBuilder: () throws -> SwitchCaseListSyntax = { SwitchCaseListSyntax([]) }) throws {
153153
let stmt = StmtSyntax("\(header) {}")
154154
guard let castedStmt = stmt.as(Self.self) else {
155155
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: stmt)
156156
}
157157
self = castedStmt
158-
self.cases = casesBuilder()
158+
self.cases = try casesBuilder()
159159
}
160160
}
161161

@@ -164,15 +164,15 @@ public extension SwitchStmtSyntax {
164164
// So we cannot conform to `HasTrailingCodeBlock` or `HasTrailingMemberDeclBlock`
165165

166166
public extension VariableDeclSyntax {
167-
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder accessor: () -> CodeBlockItemListSyntax) throws {
167+
init(_ header: PartialSyntaxNodeString, @CodeBlockItemListBuilder accessor: () throws -> CodeBlockItemListSyntax) throws {
168168
let decl = DeclSyntax("\(header) {}")
169169
guard let castedDecl = decl.as(Self.self) else {
170170
throw SyntaxStringInterpolationError.producedInvalidNodeType(expectedType: Self.self, actualNode: decl)
171171
}
172172
self = castedDecl
173173
assert(self.bindings.count == 1)
174174
var binding: PatternBindingSyntax? = self.bindings.last
175-
binding?.accessor = .getter(CodeBlockSyntax(statements: accessor()))
175+
binding?.accessor = try .getter(CodeBlockSyntax(statements: accessor()))
176176
bindings = PatternBindingListSyntax([binding].compactMap { $0 })
177177
}
178178
}

0 commit comments

Comments
 (0)