diff --git a/include/global_info.hpp b/include/global_info.hpp index 6632566..6d48585 100644 --- a/include/global_info.hpp +++ b/include/global_info.hpp @@ -23,7 +23,6 @@ public: struct PartitionInfo { std::vector path; - std::string name; interpreter::tokens::PartitionStatement* node = nullptr; }; @@ -75,8 +74,9 @@ public: definition::Constructor&& constructor_info, const interpreter::tokens::BaseNode& base_node); - utils::IdType AddPartition(const std::vector& path, // including name - interpreter::tokens::PartitionStatement* node); + utils::IdType AddPartition(const std::vector& path, + interpreter::tokens::PartitionStatement* node, + const interpreter::tokens::BaseNode& base_node); std::optional FindNamespaceId(const std::optional>& path); diff --git a/include/utils.hpp b/include/utils.hpp index a475682..d0df08c 100644 --- a/include/utils.hpp +++ b/include/utils.hpp @@ -131,7 +131,7 @@ private: const std::vector& path, size_t path_position) { if (path_position == path.size()) { - if (vertex.value.has_value()) { + if (!vertex.value.has_value()) { return std::nullopt; } return &vertex.value.value(); diff --git a/src/find_symbols_visitor.cpp b/src/find_symbols_visitor.cpp index 2b46230..b40b91c 100644 --- a/src/find_symbols_visitor.cpp +++ b/src/find_symbols_visitor.cpp @@ -156,7 +156,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) { } void FindSymbolsVisitor::Visit(PartitionStatement* node) { - node->executable_id_ = namespace_visitor_.AddPartition(node->name.path, node); + node->executable_id_ = namespace_visitor_.AddPartition(node->name.path, node, node->base); } // Definition parts diff --git a/src/global_info.cpp b/src/global_info.cpp index 5d3a461..62a4c60 100644 --- a/src/global_info.cpp +++ b/src/global_info.cpp @@ -281,23 +281,25 @@ utils::IdType GlobalInfo::NamespaceVisitor::AddConstructor(const std::string& co } utils::IdType GlobalInfo::NamespaceVisitor::AddPartition(const std::vector& path, - interpreter::tokens::PartitionStatement* node) { + interpreter::tokens::PartitionStatement* node, + const interpreter::tokens::BaseNode& base_node) { PartitionInfo partition; - partition.path.reserve(current_path_.size() + path.size() - 1); + partition.path.reserve(current_path_.size() + path.size()); partition.path = current_path_; - for (size_t i = 0; i + 1 < path.size(); ++i) { - partition.path.push_back(path[i]); + for (auto& path_name : path) { + partition.path.push_back(path_name); } - partition.name = path.back(); partition.node = node; utils::IdType id = global_info_.partitions_.size(); global_info_.partitions_.push_back(partition); - global_info_.partitions_trie_.Insert(partition.path, id); + if (!global_info_.partitions_trie_.Insert(partition.path, id)) { + error_handling::HandleNamesError("Partition with this name already exists", base_node); + } return id; } diff --git a/src/type_check_visitor.cpp b/src/type_check_visitor.cpp index b7e5ca5..a184dd9 100644 --- a/src/type_check_visitor.cpp +++ b/src/type_check_visitor.cpp @@ -843,6 +843,7 @@ void TypeCheckVisitor::Visit(TypeConstructor* node) { utils::IdType constructor_id = node->constructor->constructor_id_.value(); + // TODO: take type_id_ ?? info::definition::Constructor constructor_info = global_info_.GetConstructorInfo(constructor_id); utils::IdType type_id = constructor_info.type_id; @@ -912,6 +913,10 @@ void TypeCheckVisitor::Visit(TypeConstructor* node) { current_type_ = TypeInContext(current_type_, context); + current_type_ = context_manager_.AddValue( + info::type::DefinedType(type_id, current_type_, type_info.modifier, context_manager_.GetValueManager()), + utils::ValueType::Tmp); + node->base.type_ = current_type_; } diff --git a/tests/test_code.lang b/tests/test_code.lang index a8392db..d7e702f 100644 --- a/tests/test_code.lang +++ b/tests/test_code.lang @@ -123,13 +123,15 @@ typeclass Enum = // decl ( -- ) : Int -> Int -> Int_0 -def ( -- ) : begin end = { - var current = begin - return (while current < end do { - ; current += 1 - return current - 1 - }) -} +// def ( -- ) : begin end = { +// var current = begin +// return (while current < end do { +// ; current += 1 +// return current - 1 +// }) +// } + +decl print : String -> Unit decl func : String -> Int def func : s = {