#include #include // for clangd #include "../include/build_visitor.hpp" #include "../include/parse_token_types.hpp" namespace interpreter { // Sources ----------------- void BuildVisitor::Visit(SourceFile* node) { auto parse_node = current_node_; size_t statement_count = parse_node.NamedChildCount(); node->statements.resize(statement_count); for (size_t i = 0; i < statement_count; ++i) { current_node_ = parse_node.NthNamedChild(i); auto current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::SourceStatement) { node->statements[i].emplace(); Visit(std::get(node->statements[i])); } else if (current_node_type == parser::tokens::Partition) { node->statements[i].emplace(); Visit(&std::get(node->statements[i])); } } current_node_ = parse_node; } void BuildVisitor::Visit(Sources* node) { auto parse_node = current_node_; size_t statement_count = parse_node.NamedChildCount(); node->statements.resize(statement_count); for (size_t i = 0; i < statement_count; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->statements[i]); } current_node_ = parse_node; } // Namespaces, partitions ----------------- void BuildVisitor::Visit(Partition* node) { auto parse_node = current_node_; std::string name = parse_node.ChildByFieldName("name").GetValue(); if (name == "TEST") { node->type = Partition::Test; } else if (name == "INTERFACE") { node->type = Partition::Interface; } else if (name == "CORE") { node->type = Partition::Core; } else if (name == "LIB") { node->type = Partition::Lib; } else if (name == "MODULE") { node->type = Partition::Module; } else if (name == "EXE") { node->type = Partition::Exe; } current_node_ = parse_node.ChildByFieldName("scope"); node->scope = std::make_unique(); Visit(node->scope.get()); current_node_ = parse_node; } void BuildVisitor::Visit(Namespace* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("name"); auto current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::DefinedAnnotatedName) { std::string name_modifier = parse_node.NthChild(1).GetValue(); // TODO if (name_modifier == "const") { node->is_const = true; } else if (name_modifier == "var") { node->is_const = false; } node->name = std::make_unique(); Visit(std::get>(node->name).get()); } else if (current_node_type == parser::tokens::DefinedType) { node->is_const = false; // TODO node->name = std::make_unique(); Visit(std::get>(node->name).get()); } current_node_ = parse_node.ChildByFieldName("scope"); node->scope = std::make_unique(); Visit(node->scope.get()); current_node_ = parse_node; } // Definitions ----------------- void BuildVisitor::Visit(ImportStatement* node) { auto parse_node = current_node_; auto module_name_node = parse_node.ChildByFieldName("module_name"); node->module_name = module_name_node.NthChild(1).GetValue(); // open string literal size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->symbols.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); Visit(node->symbols[i]); } } current_node_ = parse_node; } void BuildVisitor::Visit(UsageDefinition* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); current_node_ = parse_node.ChildByFieldName("import_statement"); node->import_statement = std::make_unique(); Visit(node->import_statement.get()); current_node_ = parse_node; } void BuildVisitor::Visit(AliasDefinition* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.get()); current_node_ = parse_node.ChildByFieldName("value"); node->value = std::make_unique(); Visit(node->value.get()); current_node_ = parse_node; } void BuildVisitor::Visit(VariableDefinition* node) { auto parse_node = current_node_; std::string name_modifier = parse_node.NthChild(0).GetValue(); if (name_modifier == "const") { node->is_const = true; } else if (name_modifier == "var") { node->is_const = false; } node->name = parse_node.ChildByFieldName("name").GetValue(); current_node_ = parse_node.ChildByFieldName("value"); Visit(node->value); current_node_ = parse_node; } void BuildVisitor::Visit(FunctionDeclaration* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool parameters_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); if (current_node_.GetType() != parser::tokens::DefinitionParameter) { parameters_ended = true; } if (!parameters_ended) { node->parameters.push_back(std::make_unique()); Visit(node->parameters.back().get()); } else { node->argument_types.emplace_back(); Visit(node->argument_types.back()); } } } current_node_ = parse_node; } void BuildVisitor::Visit(FunctionDefinition* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("name"); node->name = std::make_unique(); Visit(node->name.get()); current_node_ = parse_node.ChildByFieldName("value"); Visit(node->value); current_node_ = parse_node; } void BuildVisitor::Visit(AliasTypeDefinition* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.get()); current_node_ = parse_node.ChildByFieldName("value"); node->value = std::make_unique(); Visit(node->value.get()); current_node_ = parse_node; } void BuildVisitor::Visit(TypeDefinition* node) { auto parse_node = current_node_; std::string type_modifier = parse_node.NthChild(0).GetValue(); // TODO if (type_modifier == "class") { node->is_class = true; } else if (type_modifier == "struct") { node->is_class = false; } current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.get()); current_node_ = parse_node.ChildByFieldName("value"); Visit(node->value); current_node_ = parse_node; } void BuildVisitor::Visit(TypeclassDefinition* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("typeclass"); node->typeclass = std::make_unique(); Visit(node->typeclass.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->requirements.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); node->requirements[i] = std::make_unique(); Visit(node->requirements[i].get()); } } current_node_ = parse_node; } // void BuildVisitor::Visit(SourceStatement& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::ImportStatement) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::UsageDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::AliasDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariableDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::FunctionDeclaration) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::FunctionDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::AliasTypeDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TypeDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TypeclassDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::Namespace) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(ImportSymbol& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TypeExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::NameExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } // Definition parts void BuildVisitor::Visit(DefinedName* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); node->is_operator = (parse_node.NthChild(0).GetValue() == "("); // TODO size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool parameters_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); if (current_node_.GetType() != parser::tokens::DefinitionParameter) { parameters_ended = true; } if (!parameters_ended) { node->parameters.push_back(std::make_unique()); Visit(node->parameters.back().get()); } else { node->arguments.push_back(std::make_unique()); Visit(node->arguments.back().get()); } } } current_node_ = parse_node; } void BuildVisitor::Visit(DefinedAnnotatedName* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { current_node_ = parse_node.NthNamedChild(1); auto current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::DefinedType) { node->type = std::make_unique(); Visit(std::get>(node->type).get()); } else if (current_node_type == parser::tokens::DefinedTypeclass) { node->type = std::make_unique(); Visit(std::get>(node->type).get()); } current_node_ = parse_node; } } void BuildVisitor::Visit(DefinedType* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool parameters_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); if (current_node_.GetType() != parser::tokens::DefinitionParameter) { parameters_ended = true; } if (!parameters_ended) { node->parameters.push_back(std::make_unique()); Visit(node->parameters.back().get()); } else { node->arguments.push_back(std::make_unique()); Visit(node->arguments.back().get()); } } } current_node_ = parse_node; } void BuildVisitor::Visit(DefinedTypeclass* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("typeclass"); node->typeclass = std::make_unique(); Visit(node->typeclass.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool parameters_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); if (current_node_.GetType() != parser::tokens::DefinitionParameter) { parameters_ended = true; } if (!parameters_ended) { node->parameters.push_back(std::make_unique()); Visit(node->parameters.back().get()); } else { node->arguments.push_back(std::make_unique()); Visit(node->arguments.back().get()); } } } current_node_ = parse_node; } void BuildVisitor::Visit(DefinitionParameter* node) { auto parse_node = current_node_; node->type = parse_node.ChildByFieldName("type").GetValue(); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->typeclasses.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); std::string current_node_type = current_node_.GetType(); node->typeclasses[i] = std::make_unique(); if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ?? node->typeclasses[i]->typeclass_expression = std::make_unique(); Visit(node->typeclasses[i]->typeclass_expression.get()); } else if (current_node_type == parser::tokens::ParametrizedTypeclass) { Visit(node->typeclasses[i].get()); } else { // error } } } current_node_ = parse_node; } void BuildVisitor::Visit(DefinitionArgument* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->types.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); std::string current_node_type = current_node_.GetType(); node->types[i] = std::make_unique(); if (current_node_type == parser::tokens::TypeExpression) { // optimize ?? node->types[i]->type_expression = std::make_unique(); Visit(node->types[i]->type_expression.get()); } else if (current_node_type == parser::tokens::ParametrizedType) { Visit(node->types[i].get()); } else { // error } } } current_node_ = parse_node; } void BuildVisitor::Visit(FunctionDeclarationType& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::ParametrizedType) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TupleType) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariantType) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::ParametrizedTypeclass) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } // Flow control ----------------- void BuildVisitor::Visit(MatchCase* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("value"); Visit(node->value); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { std::string prefix = parse_node.NthChild(2).GetValue(); // TODO if (child_count > 2 || prefix == "?") { current_node_ = parse_node.ChildByFieldName("condition"); node->condition.emplace(); Visit(node->condition.value()); } if (child_count > 2 || prefix == "->") { current_node_ = parse_node.ChildByFieldName("statement"); node->statement.emplace(); Visit(node->statement.value()); } } current_node_ = parse_node; } void BuildVisitor::Visit(Match* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("value"); Visit(node->value); size_t child_count = parse_node.NamedChildCount(); // if (child_count > 1) { // always true (repeat1) node->matches.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); Visit(&node->matches[i]); } // } current_node_ = parse_node; } void BuildVisitor::Visit(Condition* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); node->conditions.resize(child_count / 2); node->statements.resize((child_count + 1) / 2); for (size_t i = 0; i < child_count; ++i) { current_node_ = parse_node.NthNamedChild(i); if (i % 2 == 0 && i / 2 < node->conditions.size()) { Visit(node->conditions[i / 2]); } else { Visit(node->statements[i / 2]); } } current_node_ = parse_node; } void BuildVisitor::Visit(DoWhileLoop* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("statement"); Visit(node->statement); current_node_ = parse_node.ChildByFieldName("condition"); Visit(node->condition); current_node_ = parse_node; } void BuildVisitor::Visit(WhileLoop* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("condition"); Visit(node->condition); current_node_ = parse_node.ChildByFieldName("statement"); Visit(node->statement); current_node_ = parse_node; } void BuildVisitor::Visit(ForLoop* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("variable"); Visit(node->variable); current_node_ = parse_node.ChildByFieldName("interval"); Visit(node->interval); current_node_ = parse_node.ChildByFieldName("statement"); Visit(node->statement); current_node_ = parse_node; } void BuildVisitor::Visit(LoopLoop* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("statement"); Visit(node->statement); current_node_ = parse_node; } void BuildVisitor::Visit(FlowControl& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::Match) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::Condition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::DoWhileLoop) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::WhileLoop) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::ForLoop) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::LoopLoop) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } // Statements, expressions, blocks, etc. ----------------- void BuildVisitor::Visit(Block* node) { auto parse_node = current_node_; size_t statement_count = parse_node.NamedChildCount(); node->statements.resize(statement_count); for (size_t i = 0; i < statement_count; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->statements[i]); } current_node_ = parse_node; } void BuildVisitor::Visit(ScopedStatement* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("statement"); Visit(node->statement); current_node_ = parse_node; } void BuildVisitor::Visit(LoopControlExpression& node) { std::string value = current_node_.NthChild(0).GetValue(); if (value == "break") { node = LoopControlExpression::Break; } else if (value == "continue") { node = LoopControlExpression::Continue; } else { // error } } // void BuildVisitor::Visit(SubExpressionToken& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::NameSuperExpression) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::ScopedStatement) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(SubExpression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::FunctionCallExpression) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::BinaryOperatorExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::SubExpressionToken) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(PrefixedExpression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::ReturnExpression) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::LoopControlExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::Block) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(Expression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::LambdaFunction) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TypeConstructor) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::PrefixedExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::UnaryOperatorExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::SubExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(SuperExpression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::FlowControl) { // optimize ?? node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::TupleExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariantExpression) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::Expression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(BlockStatement& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::Expression) { // optimize ?? node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::AliasDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariableDefinition) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::FlowControl) { node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::PrefixedExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } // Operators void BuildVisitor::Visit(BinaryOperatorExpression* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("left_expression"); Visit(node->left_expression); node->operator_name = parse_node.ChildByFieldName("operator_name").GetValue(); current_node_ = parse_node.ChildByFieldName("right_expression"); Visit(node->right_expression); current_node_ = parse_node; } void BuildVisitor::Visit(UnaryOperatorExpression* node) { auto parse_node = current_node_; node->operator_name = parse_node.ChildByFieldName("operator_name").GetValue(); current_node_ = parse_node.ChildByFieldName("expression"); Visit(node->expression); current_node_ = parse_node; } // Simple Expressions void BuildVisitor::Visit(FunctionCallExpression* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("name"); node->name = std::make_unique(); Visit(node->name.get()); size_t child_count = parse_node.NamedChildCount(); // if (child_count > 1) { // always true (repeat1) node->arguments.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); Visit(node->arguments[i]); } // } current_node_ = parse_node; } void BuildVisitor::Visit(TupleExpression* node) { auto parse_node = current_node_; size_t expressions_count = parse_node.NamedChildCount(); node->expressions.resize(expressions_count); for (size_t i = 0; i < expressions_count; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->expressions[i]); } current_node_ = parse_node; } void BuildVisitor::Visit(VariantExpression* node) { auto parse_node = current_node_; size_t expressions_count = parse_node.NamedChildCount(); node->expressions.resize(expressions_count); for (size_t i = 0; i < expressions_count; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->expressions[i]); } current_node_ = parse_node; } void BuildVisitor::Visit(ReturnExpression* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("expression"); Visit(node->expression); current_node_ = parse_node; } // void BuildVisitor::Visit(FunctionArgument& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::SubExpressionToken) { // optimize ?? node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::TypeSubExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } // Lambda void BuildVisitor::Visit(LambdaFunction* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool parameters_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i); if (current_node_.GetType() != parser::tokens::DefinitionParameter) { parameters_ended = true; } if (!parameters_ended) { node->parameters.push_back(std::make_unique()); Visit(node->parameters.back().get()); } else { node->arguments.push_back(std::make_unique()); Visit(node->arguments.back().get()); } } } current_node_ = parse_node.ChildByFieldName("expression"); Visit(node->expression); current_node_ = parse_node; } // Name void BuildVisitor::Visit(NameSuperExpression* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); bool namespaces_ended = false; for (size_t i = 0; i < child_count; ++i) { current_node_ = parse_node.NthNamedChild(i); std::string current_node_type = current_node_.GetType(); if (current_node_type != parser::tokens::TypeSubExpression && !namespaces_ended) { namespaces_ended = true; if (i + 1 == child_count) { node->expressions.emplace_back(); if (current_node_type == parser::tokens::NameIdentifier) { // optimize ?? node->expressions.back() = std::make_unique(current_node_.GetValue()); } else if (current_node_type == parser::tokens::Literal) { node->expressions.back() = std::make_unique(); Visit(*std::get>(node->expressions.back())); } else { // error } break; } else { // error } } if (!namespaces_ended) { node->namespaces.emplace_back(); Visit(node->namespaces.back()); } else { node->expressions.emplace_back(); Visit(node->expressions.back()); } } current_node_ = parse_node; } void BuildVisitor::Visit(NameExpression* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { bool types_ended = false; for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i); if (current_node_.GetType() != parser::tokens::TypeSubExpression) { types_ended = true; } if (!types_ended) { node->namespaces.emplace_back(); Visit(node->namespaces.back()); } else { node->names.push_back(current_node_.GetValue()); } } } current_node_ = parse_node; } void BuildVisitor::Visit(TupleName* node) { auto parse_node = current_node_; size_t names_count = parse_node.NamedChildCount(); node->names.resize(names_count); for (size_t i = 0; i < names_count; ++i) { current_node_ = parse_node.NthNamedChild(i); node->names[i] = std::make_unique(); Visit(node->names[i].get()); } current_node_ = parse_node; } void BuildVisitor::Visit(VariantName* node) { auto parse_node = current_node_; size_t names_count = parse_node.NamedChildCount(); node->names.resize(names_count); for (size_t i = 0; i < names_count; ++i) { current_node_ = parse_node.NthNamedChild(i); node->names[i] =std::make_unique(); Visit(node->names[i].get()); } current_node_ = parse_node; } void BuildVisitor::Visit(AnnotatedName* node) { auto parse_node = current_node_; node->name = parse_node.ChildByFieldName("name").GetValue(); if (parse_node.NamedChildCount() > 1) { current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.value().get()); current_node_ = parse_node; } } void BuildVisitor::Visit(AnyName& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::AnnotatedName) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TupleName) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariantName) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } // Type void BuildVisitor::Visit(TypeConstructor* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type"); node->type = std::make_unique(); Visit(node->type.get()); size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2; node->parameters.resize(parameter_count); for (size_t i = 0; i < parameter_count * 2; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); if (i % 2 == 0) { node->parameters[i / 2].first = current_node_.GetValue(); } else { Visit(node->parameters[i / 2].second); } } current_node_ = parse_node; } void BuildVisitor::Visit(TupleType* node) { auto parse_node = current_node_; size_t current_node_n = 0; current_node_ = parse_node.NthNamedChild(current_node_n); if (current_node_.GetType() == parser::tokens::TypeIdentifierDefinition) { node->type = current_node_.GetValue(); // TODO check ++current_node_n; current_node_ = parse_node.NthNamedChild(current_node_n); } while (current_node_n < parse_node.NamedChildCount()) { node->entities.emplace_back(); if (current_node_.GetType() == parser::tokens::NameIdentifier) { node->entities.back().first = current_node_.GetValue(); ++current_node_n; current_node_ = parse_node.NthNamedChild(current_node_n); } Visit(node->entities.back().second); ++current_node_n; current_node_ = parse_node.NthNamedChild(current_node_n); } current_node_ = parse_node; } void BuildVisitor::Visit(VariantType* node) { auto parse_node = current_node_; size_t current_node_n = 0; current_node_ = parse_node.NthNamedChild(current_node_n); if (current_node_.GetType() == parser::tokens::TypeIdentifierDefinition) { node->type = current_node_.GetValue(); // TODO check ++current_node_n; current_node_ = parse_node.NthNamedChild(current_node_n); } while (current_node_n < parse_node.NamedChildCount()) { std::string current_node_type = current_node_.GetType(); node->constructors.emplace_back(); if (current_node_type == parser::tokens::TypeIdentifierDefinition) { // optimize ?? node->constructors.back() = current_node_.GetValue(); // TODO check } else if (current_node_type == parser::tokens::TupleType) { node->constructors.back() = std::make_unique(); Visit(std::get>(node->constructors.back()).get()); } else { // error } ++current_node_n; current_node_ = parse_node.NthNamedChild(current_node_n); } current_node_ = parse_node; } void BuildVisitor::Visit(AnnotatedType* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type_expression"); node->type_expression = std::make_unique(); Visit(node->type_expression.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->annotations.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); std::string current_node_type = current_node_.GetType(); node->annotations[i] = std::make_unique(); if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ?? node->annotations[i]->typeclass_expression = std::make_unique(); Visit(node->annotations[i]->typeclass_expression.get()); } else if (current_node_type == parser::tokens::ParametrizedTypeclass) { Visit(node->annotations[i].get()); } else { // error } } } current_node_ = parse_node; } void BuildVisitor::Visit(ParametrizedType* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("type_expression"); node->type_expression = std::make_unique(); Visit(node->type_expression.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->parameters.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); Visit(node->parameters[i]); } } current_node_ = parse_node; } void BuildVisitor::Visit(TypeExpression* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->namespaces.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->namespaces[i]); } } node->type = parse_node.ChildByFieldName("type").GetValue(); current_node_ = parse_node; } void BuildVisitor::Visit(AnyType& node) { // Or ScopedAnyType auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::ParametrizedType) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::TupleType) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::VariantType) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(TypeSubExpression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::TypeIdentifier) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::AbstractTypeIdentifier) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::ParametrizedType) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(TypeParameter& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::TypeExpression) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::ParametrizedType) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::Expression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } // Typeclass void BuildVisitor::Visit(AnnotatedTypeclass* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("typeclass_expression"); node->typeclass_expression = std::make_unique(); Visit(node->typeclass_expression.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->annotations.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); std::string current_node_type = current_node_.GetType(); node->annotations[i] = std::make_unique(); if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ?? node->annotations[i]->typeclass_expression = std::make_unique(); Visit(node->annotations[i]->typeclass_expression.get()); } else if (current_node_type == parser::tokens::ParametrizedTypeclass) { Visit(node->annotations[i].get()); } else { // error } } } current_node_ = parse_node; } void BuildVisitor::Visit(ParametrizedTypeclass* node) { auto parse_node = current_node_; current_node_ = parse_node.ChildByFieldName("typeclass_expression"); node->typeclass_expression = std::make_unique(); Visit(node->typeclass_expression.get()); size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->parameters.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i + 1); Visit(node->parameters[i]); } } current_node_ = parse_node; } void BuildVisitor::Visit(TypeclassExpression* node) { auto parse_node = current_node_; size_t child_count = parse_node.NamedChildCount(); if (child_count > 1) { node->namespaces.resize(child_count - 1); for (size_t i = 0; i < child_count - 1; ++i) { current_node_ = parse_node.NthNamedChild(i); Visit(node->namespaces[i]); } } node->typeclass = parse_node.ChildByFieldName("typeclass").GetValue(); current_node_ = parse_node; } // Identifiers, constants, etc. ----------------- void BuildVisitor::Visit(AnyIdentifier* node) { // std::string *node = current_node_.GetValue(); } // TODO use in other places ?? void BuildVisitor::Visit(FloatNumberLiteral* node) { node->value = std::stod(current_node_.GetValue()); } void BuildVisitor::Visit(NumberLiteral* node) { node->value = std::stoll(current_node_.GetValue()); } void BuildVisitor::Visit(StringLiteral* node) { node->value = current_node_.NthChild(1).GetValue(); } void BuildVisitor::Visit(CharLiteral* node) { node->value = current_node_.NthChild(1).GetValue()[0]; } void BuildVisitor::Visit(Literal& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::FloatNumberLiteral) { // optimize ?? node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::NumberLiteral) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::StringLiteral) { node = std::make_unique(); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::CharLiteral) { node = std::make_unique(); Visit(std::get>(node).get()); } else { // error } current_node_ = parse_node; } void BuildVisitor::Visit(NameSubSuperExpression& node) { auto parse_node = current_node_; current_node_ = parse_node.NthNamedChild(0); std::string current_node_type = current_node_.GetType(); if (current_node_type == parser::tokens::NameIdentifier) { // optimize ?? // TODO: choose node = std::make_unique(current_node_.GetValue()); Visit(std::get>(node).get()); } else if (current_node_type == parser::tokens::Literal) { node = std::make_unique(); Visit(*std::get>(node)); } else if (current_node_type == parser::tokens::SuperExpression) { node = std::make_unique(); Visit(*std::get>(node)); } else { // error } current_node_ = parse_node; } } // namespace interpreter