From fe652bc1c2108478fc14564d962ce675afe6df17 Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Thu, 4 Jan 2024 19:29:29 +0300 Subject: [PATCH] fixes, name refactoring --- CMakeLists.txt | 4 ++-- include/nodes/doc_nodes.hpp | 2 +- include/nodes/statement_nodes.hpp | 6 ++--- include/nodes/type_nodes.hpp | 2 +- include/sources_manager.hpp | 2 +- src/basic_type_check.cpp | 2 +- src/expression_type_check.cpp | 37 ++++++++++++++++++++++++++++- src/nodes/statement_nodes.cpp | 16 ++++++------- src/printers/doc_printers.cpp | 2 +- src/printers/statement_printers.cpp | 10 ++++---- src/printers/type_printers.cpp | 6 ++--- 11 files changed, 62 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 990cc9c..fca37d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ set( ) set( - PRINTERS + TYPECHECKERS src/basic_type_check.cpp src/expression_type_check.cpp src/type_check_utils.cpp @@ -59,7 +59,7 @@ add_executable(lang src/main.cpp ${NODES} ${BUILDERS} ${PRINTERS} - # ${TYPECHECK} + # ${TYPECHECKERS} include/tree_sitter_wrapper.hpp deps/tree-sitter-lang/src/tree_sitter/parser.h diff --git a/include/nodes/doc_nodes.hpp b/include/nodes/doc_nodes.hpp index ef6a128..49c2d97 100644 --- a/include/nodes/doc_nodes.hpp +++ b/include/nodes/doc_nodes.hpp @@ -73,7 +73,7 @@ public: // - size_t get_annotations_info_size() const { return annotations_info_.size(); } + size_t annotations_info_size() const { return annotations_info_.size(); } std::string *get_annotation(size_t id) { return &annotations_info_[id].first; diff --git a/include/nodes/statement_nodes.hpp b/include/nodes/statement_nodes.hpp index ebb9a07..ba3ed8f 100644 --- a/include/nodes/statement_nodes.hpp +++ b/include/nodes/statement_nodes.hpp @@ -261,7 +261,7 @@ public: // - size_t get_constraints_size() const { return constraints_.size(); } + size_t constraints_size() const { return constraints_.size(); } Constraint *get_constraint(size_t id) { return &constraints_.at(id); } @@ -289,7 +289,7 @@ public: // - size_t get_arguments_size() const { return arguments_.size(); } + size_t arguments_size() const { return arguments_.size(); } Argument *get_argument(size_t id) { return &arguments_.at(id); } @@ -363,7 +363,7 @@ public: // - size_t get_arguments_size() const { return arguments_.size(); } + size_t arguments_size() const { return arguments_.size(); } Identifier *get_argument(size_t id) { return &arguments_.at(id); } diff --git a/include/nodes/type_nodes.hpp b/include/nodes/type_nodes.hpp index 9d4cb0b..c61cc0b 100644 --- a/include/nodes/type_nodes.hpp +++ b/include/nodes/type_nodes.hpp @@ -70,7 +70,7 @@ public: // - size_t get_parametrs_size() const { return parameters_.size(); } + size_t parameters_size() const { return parameters_.size(); } Type *get_parameter(size_t id) { return parameters_.at(id).get(); } diff --git a/include/sources_manager.hpp b/include/sources_manager.hpp index d83fd4e..26d078b 100644 --- a/include/sources_manager.hpp +++ b/include/sources_manager.hpp @@ -82,7 +82,7 @@ public: // - size_t get_statements_size() const { return statements_.size(); } + size_t statements_size() const { return statements_.size(); } nodes::Statement *get_statement(size_t id) { return &statements_.at(id); } diff --git a/src/basic_type_check.cpp b/src/basic_type_check.cpp index 8ef990a..5bd0190 100644 --- a/src/basic_type_check.cpp +++ b/src/basic_type_check.cpp @@ -53,7 +53,7 @@ nodes::TypeCheckResult type_check_literal(const nodes::Literal &literal, SourcesManager &sources_manager, nodes::MaybeTypeProxy expected_type) { auto const type = get_literal_type(literal, sources_manager); - if (expected_type.has_value() && type != expected_type.value() { + if (expected_type.has_value() && type != expected_type.value()) { return nodes::TypeCheckResult::construct_invalid_result(); // nodes::TypeCheckResult::fail_with(type, expected_type, literal); // TODO: create error ?? } diff --git a/src/expression_type_check.cpp b/src/expression_type_check.cpp index e223b0e..225edbd 100644 --- a/src/expression_type_check.cpp +++ b/src/expression_type_check.cpp @@ -443,9 +443,44 @@ type_check_constructor(const nodes::Constructor &expression, } const nodes::TypeDefinition *type_definition = maybe_type_definition.value(); - // TODO: extract types from definition + if (!type_definition->get_type().has_value()) { + sources_manager.get_error_log()->add_error( + error_handling::ErrorLog::ErrorMessage( + expression, + "Type defenition for constructor type not found (declaration only)", + error_handling::ErrorType::TYPE_CHECK)); + return nodes::TypeCheckResult::construct_invalid_result(); + } + + // TODO: chack that is not typeclass ?? + + // TODO: type arguments substitution (deduce argument type values ??) + for (size_t i = 0; i < type_definition->arguments_size(); ++i) { + // TODO: ... + } + + nodes::TypeProxy type = type_definition->get_type().value(); + + // TODO: work with different parametric types: tuple, variant, ... + + if (type.get()->parameters_size() != expression.arguments_size()) { + sources_manager.get_error_log()->add_error( + error_handling::ErrorLog::ErrorMessage( + expression, + "Constructor arguments count is " + + std::string{expression.arguments_size() < + type.get()->parameters_size() + ? "less" + : "more"} + + " then type fields count", + error_handling::ErrorType::TYPE_CHECK)); + return nodes::TypeCheckResult::construct_invalid_result(); + } + + // for tuple for (size_t i = 0; i < expression.arguments_size(); ++i) { const auto annotation = expression.get_argument_annotation(i); + auto argument_type = type_check_expression( *expression.get_argument_value(i), sources_manager, state, /* TODO: type from definition by annotation */); diff --git a/src/nodes/statement_nodes.cpp b/src/nodes/statement_nodes.cpp index b92b1bb..3a13ad9 100644 --- a/src/nodes/statement_nodes.cpp +++ b/src/nodes/statement_nodes.cpp @@ -56,8 +56,8 @@ FunctionDefinition::combine(FunctionDefinition &&other_function_definition) { other_function_definition.docs_.get_description().has_value()) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } - if (docs_.get_annotations_info_size() > 0 && - other_function_definition.docs_.get_annotations_info_size() > 0) { + if (docs_.annotations_info_size() > 0 && + other_function_definition.docs_.annotations_info_size() > 0) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } @@ -137,8 +137,8 @@ FunctionDefinition::combine(FunctionDefinition &&other_function_definition) { // combine docs // all docs should be in one definition if (other_function_definition.docs_.get_description().has_value() || - other_function_definition.docs_.get_annotations_info_size() > 0) { - if (docs_.get_annotations_info_size() > 0 || + other_function_definition.docs_.annotations_info_size() > 0) { + if (docs_.annotations_info_size() > 0 || docs_.get_description().has_value()) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } @@ -221,8 +221,8 @@ CombineResult TypeDefinition::combine(TypeDefinition &&other_type_definition) { other_type_definition.docs_.get_description().has_value()) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } - if (docs_.get_annotations_info_size() > 0 && - other_type_definition.docs_.get_annotations_info_size() > 0) { + if (docs_.annotations_info_size() > 0 && + other_type_definition.docs_.annotations_info_size() > 0) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } @@ -234,8 +234,8 @@ CombineResult TypeDefinition::combine(TypeDefinition &&other_type_definition) { // combine docs // all docs should be in one definition if (other_type_definition.docs_.get_description().has_value() || - other_type_definition.docs_.get_annotations_info_size() > 0) { - if (docs_.get_annotations_info_size() > 0 || + other_type_definition.docs_.annotations_info_size() > 0) { + if (docs_.annotations_info_size() > 0 || docs_.get_description().has_value()) { return CombineResult::MORE_THEN_ONE_DOCS_ERROR; } diff --git a/src/printers/doc_printers.cpp b/src/printers/doc_printers.cpp index e2e0906..4f23c9f 100644 --- a/src/printers/doc_printers.cpp +++ b/src/printers/doc_printers.cpp @@ -22,7 +22,7 @@ void print_docs(const nodes::SymbolDocs &docs, Printer &printer) { printer.new_indent_line(); } - for (size_t i = 0; i < docs.get_annotations_info_size(); ++i) { + for (size_t i = 0; i < docs.annotations_info_size(); ++i) { print_annotation(*docs.get_annotation(i), printer); printer.space(); printer.print(*docs.get_annotation_info(i)); diff --git a/src/printers/statement_printers.cpp b/src/printers/statement_printers.cpp index 71000e8..d34852a 100644 --- a/src/printers/statement_printers.cpp +++ b/src/printers/statement_printers.cpp @@ -92,7 +92,7 @@ void print_type_definition(const nodes::TypeDefinition &statement, print_identifier(*statement.get_name(), printer); - for (size_t i = 0; i < statement.get_arguments_size(); ++i) { + for (size_t i = 0; i < statement.arguments_size(); ++i) { printer.space(); print_identifier(*statement.get_argument(i), printer); } @@ -116,7 +116,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement, Printer &printer) { print_docs(*statement.get_docs(), printer); - for (size_t i = 0; i < statement.get_constraints_size(); ++i) { + for (size_t i = 0; i < statement.constraints_size(); ++i) { print_constraint(*statement.get_constraint(i), printer); printer.new_indent_line(); } @@ -140,7 +140,7 @@ void print_function_definition(const nodes::FunctionDefinition &statement, print_modifier(statement.get_return_modifier(), printer); // ! or ? - for (size_t i = 0; i < statement.get_arguments_size(); ++i) { + for (size_t i = 0; i < statement.arguments_size(); ++i) { if (!statement.get_argument(i)->get_name().has_value()) { break; } @@ -171,12 +171,12 @@ void print_function_definition(const nodes::FunctionDefinition &statement, } // all arguments are typed or are untyped in the same time - if (statement.get_arguments_size() > 0 && + if (statement.arguments_size() > 0 && statement.get_argument(0)->get_type().has_value()) { printer.print(" :"); - for (size_t i = 0; i < statement.get_arguments_size(); ++i) { + for (size_t i = 0; i < statement.arguments_size(); ++i) { printer.space(); if (statement.get_argument(i)->get_annotation().has_value()) { print_annotation(*statement.get_argument(i)->get_annotation().value(), diff --git a/src/printers/type_printers.cpp b/src/printers/type_printers.cpp index 4455a92..6e800cd 100644 --- a/src/printers/type_printers.cpp +++ b/src/printers/type_printers.cpp @@ -18,11 +18,11 @@ void print_type(const nodes::Type &type, printers::Printer &printer) { print_identifier(*type.get_name(), printer); - if (type.get_parametrs_size() > 0) { + if (type.parameters_size() > 0) { printer.print("["); - for (size_t i = 0; i < type.get_parametrs_size(); ++i) { + for (size_t i = 0; i < type.parameters_size(); ++i) { print_type(*type.get_parameter(i), printer); - if (i + 1 < type.get_parametrs_size()) { + if (i + 1 < type.parameters_size()) { printer.space(); } }