function declaration & definition statements for typeclasses and inherited classes in typecheck_visitor

This commit is contained in:
ProgramSnail 2023-05-16 15:12:30 +03:00
parent aab455ff1d
commit 090f638e45
3 changed files with 102 additions and 21 deletions

View file

@ -340,7 +340,7 @@ public:
}
// cache ??
std::vector<utils::IdType> GetAnnotatedTypeTypeclasses(interpreter::tokens::AnnotatedType* node) {
std::unordered_set<utils::IdType> GetAnnotatedTypeTypeclassesSet(interpreter::tokens::AnnotatedType* node) {
std::unordered_set<utils::IdType> typeclasses;
for (auto& typeclass : node->typeclasses) {
@ -353,13 +353,18 @@ public:
typeclasses.insert(graph_id);
}
return typeclasses;
}
std::vector<utils::IdType> collected_typeclasses;
collected_typeclasses.reserve(typeclasses.size());
for (auto& typeclass : typeclasses) {
collected_typeclasses.push_back(typeclass);
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 collected_typeclasses;
return typeclasses_vector;
}
std::optional<utils::IdType> AddTypeclassToGraph(utils::IdType typeclass);

View file

@ -1,6 +1,7 @@
#pragma once
#include <algorithm>
#include <optional>
#include <string>
#include <unordered_map>
#include <unordered_set>
@ -67,7 +68,7 @@ public:
return typeclasses_.size() - 1;
}
std::optional<utils::IdType> FindMethodTypeclass(const std::string& name) {
std::optional<utils::IdType> FindFunctionTypeclass(const std::string& name) {
auto function_iter = method_to_typeclass_.find(name);
if (function_iter == method_to_typeclass_.end()) {
return std::nullopt;
@ -75,8 +76,27 @@ public:
return function_iter->second;
}
const TypeclassVertex& GetTypeclass(utils::IdType id) { // check, if calculated ??
return typeclasses_.at(id);
bool IsFunctionInTypeclass(const std::string& name, utils::IdType typeclass_id) {
return typeclasses_[typeclass_id].functions.count(name) != 0;
}
std::optional<FunctionInfo*> GetFunctionInfo(const std::string& name,
std::optional<utils::IdType> typeclass_id) {
if (typeclass_id.has_value()) {
return &typeclasses_[typeclass_id.value()].functions[name];
}
auto maybe_function_typeclass_id = FindFunctionTypeclass(name);
if (!maybe_function_typeclass_id.has_value()) {
return std::nullopt;
}
return &typeclasses_[maybe_function_typeclass_id.value()].functions[name];
}
const TypeclassVertex& GetTypeclass(utils::IdType typeclass_id) { // check, if calculated ??
return typeclasses_.at(typeclass_id);
}
// cache ??