check, that type satisfy typeclass requirements made in type_check_visitor

This commit is contained in:
ProgramSnail 2023-05-16 16:16:14 +03:00
parent 090f638e45
commit ce0ca2a5cb
4 changed files with 118 additions and 40 deletions

View file

@ -267,10 +267,6 @@ public:
std::optional<utils::IdType> FindNamespaceIn(
utils::IdType current_namespace,
const std::vector<std::string>& path);
std::unordered_map<std::string, utils::IdType>*
ChooseNamespaces(utils::ClassInternalsModifier modifier,
utils::IdType namespace_id);
private:
GlobalInfo& global_info_;
@ -339,33 +335,21 @@ public:
return &typeclass_graph_;
}
// cache ??
std::unordered_set<utils::IdType> GetAnnotatedTypeTypeclassesSet(interpreter::tokens::AnnotatedType* node) {
std::unordered_set<utils::IdType> typeclasses;
std::unordered_set<utils::IdType>
GetAnnotatedTypeTypeclassesSet(interpreter::tokens::AnnotatedType* node);
for (auto& typeclass : node->typeclasses) {
utils::IdType graph_id = typeclasses_[typeclass->typeclass_id_].graph_id_;
std::vector<utils::IdType>
GetAnnotatedTypeTypeclassesVector(interpreter::tokens::AnnotatedType* node);
std::vector<utils::IdType> dependencies = typeclass_graph_.GetTypeclassDependencies(graph_id);
for (auto& dependency : dependencies) {
typeclasses.insert(dependency);
}
std::unordered_map<std::string, utils::ClassInternalsModifier>
GetAnnotatedTypeFunctionsMap(interpreter::tokens::AnnotatedType* node);
typeclasses.insert(graph_id);
}
return typeclasses;
}
std::vector<std::pair<std::string, utils::ClassInternalsModifier>>
GetAnnotatedTypeFunctionsVector(interpreter::tokens::AnnotatedType* node);
std::vector<utils::IdType> GetAnnotatedTypeTypeclassesVector(interpreter::tokens::AnnotatedType* node) {
std::unordered_set<utils::IdType> typeclasses_set = GetAnnotatedTypeTypeclassesSet(node);
std::vector<utils::IdType> typeclasses_vector;
typeclasses_vector.reserve(typeclasses_vector.size());
for (auto& typeclass : typeclasses_set) {
typeclasses_vector.push_back(typeclass);
}
return typeclasses_vector;
}
std::unordered_map<std::string, utils::IdType>* ChooseNamespaces(
utils::ClassInternalsModifier modifier,
definition::Namespace* current_namespace);
std::optional<utils::IdType> AddTypeclassToGraph(utils::IdType typeclass);