part of statements builders func -> task change

This commit is contained in:
dragon 2024-08-16 21:45:45 +03:00
parent cbbf626232
commit 3446d599d7
2 changed files with 94 additions and 65 deletions

View file

@ -1,39 +1,72 @@
#pragma once
#include "name_tree.hpp"
#include "builders_utils.hpp"
#include "statement_nodes.hpp"
#include "tree_sitter_wrapper.hpp"
#include <vector>
// TODO: move to nodes
namespace nodes {
using Statements = std::vector<nodes::Statement>;
} // namespace nodes
namespace builders {
// statements (copies of statements are in name_tree) returned to print /
// translate them in required order
std::vector<nodes::Statement>
build_source_file(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage, names::NameTree &name_tree);
template <>
struct BuilderTask<nodes::Statements>
: public BuilderTaskBase<nodes::Statements> {
using BuilderTaskBase<nodes::Statements>::BuilderTaskBase;
nodes::Statements operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
// copy of statement inserted into name_tree
nodes::Statement
build_statement(parser::ParseTree::Node parser_node,
std::optional<nodes::Identifier> &previous_defined_type_name,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage, names::NameTree &name_tree);
template <>
struct BuilderTask<nodes::Statement>
: public BuilderTaskBase<nodes::Statement> {
using BuilderTaskBase<nodes::Statement>::BuilderTaskBase;
nodes::Import build_import(parser::ParseTree::Node parser_node);
nodes::Statement operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
nodes::Constraint build_constraint(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage);
template <>
struct BuilderTask<nodes::Import> : public BuilderTaskBase<nodes::Import> {
using BuilderTaskBase<nodes::Import>::BuilderTaskBase;
nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage);
nodes::Import operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::Constraint>
: public BuilderTaskBase<nodes::Constraint> {
using BuilderTaskBase<nodes::Constraint>::BuilderTaskBase;
nodes::Constraint operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::TypeDefinition>
: public BuilderTaskBase<nodes::TypeDefinition> {
using BuilderTaskBase<nodes::TypeDefinition>::BuilderTaskBase;
nodes::TypeDefinition operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
template <>
struct BuilderTask<nodes::FunctionDefinition>
: public BuilderTaskBase<nodes::FunctionDefinition> {
using BuilderTaskBase<nodes::FunctionDefinition>::BuilderTaskBase;
nodes::FunctionDefinition operator()(const ParserNode &parser_node,
const utils::None &args) override;
};
// const std::optional<nodes::Identifier> &previous_defined_type_name, // TODO
nodes::FunctionDefinition build_function_definition(
parser::ParseTree::Node parser_node,
const std::optional<nodes::Identifier> &previous_defined_type_name,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage);
} // namespace builders

View file

@ -20,20 +20,18 @@
namespace builders {
// statement+
std::vector<nodes::Statement>
build_source_file(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage,
names::NameTree &name_tree) {
nodes::Statements
BuilderTask<nodes::Statements>::operator()(const ParserNode &parser_node,
const utils::None &) {
std::vector<nodes::Statement> statements;
std::optional<nodes::Identifier> last_defined_type_name;
auto current_node = parser_node.nth_named_child(0);
while (!current_node.is_null()) {
statements.push_back(build_statement(current_node, last_defined_type_name,
expression_storage, type_storage,
name_tree));
statements.push_back(
Run<nodes::Statement>(current_node /* TODO , last_defined_type_name*/
));
current_node = current_node.next_named_sibling();
}
@ -42,10 +40,9 @@ build_source_file(parser::ParseTree::Node parser_node,
// import | type_definition | function_definition | typeclass_definition
nodes::Statement
build_statement(parser::ParseTree::Node parser_node,
std::optional<nodes::Identifier> &last_defined_type_name,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage, names::NameTree &name_tree) {
BuilderTask<nodes::Statement>::operator()(const ParserNode &parser_node,
const utils::None &) {
// std::optional<nodes::Identifier> &last_defined_type_name, // TODO
tokens::Type type = tokens::string_to_type(parser_node.get_type());
std::optional<std::string> statement_name;
@ -53,8 +50,8 @@ build_statement(parser::ParseTree::Node parser_node,
switch (type) {
case tokens::Type::IMPORT:
statement =
nodes::Statement(build_node(parser_node), build_import(parser_node));
statement = nodes::Statement(build_node(parser_node),
Run<nodes::Import>(parser_node));
statement_name = *statement.value()
.get<nodes::Import>()
.value()
@ -62,9 +59,8 @@ build_statement(parser::ParseTree::Node parser_node,
->get();
break;
case tokens::Type::TYPE_DEFINITION:
statement =
nodes::Statement(build_node(parser_node),
build_type_definition(parser_node, type_storage));
statement = nodes::Statement(build_node(parser_node),
Run<nodes::TypeDefinition>(parser_node));
last_defined_type_name =
*statement.value().get<nodes::TypeDefinition>().value()->get_name();
statement_name = *statement.value()
@ -74,10 +70,11 @@ build_statement(parser::ParseTree::Node parser_node,
->get();
break;
case tokens::Type::FUNCTION_DEFINITION:
statement = nodes::Statement(
build_node(parser_node),
build_function_definition(parser_node, last_defined_type_name,
expression_storage, type_storage));
statement =
nodes::Statement(build_node(parser_node),
Run<nodes::FunctionDefinition>(
parser_node /*, TODO last_defined_type_name*/
));
statement_name = *statement.value()
.get<nodes::FunctionDefinition>()
.value()
@ -103,7 +100,7 @@ build_statement(parser::ParseTree::Node parser_node,
if (statement_name.has_value()) {
auto statement_copy = statement.value();
if (name_tree
if (state<Names>()
.insert_combine(statement_name.value(), std::move(statement_copy))
.second != nodes::CombineResult::OK) {
// TODO: more detailed errors
@ -116,7 +113,9 @@ build_statement(parser::ParseTree::Node parser_node,
}
// ('::' | 'import') simple_name ('=' simple_name)? (':' identifier*)?
nodes::Import build_import(parser::ParseTree::Node parser_node) {
nodes::Import
BuilderTask<nodes::Import>::operator()(const ParserNode &parser_node,
const utils::None &) {
auto name_node = parser_node.child_by_field_name("name");
auto module_node = parser_node.child_by_field_name("module");
@ -137,12 +136,12 @@ nodes::Import build_import(parser::ParseTree::Node parser_node) {
}
// '?' expression
nodes::Constraint build_constraint(parser::ParseTree::Node parser_node,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
return nodes::Constraint(build_node(parser_node),
build_expression(parser_node.nth_named_child(0),
expression_storage, type_storage));
nodes::Constraint
BuilderTask<nodes::Constraint>::operator()(const ParserNode &parser_node,
const utils::None &) {
return nodes::Constraint(
build_node(parser_node),
Run<nodes::ExpressionProxy>(parser_node.nth_named_child(0)));
}
parser::ParseTree::Node collect_symbol_doc_nodes(
@ -176,8 +175,9 @@ parser::ParseTree::Node collect_symbol_doc_nodes(
// definition_info? annotation_info* '<>'? (simple_type_identifier | typeclass)
// (argument_type* '=' type)? ';'
nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
nodes::TypeStorage &type_storage) {
nodes::TypeDefinition
BuilderTask<nodes::TypeDefinition>::operator()(const ParserNode &parser_node,
const utils::None &) {
std::optional<parser::ParseTree::Node> description_node;
std::vector<parser::ParseTree::Node> annotation_nodes;
@ -252,7 +252,7 @@ nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
}
nodes::MaybeTypeProxy type =
type_node.has_value() ? build_type(type_node.value(), type_storage)
type_node.has_value() ? build_type(type_node.value(), state<Types>())
: nodes::MaybeTypeProxy();
std::unordered_set<std::string> annotations;
@ -274,11 +274,9 @@ nodes::TypeDefinition build_type_definition(parser::ParseTree::Node parser_node,
// | '(' operator ')') (annotation? _reference_? argument_name '?'?)* (:
// (annotation? _reference_ type)+)?
// (((block | array) | '=' expression ';') | ';')
nodes::FunctionDefinition build_function_definition(
parser::ParseTree::Node parser_node,
const std::optional<nodes::Identifier> &last_defined_type_name,
nodes::ExpressionStorage &expression_storage,
nodes::TypeStorage &type_storage) {
nodes::FunctionDefinition BuilderTask<nodes::FunctionDefinition>::operator()(
const ParserNode &parser_node, const utils::None &) {
// const std::optional<nodes::Identifier> &last_defined_type_name, // TODO
std::optional<parser::ParseTree::Node> description_node;
std::vector<parser::ParseTree::Node> annotation_nodes;
@ -291,8 +289,7 @@ nodes::FunctionDefinition build_function_definition(
while (!current_node.is_null() &&
tokens::string_to_type(current_node.get_type()) ==
tokens::Type::CONSTRAINT) {
constraints.push_back(
build_constraint(current_node, expression_storage, type_storage));
constraints.push_back(Run<nodes::Constraint>(current_node));
current_node = current_node.next_named_sibling();
}
@ -386,11 +383,11 @@ nodes::FunctionDefinition build_function_definition(
case tokens::Type::SIMPLE_TYPE:
if (current_type_id >= arguments.size()) {
arguments.push_back(nodes::FunctionDefinition::Argument(
last_annotation, build_type(current_node, type_storage),
last_annotation, build_type(current_node, state<Types>()),
last_before_modifier));
} else {
if (!arguments[current_type_id].add_type(
last_annotation, build_type(current_node, type_storage),
last_annotation, build_type(current_node, state<Types>()),
last_before_modifier)) {
error_handling::handle_parsing_error(
"It is impossible to use argument modifiers (annotations, "
@ -464,8 +461,7 @@ nodes::FunctionDefinition build_function_definition(
build_identifier(name_node), std::move(arguments),
are_annotations_same_to_names,
expression_node.has_value()
? build_expression(expression_node.value(), expression_storage,
type_storage)
? Run<nodes::ExpressionProxy>(expression_node.value())
: std::optional<nodes::ExpressionProxy>());
}