print visitor fixed

This commit is contained in:
ProgramSnail 2023-04-25 15:10:48 +03:00
parent fd047bc517
commit 5bf0c1bf48
3 changed files with 82 additions and 60 deletions

View file

@ -534,7 +534,9 @@ struct VariantType {
};
struct TypeExpression {
std::vector<TypeSubExpression> types;
std::vector<TypeSubExpression> path;
TypeSubExpression type;
std::optional<size_t> array_size; // if array; 0 - dynamic size
utils::IdType type_id_;
@ -548,7 +550,7 @@ struct ExtendedScopedAnyType {
// Typeclass -----------------
struct TypeclassExpression {
std::vector<TypeSubExpression> types;
std::vector<TypeSubExpression> path;
TypeclassSubExpression typeclass;
utils::IdType type_id_;

View file

@ -262,18 +262,25 @@ void PrintVisitor::Visit(AnyAnnotatedType* node) {
// Flow control -----------------
void PrintVisitor::Visit(MatchCase* node) {
out_ << "[MatchCase | ";
Visitor::Visit(node->value);
if (node->condition.has_value()) {
out_ << " ? ";
Visitor::Visit(node->condition.value());
void PrintVisitor::Visit(TypeConstructorPattern* node) {
out_ << "[TypeConstructorPattern ";
Visit(&node->constructor);
out_ << "]\n(";
bool is_first = true;
for (auto& parameter : node->parameters) {
if (!is_first) {
out_ << ")\n";
is_first = false;
}
if (node->statement.has_value()) {
out_ << " -> ";
Visitor::Visit(node->statement.value());
out_ << '(';
if (parameter.first.has_value()) {
Visit(&parameter.first.value());
out_ << " = ";
}
out_ << "]\n";
Visitor::Visit(parameter.second);
}
out_ << ")\n";
}
void PrintVisitor::Visit(MatchCase* node) {
@ -427,8 +434,20 @@ void PrintVisitor::Visit(AccessExpression* node) {
// Other Expressions
void PrintVisitor::Visit(FunctionCallExpression* node) {
out_ << "[FunctionCall ";
Visit(node->name.get());
out_ << "[FunctionCall (";
if (std::holds_alternative<std::unique_ptr<SubExpressionToken>>(node->prefix)) {
Visitor::Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node->prefix));
} else if (std::holds_alternative<std::unique_ptr<TypeExpression>>(node->prefix)) {
Visit(std::get<std::unique_ptr<TypeExpression>>(node->prefix).get());
} else {
// error
}
out_ << ").";
Visit(&node->name);
out_ << "] (";
for (auto& argument : node->arguments) {
Visitor::Visit(argument);
@ -463,7 +482,7 @@ void PrintVisitor::Visit(ReturnExpression* node) {
void PrintVisitor::Visit(TypeConstructor* node) {
out_ << "[TypeConstructor ";
Visit(node->type.get());
Visit(node->constructor.get());
out_ << "]\n(";
bool is_first = true;
@ -473,8 +492,9 @@ void PrintVisitor::Visit(TypeConstructor* node) {
is_first = false;
}
out_ << '(';
Visit(&std::get<0>(parameter));
switch (std::get<1>(parameter)) {
if (parameter.first.has_value()) {
Visit(&parameter.first.value().first);
switch (parameter.first.value().second) {
case TypeConstructor::Assign:
out_ << " = ";
break;
@ -482,7 +502,8 @@ void PrintVisitor::Visit(TypeConstructor* node) {
out_ << " <- ";
break;
}
Visitor::Visit(std::get<2>(parameter));
}
Visitor::Visit(parameter.second);
}
out_ << ")\n";
}
@ -504,26 +525,22 @@ void PrintVisitor::Visit(LambdaFunction* node) {
}
void PrintVisitor::Visit(ArrayExpression* node) {
out_ << "[ArrayExpression] ([";
out_ << "[ArrayExpression] ( ,";
for (auto& element : node->elements) {
Visitor::Visit(element);
out_ << ';';
out_ << " ,";
}
out_ << "])";
out_ << ")";
}
// Name
void PrintVisitor::Visit(NameExpression* node) {
out_ << "[NameExpression] (";
for (auto& variable_namespace : node->namespaces) {
Visitor::Visit(variable_namespace);
out_ << '.';
}
for (size_t i = 0; i < node->expressions.size(); ++i) {
Visit(&node->expressions[i]);
if (i + 1 < node->expressions.size()) {
out_ << '.';
for (size_t i = 0; i < node->names.size(); ++i) {
Visit(&node->names[i]);
if (i + 1 < node->names.size()) {
out_ << "::";
}
}
out_ << ')';
@ -611,16 +628,6 @@ void PrintVisitor::Visit(VariantType* node) {
out_ << ')';
}
void PrintVisitor::Visit(ParametrizedType* node) {
out_ << "[ParametrizedType] (";
Visit(node->type_expression.get());
for (auto& parameter : node->parameters) {
out_ << ' ';
Visitor::Visit(parameter);
}
out_ << ')';
}
void PrintVisitor::Visit(TypeExpression* node) {
out_ << "[TypeExpression ";
@ -629,11 +636,11 @@ void PrintVisitor::Visit(TypeExpression* node) {
}
out_ << "] (";
for (auto& type_namespace : node->namespaces) {
Visitor::Visit(type_namespace);
out_ << '.';
for (auto& type : node->path) {
Visitor::Visit(type);
out_ << "::";
}
Visit(&node->type);
Visitor::Visit(node->type);
out_ << ')';
}
@ -656,23 +663,35 @@ void PrintVisitor::Visit(ExtendedScopedAnyType* node) {
// Typeclass
void PrintVisitor::Visit(TypeclassExpression* node) {
out_ << "[TypeclassExpression] (";
for (auto& type : node->path) {
Visitor::Visit(type);
out_ << "::";
}
Visitor::Visit(node->typeclass);
out_ << ')';
}
void PrintVisitor::Visit(ParametrizedTypeclass* node) {
out_ << "[ParametrizedTypeclass] (";
Visit(node->typeclass_expression.get());
Visit(&node->typeclass);
for (auto& parameter : node->parameters) {
out_ << ' ';
Visitor::Visit(parameter);
Visit(parameter.get());
}
out_ << ')';
}
void PrintVisitor::Visit(TypeclassExpression* node) {
out_ << "[TypeclassExpression] (";
for (auto& typeclass_namespace : node->namespaces) {
Visitor::Visit(typeclass_namespace);
out_ << '.';
// Typeclass & Type -----------------
void PrintVisitor::Visit(ParametrizedType* node) {
out_ << "[ParametrizedType] (";
Visit(&node->type);
for (auto& parameter : node->parameters) {
out_ << ' ';
Visit(parameter.get());
}
Visit(&node->typeclass);
out_ << ')';
}

View file

@ -664,9 +664,10 @@ void Visitor::Visit(VariantType* node) {
}
void Visitor::Visit(TypeExpression* node) {
for (auto& type : node->types) {
for (auto& type : node->path) {
Visit(type);
}
Visit(node->type);
}
void Visitor::Visit(ExtendedScopedAnyType* node) {
@ -676,7 +677,7 @@ void Visitor::Visit(ExtendedScopedAnyType* node) {
// Typeclass
void Visitor::Visit(TypeclassExpression* node) {
for (auto& type : node->types) {
for (auto& type : node->path) {
Visit(type);
}
Visit(node->typeclass);