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

@ -3,6 +3,7 @@
#include <string>
#include <functional>
#include <unordered_map>
#include <unordered_set>
// for clangd
#include "definitions.hpp"
@ -12,7 +13,6 @@
namespace info {
// TODO: better test / executable partitions support (tree, etc.)
// TODO: add classes / structs and functions module interface
class GlobalInfo {
friend class NamespaceVisitor;
@ -300,6 +300,29 @@ public:
return &typeclass_graph_;
}
// cache ??
std::vector<utils::IdType> GetAnnotatedTypeTypeclasses(interpreter::tokens::AnnotatedType* node) {
std::unordered_set<utils::IdType> typeclasses;
for (auto& typeclass : node->typeclasses) {
utils::IdType graph_id = typeclasses_[typeclass->typeclass_id_].graph_id_;
std::vector<utils::IdType> dependencies = typeclass_graph_.GetTypeclassDependencies(graph_id);
for (auto& dependency : dependencies) {
typeclasses.insert(dependency);
}
typeclasses.insert(graph_id);
}
std::vector<utils::IdType> collected_typeclasses;
collected_typeclasses.reserve(typeclasses.size());
for (auto& typeclass : typeclasses) {
collected_typeclasses.push_back(typeclass);
}
return collected_typeclasses;
}
std::optional<utils::IdType> AddTypeclassToGraph(utils::IdType typeclass);
private: