build_visitor fixed, going to test it

This commit is contained in:
ProgramSnail 2023-04-25 21:21:36 +03:00
parent 5bf0c1bf48
commit c34523bd4f
23 changed files with 45468 additions and 45273 deletions

View file

@ -262,6 +262,16 @@ void PrintVisitor::Visit(AnyAnnotatedType* node) {
// Flow control -----------------
void PrintVisitor::Visit(TypeConstructorPatternParameter* node) {
out_ << "[TypeConstructorPatternParameter ";
if (node->name.has_value()) {
Visit(&node->name.value());
out_ << " = ";
}
Visitor::Visit(node->value);
out_ << "]";
}
void PrintVisitor::Visit(TypeConstructorPattern* node) {
out_ << "[TypeConstructorPattern ";
Visit(&node->constructor);
@ -274,11 +284,7 @@ void PrintVisitor::Visit(TypeConstructorPattern* node) {
is_first = false;
}
out_ << '(';
if (parameter.first.has_value()) {
Visit(&parameter.first.value());
out_ << " = ";
}
Visitor::Visit(parameter.second);
Visit(&parameter);
}
out_ << ")\n";
}
@ -434,18 +440,20 @@ void PrintVisitor::Visit(AccessExpression* node) {
// Other Expressions
void PrintVisitor::Visit(FunctionCallExpression* node) {
out_ << "[FunctionCall (";
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
if (node->prefix.has_value()) {
out_ << '(';
if (std::holds_alternative<std::unique_ptr<SubExpressionToken>>(node->prefix.value())) {
Visitor::Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node->prefix.value()));
} else if (std::holds_alternative<std::unique_ptr<TypeExpression>>(node->prefix.value())) {
Visit(std::get<std::unique_ptr<TypeExpression>>(node->prefix.value()).get());
} else {
// error
}
out_ << ").";
}
out_ << ").";
Visit(&node->name);
out_ << "] (";
@ -480,6 +488,23 @@ void PrintVisitor::Visit(ReturnExpression* node) {
out_ << ")\n";
}
void PrintVisitor::Visit(TypeConstructorParameter* node) {
out_ << "[TypeConstructorParameter ";
if (node->name.has_value()) {
Visit(&node->name.value());
switch (node->asignment_modifier.value()) {
case TypeConstructorParameter::Assign:
out_ << " = ";
break;
case TypeConstructorParameter::Move:
out_ << " <- ";
break;
}
}
Visitor::Visit(node->value);
out_ << "]";
}
void PrintVisitor::Visit(TypeConstructor* node) {
out_ << "[TypeConstructor ";
Visit(node->constructor.get());
@ -492,18 +517,7 @@ void PrintVisitor::Visit(TypeConstructor* node) {
is_first = false;
}
out_ << '(';
if (parameter.first.has_value()) {
Visit(&parameter.first.value().first);
switch (parameter.first.value().second) {
case TypeConstructor::Assign:
out_ << " = ";
break;
case TypeConstructor::Move:
out_ << " <- ";
break;
}
}
Visitor::Visit(parameter.second);
Visit(&parameter);
}
out_ << ")\n";
}