adding types to typeclass tree, part 1

This commit is contained in:
ProgramSnail 2023-05-19 11:55:46 +03:00
parent 17328b842c
commit d841e2754b
7 changed files with 260 additions and 167 deletions

View file

@ -49,6 +49,8 @@ void FindSymbolsVisitor::Visit(AliasDefinitionStatement* node) {
info.type = std::move(alias_info);
node->type_id_ = namespace_visitor_.AddType(node->type, std::move(info), node->base);
Visitor::Visit(node->value.get()); // to visit all tree
}
void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
@ -69,6 +71,8 @@ void FindSymbolsVisitor::Visit(FunctionDeclaration* node) {
info.node = node;
node->function_id_ = namespace_visitor_.AddFunctionDeclaration(node->name, std::move(info), node->base);
Visitor::Visit(node->type.get()); // to visit all tree
}
void FindSymbolsVisitor::Visit(FunctionDefinitionStatement* node) {
@ -84,6 +88,9 @@ void FindSymbolsVisitor::Visit(FunctionDefinitionStatement* node) {
info.node = node;
node->function_id_ = namespace_visitor_.AddFunctionDefinition(definition->name, std::move(info), node->base);
Visitor::Visit(definition); // to visit all tree
Visitor::Visit(node->value); // to visit all tree
}
void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
@ -113,6 +120,9 @@ void FindSymbolsVisitor::Visit(TypeDefinitionStatement* node) {
info.type = std::move(any_type_info);
node->type_id_ = namespace_visitor_.AddType(type, std::move(info), node->base);
// definition visited earlier
Visitor::Visit(node->value); // to visit all tree
}
void FindSymbolsVisitor::Visit(AbstractTypeDefinitionStatement* node) {
@ -153,10 +163,14 @@ void FindSymbolsVisitor::Visit(TypeclassDefinitionStatement* node) {
info.parent_namespace = namespace_visitor_.GetCurrentNamespaceId();
node->typeclass_id_ = namespace_visitor_.AddTypeclass(typeclass_name, std::move(info), node->base);
// no need to visit definition->type, because it is typeclass
}
void FindSymbolsVisitor::Visit(PartitionStatement* node) {
node->executable_id_ = namespace_visitor_.AddPartition(node->name.path, node, node->base);
Visitor::Visit(node->value); // to visit all tree
}
// Definition parts
@ -171,8 +185,19 @@ void FindSymbolsVisitor::Visit(AnyAnnotatedType* node) {
info.typeclass_nodes[i] = node->typeclasses[i].get();
}
for (auto& typeclass : node->typeclasses) {
Visitor::Visit(typeclass.get()); // to visit all tree
}
info.node = node;
auto maybe_graph_id = namespace_visitor_.GetGlobalInfo()->AddAnnotatedTypeToGraph(node); // definitions and declarations should be added latter
if (!maybe_graph_id.has_value()) {
error_handling::HandleInternalError("Can't add annotated type to typeclass graph",
"FindSymbolsVisitor.AnyAnnotatedType");
}
current_info_ = std::move(info);
}