This commit is contained in:
ProgramSnail 2023-03-31 12:10:12 +03:00
parent 582ad5668e
commit 0d62ae0814
29 changed files with 99479 additions and 1166 deletions

View file

@ -1,8 +1,10 @@
#include <iostream>
#include <memory>
// forclangd
#include "../include/build_visitor.hpp"
#include "../include/parse_token_types.hpp"
#include <bits/utility.h>
#include <memory>
namespace interpreter {
@ -77,6 +79,7 @@ void BuildVisitor::Visit(Namespace* node) {
auto 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") {
@ -254,10 +257,11 @@ void BuildVisitor::Visit(TypeclassDefinition* node) {
size_t child_count = parse_node.NamedChildCount();
if (child_count > 1) {
node->requirements.resize(child_count - 1, std::make_unique<FunctionDeclaration>());
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<FunctionDeclaration>();
Visit(node->requirements[i].get());
}
}
@ -463,12 +467,23 @@ void BuildVisitor::Visit(DefinitionParameter* node) {
size_t child_count = parse_node.NamedChildCount();
if (child_count > 1) {
node->typeclasses.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
node->typeclasses.resize(child_count - 1);
for (size_t i = 0; i < child_count - 1; ++i) {
current_node_ = parse_node.NthNamedChild(i + 1);
Visit(node->typeclasses[i].get());
// choose between typeclass_expression and parametrized_typeclass
std::string current_node_type = current_node_.GetType();
node->typeclasses[i] = std::make_unique<ParametrizedTypeclass>();
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
node->typeclasses[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
Visit(node->typeclasses[i]->typeclass_expression.get());
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
Visit(node->typeclasses[i].get());
} else {
// error
}
}
}
@ -483,12 +498,23 @@ void BuildVisitor::Visit(DefinitionArgument* node) {
size_t child_count = parse_node.NamedChildCount();
if (child_count > 1) {
node->types.resize(child_count - 1, std::make_unique<ParametrizedType>());
node->types.resize(child_count - 1);
for (size_t i = 0; i < child_count - 1; ++i) {
current_node_ = parse_node.NthNamedChild(i + 1);
Visit(node->types[i].get());
// choose between type_expression and parametrized_type
std::string current_node_type = current_node_.GetType();
node->types[i] = std::make_unique<ParametrizedType>();
if (current_node_type == parser::tokens::TypeExpression) { // optimize ??
node->types[i]->type_expression = std::make_unique<TypeExpression>();
Visit(node->types[i]->type_expression.get());
} else if (current_node_type == parser::tokens::ParametrizedType) {
Visit(node->types[i].get());
} else {
// error
}
}
}
@ -1079,10 +1105,11 @@ void BuildVisitor::Visit(TupleName* node) {
size_t names_count = parse_node.NamedChildCount();
node->names.resize(names_count, std::make_unique<AnnotatedName>());
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<AnnotatedName>();
Visit(node->names[i].get());
}
@ -1094,10 +1121,11 @@ void BuildVisitor::Visit(VariantName* node) {
size_t names_count = parse_node.NamedChildCount();
node->names.resize(names_count, std::make_unique<AnnotatedName>());
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<AnnotatedName>();
Visit(node->names[i].get());
}
@ -1109,7 +1137,7 @@ void BuildVisitor::Visit(AnnotatedName* node) {
node->name = parse_node.ChildByFieldName("name").GetValue();
if (parse_node.ChildCount() > 1) {
if (parse_node.NamedChildCount() > 1) {
current_node_ = parse_node.ChildByFieldName("type");
node->type = std::make_unique<ParametrizedType>();
Visit(node->type.value().get());
@ -1144,27 +1172,27 @@ void BuildVisitor::Visit(AnyName& node) {
// Type
void BuildVisitor::Visit(TypeConstructor* node) {
auto parse_node = current_node_;
current_node_ = parse_node.ChildByFieldName("type");
node->type = std::make_unique<ParametrizedType>();
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;
// auto parse_node = current_node_;
//
// current_node_ = parse_node.ChildByFieldName("type");
// node->type = std::make_unique<ParametrizedType>();
// 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) {
@ -1245,11 +1273,23 @@ void BuildVisitor::Visit(AnnotatedType* node) {
size_t child_count = parse_node.NamedChildCount();
if (child_count > 1) {
node->annotations.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
node->annotations.resize(child_count - 1);
for (size_t i = 0; i < child_count - 1; ++i) {
current_node_ = parse_node.NthNamedChild(i + 1);
current_node_ = parse_node.NthNamedChild(i + 1);
std::string current_node_type = current_node_.GetType();
node->annotations[i] = std::make_unique<ParametrizedTypeclass>();
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
node->annotations[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
Visit(node->annotations[i]->typeclass_expression.get());
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
Visit(node->annotations[i].get());
} else {
// error
}
}
}
@ -1296,7 +1336,7 @@ void BuildVisitor::Visit(TypeExpression* node) {
current_node_ = parse_node;
}
void BuildVisitor::Visit(AnyType& node) {
void BuildVisitor::Visit(AnyType& node) { // Or ScopedAnyType
auto parse_node = current_node_;
current_node_ = parse_node.NthNamedChild(0);
@ -1349,7 +1389,10 @@ void BuildVisitor::Visit(TypeParameter& node) {
std::string current_node_type = current_node_.GetType();
if (current_node_type == parser::tokens::ParametrizedType) { // optimize ??
if (current_node_type == parser::tokens::TypeExpression) { // optimize ??
node = std::make_unique<TypeExpression>();
Visit(std::get<std::unique_ptr<TypeExpression>>(node).get());
} else if (current_node_type == parser::tokens::ParametrizedType) {
node = std::make_unique<ParametrizedType>();
Visit(std::get<std::unique_ptr<ParametrizedType>>(node).get());
} else if (current_node_type == parser::tokens::Expression) {
@ -1374,11 +1417,23 @@ void BuildVisitor::Visit(AnnotatedTypeclass* node) {
size_t child_count = parse_node.NamedChildCount();
if (child_count > 1) {
node->annotations.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
node->annotations.resize(child_count - 1);
for (size_t i = 0; i < child_count - 1; ++i) {
current_node_ = parse_node.NthNamedChild(i + 1);
Visit(node->annotations[i].get());
std::string current_node_type = current_node_.GetType();
node->annotations[i] = std::make_unique<ParametrizedTypeclass>();
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
node->annotations[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
Visit(node->annotations[i]->typeclass_expression.get());
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
Visit(node->annotations[i].get());
} else {
// error
}
}
}