expression builders: func -> task

This commit is contained in:
dragon 2024-08-15 22:25:16 +03:00
parent 49d9a95fd9
commit f5856734c6
4 changed files with 364 additions and 343 deletions

View file

@ -6,7 +6,7 @@
namespace builders { namespace builders {
using Code = parser::ParseTree; // using Code = parser::ParseTree;
using Exprs = nodes::ExpressionStorage; using Exprs = nodes::ExpressionStorage;
using Types = nodes::TypeStorage; using Types = nodes::TypeStorage;
using Names = names::NameTree; using Names = names::NameTree;
@ -18,29 +18,19 @@ using Node = nodes::Node_<nodes::NodePart<utils::Pos>>; // TODO
template <typename N> template <typename N>
using Task = utils::Task<Executor, N, utils::None, parser::ParseTree::Node>; using Task = utils::Task<Executor, N, utils::None, parser::ParseTree::Node>;
template <typename N> struct BuilderTask { template <typename N, typename Tag = utils::None> struct BuilderTask {
static_assert(false); static_assert(false);
}; };
template <typename N> struct BuilderTaskBase : public Task<N> { template <typename N> struct BuilderTaskBase : public Task<N> {
using Task<N>::Task; using Task<N>::Task;
template <typename OtherN> template <typename OtherN, typename OtherTag = utils::None>
OtherN Run(const parser::ParseTree::Node &node, OtherN Run(const parser::ParseTree::Node &node,
const utils::None &args = {}) { const utils::None &args = {}) {
BuilderTask<OtherN> task(this->executor); BuilderTask<OtherN, OtherTag> task(this->executor);
return task(node, args); return task(node, args);
} }
}; };
// TODO
// template <>
// struct BuilderTask<nodes::ExpressionProxy>
// : public BuilderTaskBase<nodes::ExpressionProxy> {
// using BuilderTaskBase<nodes::ExpressionProxy>::BuilderTaskBase;
// nodes::ExpressionProxy operator()(const parser::ParseTree::Node &expr,
// const utils::None &args) override;
// };
} // namespace builders } // namespace builders

View file

@ -1,94 +1,238 @@
#pragma once #pragma once
#include "basic_builders.hpp"
#include "builders_utils.hpp"
#include "expression_nodes.hpp" #include "expression_nodes.hpp"
#include "tree_sitter_wrapper.hpp" #include "tree_sitter_wrapper.hpp"
namespace utils {
struct CommaTag {};
struct OperatorTag {};
struct BlockTag {};
struct ArrayTag {};
struct ArrayAccessTag {};
struct TupleAccessTag {};
struct RefTag {};
struct SuffixTag {};
struct FuncCallTag {};
} // namespace utils
namespace builders { namespace builders {
// --- flow control // --- flow control
nodes::ExpressionProxy template <>
build_expression(parser::ParseTree::Node parser_node, struct BuilderTask<nodes::ExpressionProxy>
nodes::ExpressionStorage &expression_storage, : public BuilderTaskBase<nodes::ExpressionProxy> {
nodes::TypeStorage &type_storage); using BuilderTaskBase<nodes::ExpressionProxy>::BuilderTaskBase;
nodes::Match build_match(parser::ParseTree::Node parser_node, nodes::ExpressionProxy operator()(const parser::ParseTree::Node &parser_node,
nodes::ExpressionStorage &expression_storage, const utils::None &args) override;
nodes::TypeStorage &type_storage); };
nodes::Condition build_condition(parser::ParseTree::Node parser_node, template <>
nodes::ExpressionStorage &expression_storage, struct BuilderTask<nodes::Match::Case>
nodes::TypeStorage &type_storage); : public BuilderTaskBase<nodes::Match::Case> {
using BuilderTaskBase<nodes::Match::Case>::BuilderTaskBase;
nodes::Loop build_loop(parser::ParseTree::Node parser_node, nodes::Match::Case operator()(const parser::ParseTree::Node &parser_node,
nodes::ExpressionStorage &expression_storage, const utils::None &args) override;
nodes::TypeStorage &type_storage); };
template <>
struct BuilderTask<nodes::Match> : public BuilderTaskBase<nodes::Match> {
using BuilderTaskBase<nodes::Match>::BuilderTaskBase;
nodes::Match operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::Condition>
: public BuilderTaskBase<nodes::Condition> {
using BuilderTaskBase<nodes::Condition>::BuilderTaskBase;
nodes::Condition operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::Loop> : public BuilderTaskBase<nodes::Loop> {
using BuilderTaskBase<nodes::Loop>::BuilderTaskBase;
nodes::Loop operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
// --- operators // --- operators
nodes::NameExpression template <>
build_comma_expression(parser::ParseTree::Node parser_node, struct BuilderTask<nodes::NameExpression, utils::CommaTag>
nodes::ExpressionStorage &expression_storage, : public BuilderTaskBase<nodes::NameExpression> {
nodes::TypeStorage &type_storage); using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
nodes::NameExpression nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
build_operator_expression(parser::ParseTree::Node parser_node, const utils::None &args) override;
nodes::ExpressionStorage &expression_storage, };
nodes::TypeStorage &type_storage);
template <>
struct BuilderTask<nodes::NameExpression, utils::OperatorTag>
: public BuilderTaskBase<nodes::NameExpression> {
using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
// --- continers // --- continers
nodes::Container build_block(parser::ParseTree::Node parser_node, template <typename T>
nodes::ExpressionStorage &expression_storage, requires std::is_same_v<T, utils::BlockTag> or
nodes::TypeStorage &type_storage); std::is_same_v<T, utils::ArrayTag>
struct BuilderTask<nodes::Container, T>
: public BuilderTaskBase<nodes::Container> {
using BuilderTaskBase<nodes::Container>::BuilderTaskBase;
nodes::Container build_array(parser::ParseTree::Node parser_node, // '{' (expression ';')* '}'
nodes::ExpressionStorage &expression_storage, // or
nodes::TypeStorage &type_storage); // '[[' expression+ ']]'
nodes::Container operator()(const parser::ParseTree::Node &parser_node,
const utils::None &) override {
const auto container_type = std::is_same_v<T, utils::BlockTag>
? nodes::Container::BLOCK
: nodes::Container::ARRAY;
std::vector<nodes::ExpressionProxy> expressions;
auto current_node = parser_node.nth_named_child(0);
while (!current_node.is_null()) {
expressions.push_back(Run<nodes::ExpressionProxy>(current_node));
current_node = current_node.next_named_sibling();
}
return nodes::Container(build_node(parser_node), container_type,
std::move(expressions));
}
};
// --- modifiers // --- modifiers
nodes::Return build_return(parser::ParseTree::Node parser_node, template <>
nodes::ExpressionStorage &expression_storage, struct BuilderTask<nodes::Return> : public BuilderTaskBase<nodes::Return> {
nodes::TypeStorage &type_storage); using BuilderTaskBase<nodes::Return>::BuilderTaskBase;
nodes::NameDefinition nodes::Return operator()(const parser::ParseTree::Node &parser_node,
build_name_definition(parser::ParseTree::Node parser_node); const utils::None &args) override;
};
nodes::Access build_array_access(parser::ParseTree::Node parser_node, template <>
nodes::ExpressionStorage &expression_storage, struct BuilderTask<nodes::NameDefinition>
nodes::TypeStorage &type_storage); : public BuilderTaskBase<nodes::NameDefinition> {
using BuilderTaskBase<nodes::NameDefinition>::BuilderTaskBase;
nodes::Access build_tuple_access(parser::ParseTree::Node parser_node, nodes::NameDefinition operator()(const parser::ParseTree::Node &parser_node,
nodes::ExpressionStorage &expression_storage, const utils::None &args) override;
nodes::TypeStorage &type_storage); };
nodes::LoopControl build_loop_control(parser::ParseTree::Node parser_node); template <>
struct BuilderTask<nodes::Access, utils::ArrayAccessTag>
: public BuilderTaskBase<nodes::Access> {
using BuilderTaskBase<nodes::Access>::BuilderTaskBase;
nodes::ModifierExpression nodes::Access operator()(const parser::ParseTree::Node &parser_node,
build_reference_expression(parser::ParseTree::Node parser_node, const utils::None &args) override;
nodes::ExpressionStorage &expression_storage, };
nodes::TypeStorage &type_storage);
nodes::ModifierExpression template <>
build_suffix_expression(parser::ParseTree::Node parser_node, struct BuilderTask<nodes::Access, utils::TupleAccessTag>
nodes::ExpressionStorage &expression_storage, : public BuilderTaskBase<nodes::Access> {
nodes::TypeStorage &type_storage); using BuilderTaskBase<nodes::Access>::BuilderTaskBase;
nodes::Access operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::LoopControl>
: public BuilderTaskBase<nodes::LoopControl> {
using BuilderTaskBase<nodes::LoopControl>::BuilderTaskBase;
nodes::LoopControl operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::ModifierExpression, utils::RefTag>
: public BuilderTaskBase<nodes::ModifierExpression> {
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
nodes::ModifierExpression
operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::ModifierExpression, utils::SuffixTag>
: public BuilderTaskBase<nodes::ModifierExpression> {
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
nodes::ModifierExpression
operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <typename T>
requires std::is_same_v<T, utils::RefTag> or
std::is_same_v<T, utils::SuffixTag>
struct BuilderTask<nodes::ModifierExpression, T>
: public BuilderTaskBase<nodes::ModifierExpression> {
using BuilderTaskBase<nodes::ModifierExpression>::BuilderTaskBase;
// _reference_ expression
// or
// expression ('?' | '!')
nodes::ModifierExpression
operator()(const parser::ParseTree::Node &parser_node,
const utils::None &) override {
const size_t modifier_pos =
std::is_same_v<T, utils::RefTag> ? 0 : parser_node.child_count() - 1;
return nodes::ModifierExpression(
build_node(parser_node),
build_modifier(parser_node.nth_child(modifier_pos)),
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
}
};
// --- other // --- other
nodes::NameExpression template <>
build_name_expression(parser::ParseTree::Node parser_node, struct BuilderTask<nodes::NameExpression, utils::FuncCallTag>
nodes::ExpressionStorage &expression_storage, : public BuilderTaskBase<nodes::NameExpression> {
nodes::TypeStorage &type_storage); using BuilderTaskBase<nodes::NameExpression>::BuilderTaskBase;
nodes::Constructor nodes::NameExpression operator()(const parser::ParseTree::Node &parser_node,
build_constructor(parser::ParseTree::Node parser_node, const utils::None &args) override;
nodes::ExpressionStorage &expression_storage, };
nodes::TypeStorage &type_storage);
nodes::Lambda build_lambda(parser::ParseTree::Node parser_node, template <>
nodes::ExpressionStorage &expression_storage, struct BuilderTask<nodes::Constructor>
nodes::TypeStorage &type_storage); : public BuilderTaskBase<nodes::Constructor> {
using BuilderTaskBase<nodes::Constructor>::BuilderTaskBase;
nodes::Constructor operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::Lambda> : public BuilderTaskBase<nodes::Lambda> {
using BuilderTaskBase<nodes::Lambda>::BuilderTaskBase;
nodes::Lambda operator()(const parser::ParseTree::Node &parser_node,
const utils::None &args) override;
};
} // namespace builders } // namespace builders

View file

@ -10,10 +10,8 @@
namespace builders { namespace builders {
nodes::ExpressionProxy nodes::ExpressionProxy BuilderTask<nodes::ExpressionProxy>::operator()(
build_expression(parser::ParseTree::Node parser_node, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
tokens::Type type = tokens::string_to_type(parser_node.get_type()); tokens::Type type = tokens::string_to_type(parser_node.get_type());
auto maybe_parenthesis = parser_node.previous_sibling(); auto maybe_parenthesis = parser_node.previous_sibling();
@ -24,141 +22,128 @@ build_expression(parser::ParseTree::Node parser_node,
switch (type) { switch (type) {
// --- flow control // --- flow control
case tokens::Type::MATCH: case tokens::Type::MATCH:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node), Run<nodes::Match>(parser_node), is_scoped));
build_match(parser_node, expression_storage, type_storage), is_scoped));
case tokens::Type::CONDITION: case tokens::Type::CONDITION:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(
build_node(parser_node), nodes::Expression(build_node(parser_node),
build_condition(parser_node, expression_storage, type_storage), Run<nodes::Condition>(parser_node), is_scoped));
is_scoped));
case tokens::Type::LOOP: case tokens::Type::LOOP:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node), Run<nodes::Loop>(parser_node), is_scoped));
build_loop(parser_node, expression_storage, type_storage), is_scoped));
// --- operators // --- operators
case tokens::Type::COMMA_EXPRESSION: case tokens::Type::COMMA_EXPRESSION:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_comma_expression(parser_node, expression_storage, type_storage), Run<nodes::NameExpression, utils::CommaTag>(parser_node), is_scoped));
is_scoped));
case tokens::Type::OPERATOR_EXPRESSION: case tokens::Type::OPERATOR_EXPRESSION:
return expression_storage.add_expression( return state<Exprs>().add_expression(nodes::Expression(
nodes::Expression(build_node(parser_node), build_node(parser_node),
build_operator_expression( Run<nodes::NameExpression, utils::OperatorTag>(parser_node),
parser_node, expression_storage, type_storage), is_scoped));
is_scoped));
// --- containers // --- containers
case tokens::Type::BLOCK: case tokens::Type::BLOCK:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_block(parser_node, expression_storage, type_storage), is_scoped)); Run<nodes::Container, utils::BlockTag>(parser_node), is_scoped));
case tokens::Type::ARRAY: case tokens::Type::ARRAY:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_array(parser_node, expression_storage, type_storage), is_scoped)); Run<nodes::Container, utils::ArrayTag>(parser_node), is_scoped));
// --- modifiers // --- modifiers
case tokens::Type::RETURN: case tokens::Type::RETURN:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node), Run<nodes::Return>(parser_node), is_scoped));
build_return(parser_node, expression_storage, type_storage),
is_scoped));
case tokens::Type::NAME_DEFINITION: case tokens::Type::NAME_DEFINITION:
return expression_storage.add_expression( return state<Exprs>().add_expression(
nodes::Expression(build_node(parser_node), nodes::Expression(build_node(parser_node),
build_name_definition(parser_node), is_scoped)); Run<nodes::NameDefinition>(parser_node), is_scoped));
case tokens::Type::ARRAY_ACCESS: case tokens::Type::ARRAY_ACCESS:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_array_access(parser_node, expression_storage, type_storage), Run<nodes::Access, utils::ArrayAccessTag>(parser_node), is_scoped));
is_scoped));
case tokens::Type::TUPLE_ACCESS: case tokens::Type::TUPLE_ACCESS:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_tuple_access(parser_node, expression_storage, type_storage), Run<nodes::Access, utils::TupleAccessTag>(parser_node), is_scoped));
is_scoped));
case tokens::Type::LOOP_CONTROL: case tokens::Type::LOOP_CONTROL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(
build_node(parser_node), build_loop_control(parser_node), is_scoped));
case tokens::Type::REFERENCE_EXPRESSION:
return expression_storage.add_expression(
nodes::Expression(build_node(parser_node), nodes::Expression(build_node(parser_node),
build_reference_expression( Run<nodes::LoopControl>(parser_node), is_scoped));
parser_node, expression_storage, type_storage), case tokens::Type::REFERENCE_EXPRESSION:
is_scoped)); return state<Exprs>().add_expression(nodes::Expression(
case tokens::Type::SUFFIX_EXPRESSION:
return expression_storage.add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_suffix_expression(parser_node, expression_storage, type_storage), Run<nodes::ModifierExpression, utils::RefTag>(parser_node), is_scoped));
case tokens::Type::SUFFIX_EXPRESSION:
return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node),
Run<nodes::ModifierExpression, utils::SuffixTag>(parser_node),
is_scoped)); is_scoped));
// --- other // --- other
case tokens::Type::NAME_EXPRESSION: case tokens::Type::NAME_EXPRESSION:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node),
build_name_expression(parser_node, expression_storage, type_storage), Run<nodes::NameExpression, utils::FuncCallTag>(parser_node),
is_scoped)); is_scoped));
case tokens::Type::ARGUMENT_NAME_IDENTIFIER: case tokens::Type::ARGUMENT_NAME_IDENTIFIER:
case tokens::Type::SIMPLE_NAME_IDENTIFIER: case tokens::Type::SIMPLE_NAME_IDENTIFIER:
case tokens::Type::PLACEHOLDER: case tokens::Type::PLACEHOLDER:
return expression_storage.add_expression( return state<Exprs>().add_expression(
nodes::Expression(build_node(parser_node), nodes::Expression(build_node(parser_node),
nodes::NameExpression(build_node(parser_node), nodes::NameExpression(build_node(parser_node),
build_identifier(parser_node)), build_identifier(parser_node)),
is_scoped)); is_scoped));
case tokens::Type::CONSTRUCTOR: case tokens::Type::CONSTRUCTOR:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(
build_node(parser_node), nodes::Expression(build_node(parser_node),
build_constructor(parser_node, expression_storage, type_storage), Run<nodes::Constructor>(parser_node), is_scoped));
is_scoped));
case tokens::Type::LAMBDA: case tokens::Type::LAMBDA:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_node(parser_node), Run<nodes::Lambda>(parser_node), is_scoped));
build_lambda(parser_node, expression_storage, type_storage),
is_scoped));
// --- literals // --- literals
case tokens::Type::FLOAT_LITERAL: case tokens::Type::FLOAT_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_float_literal(parser_node), is_scoped)); build_node(parser_node), build_float_literal(parser_node), is_scoped));
case tokens::Type::DOUBLE_LITERAL: case tokens::Type::DOUBLE_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_double_literal(parser_node), is_scoped)); build_node(parser_node), build_double_literal(parser_node), is_scoped));
case tokens::Type::INT_LITERAL: case tokens::Type::INT_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_int_literal(parser_node), is_scoped)); build_node(parser_node), build_int_literal(parser_node), is_scoped));
case tokens::Type::LONG_LITERAL: case tokens::Type::LONG_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_long_literal(parser_node), is_scoped)); build_node(parser_node), build_long_literal(parser_node), is_scoped));
case tokens::Type::INDEX_LITERAL: case tokens::Type::INDEX_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_index_literal(parser_node), is_scoped)); build_node(parser_node), build_index_literal(parser_node), is_scoped));
case tokens::Type::STRING_LITERAL: case tokens::Type::STRING_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_string_literal(parser_node), is_scoped)); build_node(parser_node), build_string_literal(parser_node), is_scoped));
case tokens::Type::UNICODE_STRING_LITERAL: case tokens::Type::UNICODE_STRING_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_unicode_string_literal(parser_node), build_node(parser_node), build_unicode_string_literal(parser_node),
is_scoped)); is_scoped));
case tokens::Type::CHAR_LITERAL: case tokens::Type::CHAR_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_char_literal(parser_node), is_scoped)); build_node(parser_node), build_char_literal(parser_node), is_scoped));
case tokens::Type::UNICODE_LITERAL: case tokens::Type::UNICODE_LITERAL:
return expression_storage.add_expression( return state<Exprs>().add_expression(
nodes::Expression(build_node(parser_node), nodes::Expression(build_node(parser_node),
build_unicode_literal(parser_node), is_scoped)); build_unicode_literal(parser_node), is_scoped));
case tokens::Type::BOOL_LITERAL: case tokens::Type::BOOL_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_bool_literal(parser_node), is_scoped)); build_node(parser_node), build_bool_literal(parser_node), is_scoped));
case tokens::Type::UNIT_LITERAL: case tokens::Type::UNIT_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_unit_literal(parser_node), is_scoped)); build_node(parser_node), build_unit_literal(parser_node), is_scoped));
case tokens::Type::NULL_LITERAL: case tokens::Type::NULL_LITERAL:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_null_literal(parser_node), is_scoped)); build_node(parser_node), build_null_literal(parser_node), is_scoped));
case tokens::Type::EXTRA: case tokens::Type::EXTRA:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_extra(parser_node), is_scoped)); build_node(parser_node), build_extra(parser_node), is_scoped));
case tokens::Type::EMPTY_LINES: case tokens::Type::EMPTY_LINES:
return expression_storage.add_expression(nodes::Expression( return state<Exprs>().add_expression(nodes::Expression(
build_node(parser_node), build_empty_lines(parser_node), is_scoped)); build_node(parser_node), build_empty_lines(parser_node), is_scoped));
default: default:
error_handling::handle_parsing_error("Unexprected expression node type", error_handling::handle_parsing_error("Unexprected expression node type",
@ -172,9 +157,8 @@ build_expression(parser::ParseTree::Node parser_node,
// --- flow control // --- flow control
// (':=' | '=:') expression (('??' | 'if') expression)? (_do_ expression)? // (':=' | '=:') expression (('??' | 'if') expression)? (_do_ expression)?
nodes::Match::Case build_case(parser::ParseTree::Node parser_node, nodes::Match::Case BuilderTask<nodes::Match::Case>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
std::string case_type = parser_node.nth_child(0).get_value(); std::string case_type = parser_node.nth_child(0).get_value();
std::optional<parser::ParseTree::Node> condition_node; std::optional<parser::ParseTree::Node> condition_node;
@ -198,41 +182,36 @@ nodes::Match::Case build_case(parser::ParseTree::Node parser_node,
build_node(parser_node), build_node(parser_node),
case_type == ":=" ? nodes::Match::Case::PATTERN_VALUE case_type == ":=" ? nodes::Match::Case::PATTERN_VALUE
: nodes::Match::Case::VALUE_PATTERN, : nodes::Match::Case::VALUE_PATTERN,
build_expression(parser_node.nth_named_child(0), expression_storage, Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
type_storage),
condition_node.has_value() condition_node.has_value()
? build_expression(condition_node.value(), expression_storage, ? Run<nodes::ExpressionProxy>(condition_node.value())
type_storage)
: std::optional<nodes::ExpressionProxy>(), : std::optional<nodes::ExpressionProxy>(),
expression_node.has_value() expression_node.has_value()
? build_expression(expression_node.value(), expression_storage, ? Run<nodes::ExpressionProxy>(expression_node.value())
type_storage)
: std::optional<nodes::ExpressionProxy>()); : std::optional<nodes::ExpressionProxy>());
} }
// expression case+ // expression case+
nodes::Match build_match(parser::ParseTree::Node parser_node, nodes::Match BuilderTask<nodes::Match>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
std::vector<nodes::Match::Case> cases; std::vector<nodes::Match::Case> cases;
auto current_node = parser_node.nth_named_child(1); auto current_node = parser_node.nth_named_child(1);
while (!current_node.is_null()) { while (!current_node.is_null()) {
cases.push_back(build_case(current_node, expression_storage, type_storage)); cases.push_back(Run<nodes::Match::Case>(current_node));
current_node = current_node.next_named_sibling(); current_node = current_node.next_named_sibling();
} }
return nodes::Match(build_node(parser_node), return nodes::Match(
build_expression(parser_node.nth_named_child(0), build_node(parser_node),
expression_storage, type_storage), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
std::move(cases)); std::move(cases));
} }
// ('??' | 'if') expression _do_ expression (('!!' | 'elif') expression _do_ // ('??' | 'if') expression _do_ expression (('!!' | 'elif') expression _do_
// expression)* (('!!=>', 'else') expression)? // expression)* (('!!=>', 'else') expression)?
nodes::Condition build_condition(parser::ParseTree::Node parser_node, nodes::Condition BuilderTask<nodes::Condition>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
size_t named_child_count = parser_node.named_child_count(); size_t named_child_count = parser_node.named_child_count();
std::vector<std::pair<nodes::ExpressionProxy, nodes::ExpressionProxy>> cases; std::vector<std::pair<nodes::ExpressionProxy, nodes::ExpressionProxy>> cases;
@ -241,9 +220,8 @@ nodes::Condition build_condition(parser::ParseTree::Node parser_node,
auto next_node = current_node.next_named_sibling(); auto next_node = current_node.next_named_sibling();
while (!current_node.is_null() && !next_node.is_null()) { while (!current_node.is_null() && !next_node.is_null()) {
cases.push_back( cases.push_back({Run<nodes::ExpressionProxy>(current_node),
{build_expression(current_node, expression_storage, type_storage), Run<nodes::ExpressionProxy>(next_node)});
build_expression(next_node, expression_storage, type_storage)});
current_node = next_node.next_named_sibling(); current_node = next_node.next_named_sibling();
if (current_node.is_null()) { if (current_node.is_null()) {
break; break;
@ -254,35 +232,32 @@ nodes::Condition build_condition(parser::ParseTree::Node parser_node,
return nodes::Condition( return nodes::Condition(
build_node(parser_node), std::move(cases), build_node(parser_node), std::move(cases),
named_child_count % 2 == 1 named_child_count % 2 == 1
? build_expression(parser_node.nth_named_child(named_child_count - 1), ? Run<nodes::ExpressionProxy>(
expression_storage, type_storage) parser_node.nth_named_child(named_child_count - 1))
: std::optional<nodes::ExpressionProxy>()); : std::optional<nodes::ExpressionProxy>());
} }
// ('@' | 'for') (expression | expression ':' expression)? _do_ expression // ('@' | 'for') (expression | expression ':' expression)? _do_ expression
nodes::Loop build_loop(parser::ParseTree::Node parser_node, nodes::Loop
nodes::ExpressionStorage &expression_storage, BuilderTask<nodes::Loop>::operator()(const parser::ParseTree::Node &parser_node,
nodes::TypeStorage &type_storage) { const utils::None &) {
size_t named_child_count = parser_node.named_child_count(); size_t named_child_count = parser_node.named_child_count();
if (named_child_count == 1) { // body if (named_child_count == 1) { // body
return nodes::Loop(build_node(parser_node), return nodes::Loop(
build_expression(parser_node.nth_named_child(0), build_node(parser_node),
expression_storage, type_storage)); Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
} else if (named_child_count == 2) { // condition, body } else if (named_child_count == 2) { // condition, body
return nodes::Loop(build_node(parser_node), return nodes::Loop(
build_expression(parser_node.nth_named_child(0), build_node(parser_node),
expression_storage, type_storage), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
build_expression(parser_node.nth_named_child(1), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)));
expression_storage, type_storage));
} else if (named_child_count == 3) { // variable, interval, body } else if (named_child_count == 3) { // variable, interval, body
return nodes::Loop(build_node(parser_node), return nodes::Loop(
build_expression(parser_node.nth_named_child(0), build_node(parser_node),
expression_storage, type_storage), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
build_expression(parser_node.nth_named_child(1), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)),
expression_storage, type_storage), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(2)));
build_expression(parser_node.nth_named_child(2),
expression_storage, type_storage));
} else { } else {
error_handling::handle_parsing_error( error_handling::handle_parsing_error(
"Unexprected named expression amount in loop", parser_node); "Unexprected named expression amount in loop", parser_node);
@ -296,19 +271,16 @@ nodes::Loop build_loop(parser::ParseTree::Node parser_node,
// expression ',' expression // expression ',' expression
nodes::NameExpression nodes::NameExpression
build_comma_expression(parser::ParseTree::Node parser_node, BuilderTask<nodes::NameExpression, utils::CommaTag>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>> std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
arguments; arguments;
arguments.emplace_back(std::nullopt, arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
build_expression(parser_node.nth_named_child(0), parser_node.nth_named_child(0)));
expression_storage, type_storage));
arguments.emplace_back(std::nullopt, arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
build_expression(parser_node.nth_named_child(1), parser_node.nth_named_child(1)));
expression_storage, type_storage));
return nodes::NameExpression( return nodes::NameExpression(
build_node(parser_node), build_node(parser_node),
@ -320,21 +292,18 @@ build_comma_expression(parser::ParseTree::Node parser_node,
// expression operator expression // expression operator expression
nodes::NameExpression nodes::NameExpression
build_operator_expression(parser::ParseTree::Node parser_node, BuilderTask<nodes::NameExpression, utils::OperatorTag>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
auto name_node = parser_node.child_by_field_name("name"); auto name_node = parser_node.child_by_field_name("name");
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>> std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
arguments; arguments;
arguments.emplace_back(std::nullopt, arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
build_expression(name_node.previous_named_sibling(), name_node.previous_named_sibling()));
expression_storage, type_storage));
arguments.emplace_back(std::nullopt, arguments.emplace_back(std::nullopt, Run<nodes::ExpressionProxy>(
build_expression(name_node.next_named_sibling(), name_node.next_named_sibling()));
expression_storage, type_storage));
return nodes::NameExpression(build_node(parser_node), return nodes::NameExpression(build_node(parser_node),
build_operator(name_node), std::move(arguments), build_operator(name_node), std::move(arguments),
@ -343,59 +312,24 @@ build_operator_expression(parser::ParseTree::Node parser_node,
// --- continers // --- continers
nodes::Container // // Container -> .hpp
build_container(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage,
nodes::Container::ContainerType container_type) {
std::vector<nodes::ExpressionProxy> expressions;
auto current_node = parser_node.nth_named_child(0);
while (!current_node.is_null()) {
expressions.push_back(
build_expression(current_node, expression_storage, type_storage));
current_node = current_node.next_named_sibling();
}
return nodes::Container(build_node(parser_node), container_type,
std::move(expressions));
}
// '{' (expression ';')* '}'
nodes::Container build_block(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
return build_container(parser_node, expression_storage, type_storage,
nodes::Container::BLOCK);
}
// '[[' expression+ ']]'
nodes::Container build_array(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
return build_container(parser_node, expression_storage, type_storage,
nodes::Container::ARRAY);
}
// --- modifiers // --- modifiers
// ('return' | 'bring') expression // ('return' | 'bring') expression
nodes::Return build_return(parser::ParseTree::Node parser_node, nodes::Return BuilderTask<nodes::Return>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
std::string modifier = parser_node.nth_child(0).get_value(); std::string modifier = parser_node.nth_child(0).get_value();
return nodes::Return(build_node(parser_node), return nodes::Return(
modifier == "return" ? nodes::Return::RETURN build_node(parser_node),
: nodes::Return::BRING, modifier == "return" ? nodes::Return::RETURN : nodes::Return::BRING,
build_expression(parser_node.nth_named_child(0), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
expression_storage, type_storage));
} }
// _var_let_ (simple_name_identifier | placeholder) // _var_let_ (simple_name_identifier | placeholder)
nodes::NameDefinition nodes::NameDefinition BuilderTask<nodes::NameDefinition>::operator()(
build_name_definition(parser::ParseTree::Node parser_node) { const parser::ParseTree::Node &parser_node, const utils::None &) {
std::string modifier = parser_node.nth_child(0).get_value(); std::string modifier = parser_node.nth_child(0).get_value();
auto name_node = parser_node.nth_named_child(0); auto name_node = parser_node.nth_named_child(0);
@ -408,76 +342,41 @@ build_name_definition(parser::ParseTree::Node parser_node) {
} // IN PROGRESS } // IN PROGRESS
// expression '[' expression ']' // expression '[' expression ']'
nodes::Access build_array_access(parser::ParseTree::Node parser_node, nodes::Access BuilderTask<nodes::Access, utils::ArrayAccessTag>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) { return nodes::Access(
return nodes::Access(build_node(parser_node), nodes::Access::ARRAY, build_node(parser_node), nodes::Access::ARRAY,
build_expression(parser_node.nth_named_child(0), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
expression_storage, type_storage), Run<nodes::ExpressionProxy>(parser_node.nth_named_child(1)));
build_expression(parser_node.nth_named_child(1),
expression_storage, type_storage));
} }
// expression '.' number_literal // expression '.' number_literal
nodes::Access build_tuple_access(parser::ParseTree::Node parser_node, nodes::Access BuilderTask<nodes::Access, utils::TupleAccessTag>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
return nodes::Access( return nodes::Access(
build_node(parser_node), nodes::Access::TUPLE, build_node(parser_node), nodes::Access::TUPLE,
build_expression(parser_node.nth_named_child(0), expression_storage, Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)),
type_storage), state<Exprs>().add_expression(nodes::Expression(
expression_storage.add_expression(nodes::Expression(
build_node(parser_node.nth_named_child(1)), build_node(parser_node.nth_named_child(1)),
build_index_literal(parser_node.nth_named_child(1)), false))); build_index_literal(parser_node.nth_named_child(1)), false)));
} }
// 'break' | 'continue' // 'break' | 'continue'
nodes::LoopControl build_loop_control(parser::ParseTree::Node parser_node) { nodes::LoopControl BuilderTask<nodes::LoopControl>::operator()(
const parser::ParseTree::Node &parser_node, const utils::None &) {
return nodes::LoopControl(build_node(parser_node), return nodes::LoopControl(build_node(parser_node),
parser_node.get_value() == "break" parser_node.get_value() == "break"
? nodes::LoopControl::BREAK ? nodes::LoopControl::BREAK
: nodes::LoopControl::CONTINUE); : nodes::LoopControl::CONTINUE);
} }
nodes::ModifierExpression // // ModifierExpression -> .hpp
build_modifier_expression(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage,
size_t modifier_position) {
return nodes::ModifierExpression(
build_node(parser_node),
build_modifier(parser_node.nth_child(modifier_position)),
build_expression(parser_node.nth_named_child(0), expression_storage,
type_storage));
}
// _reference_ expression
nodes::ModifierExpression
build_reference_expression(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
return build_modifier_expression(parser_node, expression_storage,
type_storage, 0);
}
// expression ('?' | '!')
nodes::ModifierExpression
build_suffix_expression(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
return build_modifier_expression(parser_node, expression_storage,
type_storage, parser_node.child_count() - 1);
}
// --- other // --- other
void build_arguments_until_end( void build_arguments_until_end(
parser::ParseTree::Node first_parse_node, parser::ParseTree::Node first_parse_node, Executor &executor,
nodes::ExpressionStorage &expression_storage, std::vector<nodes::AnnotatedArgument> &arguments) {
nodes::TypeStorage &type_storage,
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
&arguments) {
auto current_node = first_parse_node; auto current_node = first_parse_node;
@ -489,7 +388,7 @@ void build_arguments_until_end(
} else { } else {
arguments.emplace_back( arguments.emplace_back(
std::move(last_annotation), std::move(last_annotation),
build_expression(current_node, expression_storage, type_storage)); executor.Run<nodes::ExpressionProxy>(current_node));
last_annotation = std::nullopt; last_annotation = std::nullopt;
} }
current_node = current_node.next_named_sibling(); current_node = current_node.next_named_sibling();
@ -499,11 +398,9 @@ void build_arguments_until_end(
// (type '.' simple_name | expression '.' simple_name | name | '(' operator // (type '.' simple_name | expression '.' simple_name | name | '(' operator
// ')') (annotation? expression)* // ')') (annotation? expression)*
nodes::NameExpression nodes::NameExpression
build_name_expression(parser::ParseTree::Node parser_node, BuilderTask<nodes::NameExpression, utils::FuncCallTag>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) { std::vector<nodes::AnnotatedArgument> arguments;
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
arguments;
std::optional<nodes::Type> prefix; std::optional<nodes::Type> prefix;
@ -528,45 +425,40 @@ build_name_expression(parser::ParseTree::Node parser_node,
prefix_node = current_node; prefix_node = current_node;
} else { } else {
is_point_call = true; is_point_call = true;
arguments.emplace_back( arguments.emplace_back(std::nullopt,
std::nullopt, Run<nodes::ExpressionProxy>(current_node));
build_expression(current_node, expression_storage, type_storage));
} }
} }
build_arguments_until_end(name_node.next_named_sibling(), expression_storage, build_arguments_until_end(name_node.next_named_sibling(), executor,
type_storage, arguments); arguments);
return nodes::NameExpression( return nodes::NameExpression(
build_node(parser_node), build_identifier(name_node), build_node(parser_node), build_identifier(name_node),
std::move(arguments), std::move(arguments),
prefix_node.has_value() ? build_type(prefix_node.value(), type_storage) prefix_node.has_value() ? build_type(prefix_node.value(), state<Types>())
: nodes::MaybeTypeProxy(), : nodes::MaybeTypeProxy(),
is_point_call, false); is_point_call, false);
} }
// type (annotation? expression)* // type (annotation? expression)*
nodes::Constructor nodes::Constructor BuilderTask<nodes::Constructor>::operator()(
build_constructor(parser::ParseTree::Node parser_node, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::ExpressionStorage &expression_storage, std::vector<nodes::AnnotatedArgument> arguments;
nodes::TypeStorage &type_storage) {
std::vector<std::pair<std::optional<std::string>, nodes::ExpressionProxy>>
arguments;
build_arguments_until_end( build_arguments_until_end(
parser_node.child_by_field_name("type").next_named_sibling(), parser_node.child_by_field_name("type").next_named_sibling(), executor,
expression_storage, type_storage, arguments); arguments);
return nodes::Constructor( return nodes::Constructor(
build_node(parser_node), build_node(parser_node),
build_type(parser_node.child_by_field_name("type"), type_storage), build_type(parser_node.child_by_field_name("type"), state<Types>()),
std::move(arguments)); std::move(arguments));
} }
// '\\' argument_name* _do_ expression // '\\' argument_name* _do_ expression
nodes::Lambda build_lambda(parser::ParseTree::Node parser_node, nodes::Lambda BuilderTask<nodes::Lambda>::operator()(
nodes::ExpressionStorage &expression_storage, const parser::ParseTree::Node &parser_node, const utils::None &) {
nodes::TypeStorage &type_storage) {
std::vector<nodes::Identifier> arguments; std::vector<nodes::Identifier> arguments;
auto current_node = auto current_node =
@ -580,9 +472,8 @@ nodes::Lambda build_lambda(parser::ParseTree::Node parser_node,
// skip '=>' // skip '=>'
current_node = current_node.next_named_sibling(); current_node = current_node.next_named_sibling();
return nodes::Lambda( return nodes::Lambda(build_node(parser_node), std::move(arguments),
build_node(parser_node), std::move(arguments), Run<nodes::ExpressionProxy>(current_node));
build_expression(current_node, expression_storage, type_storage));
} }
} // namespace builders } // namespace builders

View file

@ -379,6 +379,9 @@ private:
// --- other // --- other
using AnnotatedArgument =
std::pair<std::optional<std::string>, ExpressionProxy>;
class NameExpression : public TypedNode { class NameExpression : public TypedNode {
public: public:
NameExpression(Node node, Identifier &&name) NameExpression(Node node, Identifier &&name)
@ -387,12 +390,10 @@ public:
NameExpression(Node node, const Identifier &name) NameExpression(Node node, const Identifier &name)
: TypedNode(node), name_(name) {} : TypedNode(node), name_(name) {}
NameExpression( NameExpression(Node node, Identifier &&name,
Node node, Identifier &&name, std::vector<AnnotatedArgument> &&arguments,
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>> std::optional<TypeProxy> &&prefix, bool is_point_call = false,
&&arguments, bool is_operator_call = false)
std::optional<TypeProxy> &&prefix, bool is_point_call = false,
bool is_operator_call = false)
: TypedNode(node), name_(std::move(name)), : TypedNode(node), name_(std::move(name)),
arguments_(std::move(arguments)), prefix_(std::move(prefix)), arguments_(std::move(arguments)), prefix_(std::move(prefix)),
is_point_call_(is_point_call), is_operator_call_(is_operator_call) {} is_point_call_(is_point_call), is_operator_call_(is_operator_call) {}
@ -446,8 +447,7 @@ public:
private: private:
Identifier name_; Identifier name_;
// universal function call syntax // universal function call syntax
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>> std::vector<AnnotatedArgument> arguments_;
arguments_;
std::optional<TypeProxy> prefix_; std::optional<TypeProxy> prefix_;
// for static methods // for static methods
bool is_point_call_ = false; // x.f ... or f x ... bool is_point_call_ = false; // x.f ... or f x ...
@ -456,17 +456,13 @@ private:
class Constructor : public TypedNode { class Constructor : public TypedNode {
public: public:
Constructor( Constructor(Node node, TypeProxy type,
Node node, TypeProxy type, std::vector<AnnotatedArgument> &&arguments)
std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
&&arguments)
: TypedNode(node), constructor_type_(type), : TypedNode(node), constructor_type_(type),
arguments_(std::move(arguments)) {} arguments_(std::move(arguments)) {}
Constructor( Constructor(Node node, TypeProxy type,
Node node, TypeProxy type, const std::vector<AnnotatedArgument> &arguments)
const std::vector<std::pair<std::optional<std::string>, ExpressionProxy>>
&arguments)
: TypedNode(node), constructor_type_(type), arguments_(arguments) {} : TypedNode(node), constructor_type_(type), arguments_(arguments) {}
Type *get_type() { return constructor_type_.get(); } Type *get_type() { return constructor_type_.get(); }