// for clangd #include "../include/execute_visitor.hpp" // TODO namespace interpreter { // Sources ----------------- void ExecuteVisitor::Visit(SourceFile* node) { for (auto& statement : node->statements) { Visitor::Visit(statement); } } // Namespaces, partitions ----------------- void ExecuteVisitor::Visit(NamespaceSources* node) { for (auto& statement : node->statements) { Visitor::Visit(statement); } } void ExecuteVisitor::Visit(Namespace* node) { Visit(&node->type); Visit(&node->scope); } // Definitions ----------------- void ExecuteVisitor::Visit(ImportStatement* node) { for (auto& symbol : node->symbols) { Visit(&symbol); } } void ExecuteVisitor::Visit(AliasDefinitionStatement* node) { Visit(&node->type); Visit(node->value.get()); } void ExecuteVisitor::Visit(VariableDefinitionStatement* node) { Visitor::Visit(node->name); Visitor::Visit(node->value); } void ExecuteVisitor::Visit(FunctionDeclaration* node) { Visit(&node->name); for (auto& parameter : node->parameters) { Visit(parameter.get()); } Visit(node->type.get()); } void ExecuteVisitor::Visit(FunctionDefinitionStatement* node) { Visit(node->definition.get()); Visitor::Visit(node->value); } void ExecuteVisitor::Visit(TypeDefinitionStatement* node) { Visit(node->definition.get()); Visitor::Visit(node->value); } void ExecuteVisitor::Visit(AbstractTypeDefinitionStatement* node) { Visit(node->type.get()); } void ExecuteVisitor::Visit(TypeclassDefinitionStatement* node) { Visit(node->definition.get()); for (auto& requirement : node->requirements) { Visit(requirement.get()); } } void ExecuteVisitor::Visit(ExecutableStatement* node) { Visit(&node->name); Visitor::Visit(node->value); } void ExecuteVisitor::Visit(TestStatement* node) { Visit(&node->name); Visitor::Visit(node->value); } // Definition parts void ExecuteVisitor::Visit(FunctionDefinition* node) { Visit(&node->name); for (auto& argument : node->arguments) { Visit(&argument); } } void ExecuteVisitor::Visit(TypeDefinition* node) { Visit(node->type.get()); for (auto& parameter : node->parameters) { Visit(parameter.get()); } } void ExecuteVisitor::Visit(AnyAnnotatedType* node) { Visit(&node->type); for (auto& typeclass : node->typeclasses) { Visit(typeclass.get()); } } // Flow control ----------------- void ExecuteVisitor::Visit(TypeConstructorPatternParameter* node) { if (node->name.has_value()) { Visit(&node->name.value()); } Visitor::Visit(node->value); } void ExecuteVisitor::Visit(TypeConstructorPattern* node) { Visit(node->constructor.get()); for (auto& parameter : node->parameters) { Visit(¶meter); } } void ExecuteVisitor::Visit(MatchCase* node) { Visitor::Visit(node->value); if (node->condition.has_value()) { Visitor::Visit(node->condition.value()); } if (node->statement.has_value()) { Visitor::Visit(node->statement.value()); } } void ExecuteVisitor::Visit(Match* node) { Visitor::Visit(node->value); for (auto& match_case : node->matches) { Visit(&match_case); } } void ExecuteVisitor::Visit(Condition* node) { for (size_t i = 0; i < node->conditions.size(); ++i) { Visitor::Visit(node->conditions[i]); Visitor::Visit(node->statements[i]); } if (node->statements.size() > node->conditions.size()) { Visitor::Visit(node->statements[node->conditions.size()]); } } void ExecuteVisitor::Visit(DoWhileLoop* node) { Visitor::Visit(node->statement); Visitor::Visit(node->condition); } void ExecuteVisitor::Visit(WhileLoop* node) { Visitor::Visit(node->condition); Visitor::Visit(node->statement); } void ExecuteVisitor::Visit(ForLoop* node) { Visitor::Visit(node->variable); Visitor::Visit(node->interval); Visitor::Visit(node->statement); } void ExecuteVisitor::Visit(LoopLoop* node) { Visitor::Visit(node->statement); } // Statements, expressions, blocks, etc. ----------------- void ExecuteVisitor::Visit(Block* node) { for (auto& statement : node->statements) { Visitor::Visit(statement); } } void ExecuteVisitor::Visit(ScopedStatement* node) { Visitor::Visit(node->statement); } void ExecuteVisitor::Visit(LoopControlExpression& node) {} // enum // Operators void ExecuteVisitor::Visit(BinaryOperatorExpression* node) { Visitor::Visit(node->left_expression); Visitor::Visit(&node->operator_name); Visitor::Visit(node->right_expression); } void ExecuteVisitor::Visit(UnaryOperatorExpression* node) { Visit(&node->operator_name); Visitor::Visit(node->expression); } void ExecuteVisitor::Visit(ReferenceExpression* node) { Visit(node->expression.get()); } void ExecuteVisitor::Visit(AccessExpression* node) { Visit(node->name.get()); Visitor::Visit(node->id); } // Other Expressions void ExecuteVisitor::Visit(FunctionCallExpression* node) { if (node->prefix.has_value()) { if (std::holds_alternative>(node->prefix.value())) { Visitor::Visit(*std::get>(node->prefix.value())); } else if (std::holds_alternative>(node->prefix.value())) { Visit(std::get>(node->prefix.value()).get()); } else { // error } } Visit(&node->name); for (auto& parameter : node->parameters) { Visit(parameter.get()); } for (auto& argument : node->arguments) { Visitor::Visit(argument); } } void ExecuteVisitor::Visit(TupleExpression* node) { for (auto& expression : node->expressions) { Visitor::Visit(expression); } } void ExecuteVisitor::Visit(VariantExpression* node) { for (auto& expression : node->expressions) { Visitor::Visit(expression); } } void ExecuteVisitor::Visit(ReturnExpression* node) { Visitor::Visit(node->expression); } void ExecuteVisitor::Visit(TypeConstructorParameter* node) { if (node->name.has_value()) { Visit(&node->name.value()); } Visitor::Visit(node->value); } void ExecuteVisitor::Visit(TypeConstructor* node) { Visit(node->constructor.get()); for (auto& parameter : node->parameters) { Visit(¶meter); } } void ExecuteVisitor::Visit(LambdaFunction* node) { for (auto& parameter : node->parameters) { Visit(parameter.get()); } for (auto& argument : node->arguments) { Visit(&argument); } Visitor::Visit(node->expression); } void ExecuteVisitor::Visit(ArrayExpression* node) { for (auto& element : node->elements) { Visitor::Visit(element); } } // Name void ExecuteVisitor::Visit(PartitionName* node) { for (auto& path_namespace : node->path) { Visit(&path_namespace); } Visit(&node->name); } void ExecuteVisitor::Visit(NameExpression* node) { for (auto& name : node->names) { Visit(&name); } } void ExecuteVisitor::Visit(TupleName* node) { for (auto& name : node->names) { Visitor::Visit(name); } } void ExecuteVisitor::Visit(VariantName* node) { for (auto& name : node->names) { Visitor::Visit(name); } } void ExecuteVisitor::Visit(AnnotatedName* node) { Visit(&node->name); if (node->type.has_value()) { Visitor::Visit(node->type.value()); } } // Type, typeclass, etc. ----------------- // Type void ExecuteVisitor::Visit(FunctionType* node) { for (auto& type : node->types) { Visitor::Visit(type); } } void ExecuteVisitor::Visit(TupleType* node) { if (node->type.has_value()) { Visit(&node->type.value()); } for (auto& entity : node->entities) { if (entity.first.has_value()) { Visit(&entity.first.value()); } Visit(entity.second.get()); } } void ExecuteVisitor::Visit(VariantType* node) { if (node->type.has_value()) { Visit(&node->type.value()); } for (auto& constructor : node->constructors) { if (std::holds_alternative(constructor)) { Visit(&std::get(constructor)); } else if (std::holds_alternative>(constructor)) { Visit(std::get>(constructor).get()); } else { // error } } } void ExecuteVisitor::Visit(TypeExpression* node) { for (auto& type : node->path) { Visit(&type); } Visit(&node->type); } void ExecuteVisitor::Visit(ExtendedScopedAnyType* node) { Visitor::Visit(node->type); } // Typeclass void ExecuteVisitor::Visit(ParametrizedTypeclass* node) { Visit(&node->typeclass); for (auto& parameter : node->parameters) { Visit(parameter.get()); } } // Typeclass & Type ----------------- void ExecuteVisitor::Visit(ParametrizedType* node) { Visit(&node->type); for (auto& parameter : node->parameters) { Visit(parameter.get()); } } // Identifiers, constants, etc. ----------------- void ExecuteVisitor::Visit(ExtendedName* node) {} void ExecuteVisitor::Visit(std::string* node) {} // std::string void ExecuteVisitor::Visit(FloatNumberLiteral* node) {} void ExecuteVisitor::Visit(NumberLiteral* node) {} void ExecuteVisitor::Visit(StringLiteral* node) {} void ExecuteVisitor::Visit(CharLiteral* node) {} void ExecuteVisitor::Visit(UnitLiteral* node) {} } // namespace interpreter