blob: 8e40cbab63c8115e19645a3a193c75f2714776e5 [file] [log] [blame]
%{
# -*- 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 ParsedSyntaxBuilders.cpp.gyb.
//// Do Not Edit Directly!
//===------------- ParsedSyntaxBuilders.cpp - Parsed Syntax Building ------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2019 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/Parse/ParsedSyntaxBuilders.h"
#include "swift/Parse/ParsedRawSyntaxRecorder.h"
#include "swift/Parse/SyntaxParsingContext.h"
#include "swift/Syntax/SyntaxNodes.h"
using namespace swift;
using namespace swift::syntax;
% for node in SYNTAX_NODES:
% if node.is_buildable():
% for child in node.children:
% child_elt = None
% child_elt_type = None
% 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
% end
Parsed${node.name}Builder &
Parsed${node.name}Builder::use${child.name}(Parsed${child.type_name} ${child.name}) {
% if child_elt:
assert(${child_elt}Nodes.empty() && "use either 'use' function or 'add', not both");
% end
Layout[cursorIndex(${node.name}::Cursor::${child.name})] =
${child.name}.getRaw();
return *this;
}
% if child_elt:
Parsed${node.name}Builder &
Parsed${node.name}Builder::add${child_elt}(Parsed${child_elt_type} ${child_elt}) {
assert(Layout[cursorIndex(${node.name}::Cursor::${child.name})].isNull() && "use either 'use' function or 'add', not both");
${child_elt}Nodes.push_back(std::move(${child_elt}.getRaw()));
return *this;
}
% end
% end
Parsed${node.name}
Parsed${node.name}Builder::record() {
finishLayout(/*deferred=*/false);
auto &Rec = SPCtx.getRecorder();
auto raw = Rec.recordRawSyntax(SyntaxKind::${node.syntax_kind}, Layout);
return Parsed${node.name}(std::move(raw));
}
Parsed${node.name}
Parsed${node.name}Builder::makeDeferred() {
finishLayout(/*deferred=*/true);
auto raw = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${node.syntax_kind},
Layout, SPCtx);
return Parsed${node.name}(std::move(raw));
}
Parsed${node.name}
Parsed${node.name}Builder::build() {
if (SPCtx.isBacktracking())
return makeDeferred();
return record();
}
void Parsed${node.name}Builder::finishLayout(bool deferred) {
auto &Rec = SPCtx.getRecorder();
(void)Rec;
% if node.children:
% for (idx, child) in enumerate(node.children):
% child_elt = None
% child_node = NODE_MAP.get(child.syntax_kind)
% if child_node and child_node.is_syntax_collection():
% child_elt = child_node.collection_element_name
% if child_elt:
if (!${child_elt}Nodes.empty()) {
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${child_node.syntax_kind},
${child_elt}Nodes, SPCtx);
} else {
Layout[${idx}] = Rec.recordRawSyntax(SyntaxKind::${child_node.syntax_kind}, ${child_elt}Nodes);
}
}
% end
% if not child.is_optional:
if (Layout[${idx}].isNull()) {
% if child.is_token():
% token = child.main_token()
% tok_kind = token.kind if token else "unknown"
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferredMissing(tok::${tok_kind}, SourceLoc());
} else {
Layout[${idx}] = Rec.recordMissingToken(tok::${tok_kind}, SourceLoc());
}
% elif child_elt:
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${child_node.syntax_kind}, {}, SPCtx);
} else {
Layout[${idx}] = Rec.recordRawSyntax(SyntaxKind::${child_node.syntax_kind}, {});
}
% else:
llvm_unreachable("need missing non-token nodes ?");
% end
}
% end
% end
% end
}
% end
% end