@@ -26,8 +26,65 @@ import SwiftSyntax
26
26
@resultBuilder
27
27
public struct ${ node. syntax_kind} Builder {
28
28
% element_type = syntax_buildable_child_type ( node. collection_element_type, node. collection_element, node. is_token ( ) )
29
- public static func buildBlock( _ elements: ${ element_type} ... ) -> ${ node. syntax_kind} {
30
- ${ node. syntax_kind} ( elements)
29
+
30
+ /// The type of individual statement expressions in the transformed function,
31
+ /// which defaults to Component if buildExpression() is not provided.
32
+ public typealias Expression = ${ element_type}
33
+
34
+ /// The type of a partial result, which will be carried through all of the
35
+ /// build methods.
36
+ public typealias Component = [ ${ element_type} ]
37
+
38
+ /// The type of the final returned result, which defaults to Component if
39
+ /// buildFinalResult() is not provided.
40
+ public typealias FinalResult = ${ node. syntax_kind}
41
+
42
+ /// Required by every result builder to build combined results from
43
+ /// statement blocks.
44
+ public static func buildBlock( _ components: Component ... ) -> Component {
45
+ components. flatMap { $0 }
46
+ }
47
+
48
+ /// If declared, provides contextual type information for statement
49
+ /// expressions to translate them into partial results.
50
+ public static func buildExpression( _ expression: Expression ) -> Component {
51
+ [ expression]
52
+ }
53
+
54
+ /// Enables support for `if` statements that do not have an `else`.
55
+ public static func buildOptional( _ component: Component ? ) -> Component {
56
+ component ?? [ ]
57
+ }
58
+
59
+ /// With buildEither(second:), enables support for 'if-else' and 'switch'
60
+ /// statements by folding conditional results into a single result.
61
+ public static func buildEither( first component: Component ) -> Component {
62
+ component
63
+ }
64
+
65
+ /// With buildEither(first:), enables support for 'if-else' and 'switch'
66
+ /// statements by folding conditional results into a single result.
67
+ public static func buildEither( second component: Component ) -> Component {
68
+ component
69
+ }
70
+
71
+ /// Enables support for 'for..in' loops by combining the
72
+ /// results of all iterations into a single result.
73
+ public static func buildArray( _ components: [ Component ] ) -> Component {
74
+ components. flatMap { $0 }
75
+ }
76
+
77
+ /// If declared, this will be called on the partial result of an 'if
78
+ /// #available' block to allow the result builder to erase type
79
+ /// information.
80
+ public static func buildLimitedAvailability( _ component: Component ) -> Component {
81
+ component
82
+ }
83
+
84
+ /// If declared, this will be called on the partial result from the outermost
85
+ /// block statement to produce the final returned result.
86
+ public static func buildFinalResult( _ component: Component ) -> FinalResult {
87
+ . init( component)
31
88
}
32
89
}
33
90
@@ -36,4 +93,4 @@ extension ${node.syntax_kind} {
36
93
}
37
94
38
95
% end
39
- % end
96
+ % end
0 commit comments