mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-05 22:48:43 +00:00
part of statements builders func -> task change
This commit is contained in:
parent
cbbf626232
commit
3446d599d7
2 changed files with 94 additions and 65 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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>());
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue