blob: 99c5370d1ae3b6b0d02735ae95362ab8a9b215c4 [file] [log] [blame]
%{
# -*- 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