part of typeclass_graph

This commit is contained in:
ProgramSnail 2023-05-14 13:05:46 +03:00
parent 4f54bb4bd7
commit 9aeba7b0de
8 changed files with 154 additions and 68 deletions

View file

@ -10,7 +10,7 @@ namespace interpreter {
// Namespaces, partitions -----------------
void FindSymbolsVisitor::Visit(Namespace* node) {
namespace_visitor_.AddEnterNamespace(node->type, node->modifier, node->base);
namespace_visitor_.AddEnterNamespace(node->type, node->modifier, node, node->base);
Visitor::Visit(&node->scope);
@ -44,6 +44,11 @@ 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());
@ -97,7 +102,7 @@ void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
}
any_type_info.value = &node->value;
any_type_info.parent_namespace = namespace_visitor_.GetCurrentNamespace();
any_type_info.parent_namespace = namespace_visitor_.GetCurrentNamespaceId();
any_type_info.modifier = node->modifier;
std::string type = any_type_info.type.type;
@ -136,12 +141,13 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
}
for (size_t i = 0; i < node->requirements.size(); ++i) {
namespace_visitor_.AddEnterNamespace(type_name, node->requirements[i].first, node->base);
namespace_visitor_.AddEnterNamespace(type_name, node->requirements[i].first, std::nullopt, node->base);
Visit(node->requirements[i].second.get());
namespace_visitor_.ExitNamespace();
}
info.node = node;
info.parent_namespace = namespace_visitor_.GetCurrentNamespaceId();
node->typeclass_id_ = namespace_visitor_.AddTypeclass(type_name, std::move(info), node->base);
}