// for clangd #include "../include/print_visitor.hpp" namespace interpreter { void PrintVisitor::Visit(Node* node) { out_ << "[Node]\n"; } // Sources ----------------- void PrintVisitor::Visit(SourceFile* node) { out_ << "\n\n"; for (auto& statement : node->statements) { if (std::holds_alternative(statement)) { Visit(&std::get(statement)); } else if (std::holds_alternative(statement)) { Visitor::Visit(std::get(statement)); } else { // error } } out_ << "\n"; } void PrintVisitor::Visit(Sources* node) { out_ << "\n\n"; for (auto& source_statement : node->statements) { Visitor::Visit(source_statement); } out_ << "\n"; } // Namespaces, partittions ----------------- void PrintVisitor::Visit(Partition* node) { out_ << " "; switch (node->type) { case Partition::Test: out_ << "TEST"; break; case Partition::Interface: out_ << "INTERFACE"; break; case Partition::Core: out_ << "CORE"; break; case Partition::Lib: out_ << "LIB"; break; case Partition::Module: out_ << "MODULE"; break; case Partition::Exe: out_ << "EXE"; break; } out_ << " {\n"; Visit(node->scope.get()); out_ << "} \n"; } void PrintVisitor::Visit(Namespace* node) { out_ << " "; if (std::holds_alternative>(node->name)) { Visit(std::get>(node->name).get()); } else if (std::holds_alternative>(node->name)) { Visit(std::get>(node->name).get()); } else { // error } out_ << "{\n"; Visit(node->scope.get()); out_ << "} \n"; } // Definitions ----------------- void PrintVisitor::Visit(ImportStatement* node) { out_ << " \"" << node->module_name << "\" "; if (node->symbols.size() > 0) { out_ << '\n'; } for (auto& symbol : node->symbols) { Visitor::Visit(symbol); out_ << '\n'; } out_ << "\n"; } void PrintVisitor::Visit(UsageDefinition* node) { out_ << " "; Visit(&node->name); out_ << " = "; Visit(node->import_statement.get()); out_ << "\n"; } void PrintVisitor::Visit(AliasDefinition* node) { out_ << " "; Visit(node->type.get()); out_ << " = "; Visit(node->value.get()); out_ << "\n"; } void PrintVisitor::Visit(VariableDefinition* node) { out_ << " " << (node->is_const ? "const" : "var") << ' '; Visit(&node->name); out_ << " = "; Visitor::Visit(node->value); out_ << "\n"; } void PrintVisitor::Visit(FunctionDeclaration* node) { out_ << " "; Visit(&node->name); out_ << "\n"; for (auto& parameter : node->parameters) { Visit(parameter.get()); } out_ << " : \n"; for (auto& argument_type : node->argument_types) { Visitor::Visit(argument_type); } out_ << "\n"; } void PrintVisitor::Visit(FunctionDefinition* node) { out_ << " "; Visit(node->name.get()); out_ << " = "; Visitor::Visit(node->value); out_ << "\n"; } void PrintVisitor::Visit(AliasTypeDefinition* node) { out_ << " "; Visit(node->name.get()); out_ << " = "; Visit(node->value.get()); out_ << "\n"; } void PrintVisitor::Visit(TypeDefinition* node) { out_ << " "; Visit(node->name.get()); out_ << " = "; Visitor::Visit(node->value); out_ << "\n"; } void PrintVisitor::Visit(TypeclassDefinition* node) { out_ << " "; Visit(node->name.get()); if (node->requirements.size() > 0) { out_ << " : \n"; } for (auto& requirement : node->requirements) { out_ << "& "; Visit(requirement.get()); } out_ << "\n"; } // Definition parts void PrintVisitor::Visit(DefinedName* node) { out_ << " "; Visit(&node->name); if (node->parameters.size() > 0) { out_ << "\n"; } for (auto& parameter : node->parameters) { Visit(parameter.get()); } if (node->arguments.size() > 0) { out_ << " : \n"; } for (auto& argument : node->arguments) { Visit(argument.get()); } out_ << "\n"; } void PrintVisitor::Visit(DefinedAnnotatedName* node) { out_ << " "; Visit(&node->name); out_ << " : "; if (std::holds_alternative>(node->type)) { Visit(std::get>(node->type).get()); } else if (std::holds_alternative>(node->type)) { Visit(std::get>(node->type).get()); } else { // no annotation } out_ << " "; } void PrintVisitor::Visit(DefinedType* node) { out_ << " "; Visit(node->type.get()); if (node->parameters.size() > 0) { out_ << "\n"; } for (auto& parameter : node->parameters) { Visit(parameter.get()); } if (node->arguments.size() > 0) { out_ << " : \n"; } for (auto& argument : node->arguments) { Visit(argument.get()); } out_ << "\n"; } void PrintVisitor::Visit(DefinedTypeclass* node) { out_ << " "; Visit(node->typeclass.get()); if (node->parameters.size() > 0) { out_ << "\n"; } for (auto& parameter : node->parameters) { Visit(parameter.get()); } if (node->arguments.size() > 0) { out_ << " : \n"; } for (auto& argument : node->arguments) { Visit(argument.get()); } out_ << "\n"; } void PrintVisitor::Visit(DefinitionParameter* node) { out_ << " " << (node->typeclasses.size() > 0 ? "(" : ""); Visit(&node->type); out_ << ' '; for (auto& typeclass : node->typeclasses) { Visit(typeclass.get()); } out_ << "\n"; } void PrintVisitor::Visit(DefinitionArgument* node) { out_ << " " << (node->types.size() > 0 ? "(" : ""); Visit(&node->name); out_ << ' '; for (auto& type : node->types) { Visit(type.get()); } out_ << "\n"; } // Flow control ----------------- void PrintVisitor::Visit(Match* node) {} void PrintVisitor::Visit(Condition* node) {} void PrintVisitor::Visit(DoWhileLoop* node) {} void PrintVisitor::Visit(WhileLoop* node) {}; void PrintVisitor::Visit(ForLoop* node) {}; void PrintVisitor::Visit(LoopLoop* node) {}; // Statements, expressions, blocks, etc. ----------------- void PrintVisitor::Visit(Block* node) {} void PrintVisitor::Visit(ScopedStatement* node) {} // Operators void PrintVisitor::Visit(BinaryOperatorExpression* node) {} void PrintVisitor::Visit(UnaryOperatorExpression* node) {} // Simple Expressions void PrintVisitor::Visit(FunctionCallExpression* node) {} void PrintVisitor::Visit(TupleExpression* node) {} void PrintVisitor::Visit(VariantExpression* node) {} void PrintVisitor::Visit(ReturnExpression* node) {} // Lambda void PrintVisitor::Visit(LambdaFunction* node) {} // Name void PrintVisitor::Visit(NameSuperExpression* node) {} void PrintVisitor::Visit(NameExpression* node) {} void PrintVisitor::Visit(TupleName* node) {} void PrintVisitor::Visit(VariantName* node) {} void PrintVisitor::Visit(AnnotatedName* node) {} // Type void PrintVisitor::Visit(TypeConstructor* node) {} void PrintVisitor::Visit(TupleType* node) {} void PrintVisitor::Visit(VariantType* node) {} void PrintVisitor::Visit(AnnotatedType* node) {} void PrintVisitor::Visit(ParametrizedType* node) {} void PrintVisitor::Visit(TypeExpression* node) {} // Typeclass void PrintVisitor::Visit(AnnotatedTypeclass* node) {} void PrintVisitor::Visit(ParametrizedTypeclass* node) {} void PrintVisitor::Visit(TypeclassExpression* node) {} // Identifiers, constants, etc. ----------------- void PrintVisitor::Visit(AnyIdentifier* node) { // std::string out_ << ""; } void PrintVisitor::Visit(FloatNumberLiteral* node) { out_ << "value << " />"; } void PrintVisitor::Visit(NumberLiteral* node) { out_ << "value << " />"; } void PrintVisitor::Visit(StringLiteral* node) { out_ << "value << " />"; } void PrintVisitor::Visit(CharLiteral* node) { out_ << "value << " />"; } } // namespace interpreter