From 9b3d2812ba97fe3e7ea81c03837ad73421578332 Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Thu, 18 May 2023 22:27:55 +0300 Subject: [PATCH] fixes --- src/execute_visitor.cpp | 23 ++++++++++++++++++----- src/type_check_visitor.cpp | 3 ++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/execute_visitor.cpp b/src/execute_visitor.cpp index 89645c2..11f5eb0 100644 --- a/src/execute_visitor.cpp +++ b/src/execute_visitor.cpp @@ -385,10 +385,13 @@ void ExecuteVisitor::Visit(AccessExpression* node) { // Other Expressions -// TODO: typeclass methods +// TODO +// TODO: typeclass functions +// TODO: builtin functions // TODO: binary operator expression void ExecuteVisitor::Visit(FunctionCallExpression* node) { context_manager_.EnterContext(); + if (node->prefix.has_value()) { if (std::holds_alternative>(node->prefix.value())) { Visitor::Visit(*std::get>(node->prefix.value())); @@ -406,9 +409,20 @@ void ExecuteVisitor::Visit(FunctionCallExpression* node) { } else { // error } + } else { + if (node->is_method_of_first_argument_) { + Visitor::Visit(node->arguments[0]); + context_manager_.DefineVariable(utils::ClassInternalVarName, current_value_); + } + // TODO + } + + if (!node->function_id_.has_value()) { + // TODO: typeclass function + error_handling::HandleInternalError("Typeclass functions not implemented yet", + "ExecuteVisitor.FunctionCallExpression"); } - // TODO: typeclass functions auto function_declaration = global_info_.GetFunctionInfo(node->function_id_.value()).declaration.value(); // checked in type_check_visitor for (size_t i = 0; i < node->parameters.size(); ++i) { @@ -417,11 +431,10 @@ void ExecuteVisitor::Visit(FunctionCallExpression* node) { context_manager_.DefineLocalType(function_declaration.parameters[i].type, node->parameters[i]->type_id_.value()); // TODO: check } - // TODO: typeclass functions auto maybe_function_definition = global_info_.GetFunctionInfo(node->function_id_.value()).definition; if (maybe_function_definition.has_value()) { - for (size_t i = 0; i < node->arguments.size(); ++i) { + for (size_t i = (node->is_method_of_first_argument_ ? 1 : 0); i < node->arguments.size(); ++i) { Visitor::Visit(node->arguments[i]); // TODO: custom argument value types, references, etc. current_value_ = context_manager_.ToModifiedValue(current_value_, utils::ValueType::Const); @@ -430,8 +443,8 @@ void ExecuteVisitor::Visit(FunctionCallExpression* node) { Visit(maybe_function_definition.value().node); } else { - // TODO: builtin functions, etc. (imports?) error_handling::HandleRuntimeError("Function definition not found", node->base); + // TODO: functions, defined in typeclasses ?? } context_manager_.ExitContext(); diff --git a/src/type_check_visitor.cpp b/src/type_check_visitor.cpp index 3cdee93..b0145ba 100644 --- a/src/type_check_visitor.cpp +++ b/src/type_check_visitor.cpp @@ -855,7 +855,8 @@ void TypeCheckVisitor::Visit(TypeConstructor* node) { global_info_.GetTypeInfo(type_id); if (!maybe_type_info.has_value()) { // TODO - error_handling::HandleInternalError("Implemented only for AnyType", "TypeCheckVisitor.TypeConstructor"); + error_handling::HandleInternalError("Implemented only for AnyType", + "TypeCheckVisitor.TypeConstructor"); } info::definition::AnyType& type_info = *maybe_type_info.value();