#pragma once #include // for clangd #include "contexts.hpp" #include "global_info.hpp" #include "interpreter_tree.hpp" #include "types.hpp" #include "utils.hpp" #include "values.hpp" #include "visitor.hpp" #include "error_handling.hpp" namespace interpreter { class ExecuteVisitor : public Visitor { public: explicit ExecuteVisitor(info::GlobalInfo& global_info, info::ContextManager& type_context_manager, info::ContextManager& context_manager, interpreter::tokens::PartitionStatement* execution_root) : namespace_visitor_(global_info.CreateVisitor()), type_context_manager_(type_context_manager), context_manager_(context_manager) {} void VisitSourceFile(SourceFile* source_file) override { error_handling::HandleInternalError("VisitSourceFile unavailible", "ExecuteVisitor.VisitSourceFile"); }; void ExecutePartition(interpreter::tokens::PartitionStatement* partition) { Visit(partition); } private: // Sources ----------------- void Visit(SourceFile* node) override; // Namespaces, partitions ----------------- void Visit(NamespaceSources* node) override; void Visit(Namespace* node) override; // Definitions ----------------- void Visit(ImportStatement* node) override; void Visit(AliasDefinitionStatement* node) override; void Visit(VariableDefinitionStatement* node) override; void Visit(FunctionDeclaration* node) override; void Visit(FunctionDefinitionStatement* node) override; void Visit(TypeDefinitionStatement* node) override; void Visit(AbstractTypeDefinitionStatement* node) override; void Visit(TypeclassDefinitionStatement* node) override; void Visit(PartitionStatement* node) override; // Definition parts // // void Visit(FunctionDefinition* node) override; // // void Visit(TypeDefinition* node) override; // // void Visit(AnyAnnotatedType* node) override; // Flow control ----------------- void Visit(TypeConstructorPatternParameter* node) override; void Visit(TypeConstructorPattern* node) override; void Visit(MatchCase* node) override; void Visit(Match* node) override; void Visit(Condition* node) override; void Visit(DoWhileLoop* node) override; void Visit(WhileLoop* node) override; void Visit(ForLoop* node) override; void Visit(LoopLoop* node) override; // Statements, expressions, blocks, etc. ----------------- void Visit(Block* node) override; void Visit(ScopedStatement* node) override; // Operators void Visit(BinaryOperatorExpression* node) override; void Visit(ReferenceExpression* node) override; void Visit(AccessExpression* node) override; // Simple Expressions void Visit(FunctionCallExpression* node) override; void Visit(TupleExpression* node) override; void Visit(VariantExpression* node) override; void Visit(ReturnExpression* node) override; void Visit(TypeConstructorParameter* node) override; void Visit(TypeConstructor* node) override; void Visit(LambdaFunction* node) override; void Visit(ArrayExpression* node) override; void Visit(LoopControlExpression& node) override; // enum // Name // // void Visit(PartitionName* node) override; void Visit(NameExpression* node) override; void Visit(TupleName* node) override; void Visit(VariantName* node) override; void Visit(AnnotatedName* node) override; // Type, typeclass, etc. ----------------- // Type void Visit(FunctionType* node) override; void Visit(TupleType* node) override; void Visit(VariantType* node) override; void Visit(TypeExpression* node) override; void Visit(ExtendedScopedAnyType* node) override; // Typeclass void Visit(ParametrizedTypeclass* node) override; // Typeclass & Type void Visit(ParametrizedType* node) override; // Identifiers, constants, etc. ----------------- // // void Visit(std::string* node) override; // std::string void Visit(FloatNumberLiteral* node) override; void Visit(NumberLiteral* node) override; void Visit(StringLiteral* node) override; void Visit(CharLiteral* node) override; void Visit(UnitLiteral* node) override; void Visit(BoolLiteral* node) override; bool HandleCondition(Expression& condition, const BaseNode& base_node); void CollectTypeContext(const ParametrizedType& type); void CheckPattern(Pattern& node, const BaseNode& base_node); template T* ExtractValue(utils::IdType value, const BaseNode& base_node) { std::optional maybe_value_info = context_manager_.GetValue(value); if (!maybe_value_info.has_value()) { error_handling::HandleRuntimeError("Value has value class that is different from exprected one", base_node); } return maybe_value_info.value(); } template T* ExtractInternalValue(utils::IdType value, const BaseNode& base_node) { info::value::InternalValue* value_info = ExtractValue(value, base_node); std::optional maybe_internal_value_info = value_info->GetValue(); if (!maybe_internal_value_info.has_value()) { error_handling::HandleRuntimeError("Value has internal value class that is different from exprected one", base_node); } return maybe_internal_value_info.value(); } private: info::GlobalInfo::NamespaceVisitor namespace_visitor_; info::ContextManager& type_context_manager_; info::ContextManager& context_manager_; utils::IdType current_value_; std::optional active_loop_control_expression_; std::optional returned_value_; // TODO: work outside block ?? std::optional is_const_definition_; bool case_matched_; }; } // namespace interpreter