
%{
  # -*- mode: C++ -*-
  from gyb_syntax_support import *
  NODE_MAP = create_node_map()
  # Ignore the following admonition; it applies to the resulting .cpp file only
}%
//// Automatically Generated From SyntaxBuilders.cpp.gyb.
//// Do Not Edit Directly!
//===------------ SyntaxBuilders.cpp - 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
//
//===----------------------------------------------------------------------===//


#include "swift/Syntax/SyntaxBuilders.h"

using namespace swift;
using namespace swift::syntax;

% for node in SYNTAX_NODES:
%   if node.is_buildable():
%     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
${node.name}Builder &
${node.name}Builder::add${child_elt}(${child_elt_type} ${child_elt}) {
  auto &raw = Layout[cursorIndex(${node.name}::Cursor::${child.name})];
  raw = raw->append(${child_elt}.getRaw());
  return *this;
}
%       else:
${node.name}Builder &
${node.name}Builder::use${child.name}(${child.type_name} ${child.name}) {
  Layout[cursorIndex(${node.name}::Cursor::${child.name})] =
    ${child.name}.getRaw();
  return *this;
}
%       end
%     end
${node.name}
${node.name}Builder::build() {
  auto raw = RawSyntax::make(SyntaxKind::${node.syntax_kind}, 
    Layout, SourcePresence::Present);
  return make<${node.name}>(raw);
}

%   end
% end