abstract types typecheck, fixes

This commit is contained in:
ProgramSnail 2023-05-16 12:43:55 +03:00
parent 9aeba7b0de
commit c433448952
9 changed files with 143 additions and 94 deletions

View file

@ -1,6 +1,7 @@
#include <iostream>
// for clangd
#include "../include/error_handling.hpp"
#include "../include/find_symbols_visitor.hpp"
namespace interpreter {
@ -44,11 +45,6 @@ void FindSymbolsVisitor::Visit(AliasDefinitionStatement* node) {
}
void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
info::definition::Namespace* current_namespace = namespace_visitor_.GetCurrentNamespace();
if (current_namespace->node.has_value() && current_namespace->node.value()->link_typeclass_id_.has_value()) {
error_handling::HandleTypecheckError("Can't declare typeclass methods not as requirements", node->base);
}
info::definition::FunctionDeclaration info;
info.parameters.resize(node->parameters.size());
@ -131,7 +127,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
auto definition = node->definition.get();
std::string& type_name = definition->type.get()->type;
std::string& typeclass_name = definition->type.get()->type;
info.parameters.resize(definition->parameters.size());
for (size_t i = 0; i < definition->parameters.size(); ++i) {
@ -141,7 +137,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
}
for (size_t i = 0; i < node->requirements.size(); ++i) {
namespace_visitor_.AddEnterNamespace(type_name, node->requirements[i].first, std::nullopt, node->base);
namespace_visitor_.AddEnterNamespace(typeclass_name, node->requirements[i].first, std::nullopt, node->base);
Visit(node->requirements[i].second.get());
namespace_visitor_.ExitNamespace();
}
@ -149,7 +145,7 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
info.node = node;
info.parent_namespace = namespace_visitor_.GetCurrentNamespaceId();
node->typeclass_id_ = namespace_visitor_.AddTypeclass(type_name, std::move(info), node->base);
node->typeclass_id_ = namespace_visitor_.AddTypeclass(typeclass_name, std::move(info), node->base);
}
void FindSymbolsVisitor::Visit(PartitionStatement* node) {
@ -168,6 +164,8 @@ void FindSymbolsVisitor::Visit(AnyAnnotatedType* node) {
info.typeclass_nodes[i] = node->typeclasses[i].get();
}
info.node = node;
current_info_ = std::move(info);
}