| |
| %{ |
| # -*- mode: Swift -*- |
| from gyb_syntax_support import * |
| NODE_MAP = create_node_map() |
| # Ignore the following admonition; it applies to the resulting .swift file only |
| }% |
| //// Automatically Generated From SyntaxBuilders.swift.gyb. |
| //// Do Not Edit Directly! |
| //===------------ SyntaxBuilders.swift - Syntax Builder definitions -------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| %{ |
| """ |
| A builder is a struct with a mutable layout inside. Clients can |
| specify as many or as few of the children as they want, and the structure is |
| guaranted to be structurally (if not syntactically) valid. |
| """ |
| }% |
| |
| % for node in SYNTAX_NODES: |
| % if node.is_buildable(): |
| % Builder = node.name + "Builder" |
| public struct ${Builder} { |
| private var layout = [ |
| % for child in node.children: |
| ${make_missing_swift_child(child)}, |
| % end |
| ] |
| internal init() {} |
| % for child in node.children: |
| % child_node = NODE_MAP.get(child.syntax_kind) |
| % if child_node and child_node.is_syntax_collection(): |
| % child_elt = child_node.collection_element_name |
| % child_elt_type = child_node.collection_element_type |
| |
| public mutating func add${child_elt}(_ elt: ${child_elt_type}) { |
| let idx = ${node.name}.Cursor.${child.swift_name}.rawValue |
| layout[idx] = layout[idx].appending(elt.raw) |
| } |
| % else: |
| |
| public mutating func use${child.name}(_ node: ${child.type_name}) { |
| let idx = ${node.name}.Cursor.${child.swift_name}.rawValue |
| layout[idx] = node.raw |
| } |
| % end |
| % end |
| |
| internal func buildData() -> SyntaxData { |
| return SyntaxData(raw: .node(.${node.swift_syntax_kind}, |
| layout, .present)) |
| } |
| } |
| |
| extension ${node.name} { |
| /// Creates a `${node.name}` using the provided build function. |
| /// - Parameter: |
| /// - build: A closure that wil be invoked in order to initialize |
| /// the fields of the syntax node. |
| /// This closure is passed a `${Builder}` which you can use to |
| /// incrementally build the structure of the node. |
| /// - Returns: A `${node.name}` with all the fields populated in the builder |
| /// closure. |
| public convenience init(_ build: (inout ${Builder}) -> Void) { |
| var builder = ${Builder}() |
| build(&builder) |
| let data = builder.buildData() |
| self.init(root: data, data: data) |
| } |
| } |
| |
| % end |
| % end |