some fixes, going to fix function_call_expression typeclass argument types search bug

This commit is contained in:
ProgramSnail 2023-05-22 01:25:12 +03:00
parent f2192b5331
commit 0290b5604a
9 changed files with 307 additions and 111 deletions

View file

@ -172,7 +172,14 @@ private:
}
}
//
void AddGraphIdLocalTypes(utils::IdType graph_id, utils::IdType type) {
std::unordered_set<utils::IdType> requirement_graph_ids = typeclass_graph_.GetDependenciesSet(graph_id);
requirement_graph_ids.insert(graph_id);
for (auto& requirement_graph_id : requirement_graph_ids) {
context_manager_.DefineLocalType(typeclass_graph_.GetVertex(requirement_graph_id).name, type);
}
}
private:
info::GlobalInfo::NamespaceVisitor namespace_visitor_;

View file

@ -50,14 +50,12 @@ public:
}
bool HasTypeclass(utils::IdType graph_id) {
error_handling::DebugPrint(name_);
error_handling::DebugPrint(requirement_graph_ids_.size());
for (auto& requirement_graph_id : requirement_graph_ids_) {
error_handling::DebugPrint(requirement_graph_id);
}
return requirement_graph_ids_.count(graph_id) != 0;
}
std::string ToString() {
return "Abstract";
}
private:
utils::AbstractTypeModifier modifier_;
std::string name_;
@ -93,6 +91,9 @@ public:
return class_modifier_;
}
std::string ToString() {
return "Defined";
}
private:
utils::IdType type_id_; // in defined types
utils::IdType type_; // in types manager, created using context types (if specific type)
@ -140,6 +141,32 @@ inline std::optional<InternalType> ToInternalType(const std::string& type) {
return std::nullopt;
}
inline std::string ToString(InternalType type) {
std::string result;
switch (type) {
case InternalType::Float:
result = "Float";
break;
case InternalType::Int:
result = "Int";
break;
case InternalType::String:
result = "String";
break;
case InternalType::Char:
result = "Char";
break;
case InternalType::Bool:
result = "Bool";
break;
case InternalType::Unit:
result = "Unit";
break;
}
return result;
}
class TupleType {
public:
TupleType() = default;
@ -160,6 +187,7 @@ public:
return fields_;
}
std::string ToString();
private:
std::optional<std::string> name_;
std::vector<std::pair<std::optional<std::string>, utils::IdType>> fields_;
@ -190,6 +218,7 @@ public:
current_constructor_ = constructor;
}
std::string ToString();
private:
std::optional<std::string> name_;
std::vector<TupleType> constructors_;
@ -211,6 +240,7 @@ public:
std::optional<utils::IdType> GetFieldType(const std::string& name,
const std::unordered_set<utils::IdType>& type_namespaces) const;
std::string ToString();
private:
utils::IdType type_;
TypeManager* type_manager_ = nullptr;
@ -232,6 +262,7 @@ public:
std::optional<utils::IdType> GetFieldType(const std::string& name,
const std::unordered_set<utils::IdType>& type_namespaces) const;
std::string ToString();
private:
std::vector<utils::ReferenceModifier> references_;
utils::IdType type_;
@ -256,6 +287,7 @@ public:
std::optional<utils::IdType> GetFieldType(const std::string& name,
const std::unordered_set<utils::IdType>& type_namespaces) const;
std::string ToString();
private:
std::vector<utils::IdType> argument_types_;
utils::IdType return_type_;
@ -282,6 +314,7 @@ public:
return elements_type_;
}
std::string ToString();
private:
size_t size_; // = 0 for dynamic
utils::IdType elements_type_;
@ -316,6 +349,8 @@ public:
OptionalType>& GetType() {
return type_;
}
std::string ToString();
private:
std::variant<AbstractType,
DefinedType,

View file

@ -31,62 +31,11 @@ enum class PartitionModifier { Exec = 0, Test = 1 };
enum class ValueType { Const = 0, Var = 1, Tmp = 2 };
inline ValueType IsConstModifierToValueType(IsConstModifier modifier) {
switch (modifier) {
case IsConstModifier::Const:
return ValueType::Const;
case IsConstModifier::Var:
return ValueType::Var;
}
ValueType IsConstModifierToValueType(IsConstModifier modifier);
exit(1); // unreachable
}
ValueType ClassInternalsModifierToValueType(ClassInternalsModifier modifier);
inline ValueType ClassInternalsModifierToValueType(ClassInternalsModifier modifier) {
switch (modifier) {
case ClassInternalsModifier::Const:
return ValueType::Const;
case ClassInternalsModifier::Var:
return ValueType::Var;
case ClassInternalsModifier::Static:
throw std::bad_cast(); // ??
}
exit(1); // unreachable
}
inline bool IsBuiltinFunction(const std::string& name) { // optimize ??
std::unordered_set<std::string> builtin_functions;
builtin_functions.insert("=");
builtin_functions.insert("<-");
builtin_functions.insert("==");
builtin_functions.insert("!=");
builtin_functions.insert("<");
builtin_functions.insert(">");
builtin_functions.insert("<=");
builtin_functions.insert(">=");
builtin_functions.insert("+=");
builtin_functions.insert("-=");
builtin_functions.insert("*=");
builtin_functions.insert("div");
builtin_functions.insert("mod");
builtin_functions.insert("/=");
// builtin_functions.insert("+");
// builtin_functions.insert("-");
// builtin_functions.insert("*");
// builtin_functions.insert("/");
builtin_functions.insert("&&");
builtin_functions.insert("||");
builtin_functions.insert("size");
builtin_functions.insert("random");
builtin_functions.insert("print");
builtin_functions.insert("scan");
builtin_functions.insert("zero");
builtin_functions.insert("one");
return builtin_functions.count(name) != 0;
}
bool IsBuiltinFunction(const std::string& name);
template<typename T>
class Storage {
@ -265,34 +214,12 @@ private:
std::vector<size_t> ranks_;
};
// move to .cpp ??
inline void BackVisitDfs(size_t id,
std::vector<size_t>& verticles,
std::vector<size_t>& marks,
const std::vector<std::vector<size_t>>& edges,
size_t mark) {
if (marks[id] != 0) {
return;
}
void BackVisitDfs(size_t id,
std::vector<size_t>& verticles,
std::vector<size_t>& marks,
const std::vector<std::vector<size_t>>& edges,
size_t mark);
marks[id] = mark;
verticles.push_back(id);
for (size_t i = 0; i < edges[id].size(); ++i) {
BackVisitDfs(id, verticles, marks, edges, mark);
}
}
// move to .cpp ??
inline std::vector<size_t> BackTopSort(const std::vector<std::vector<size_t>>& edges_) {
std::vector<size_t> sorted_verticles;
std::vector<size_t> marks(edges_.size(), 0);
for (size_t i = 0; i < marks.size(); ++i) {
BackVisitDfs(i, sorted_verticles, marks, edges_, 1);
}
return sorted_verticles;
}
std::vector<size_t> BackTopSort(const std::vector<std::vector<size_t>>& edges_);
} // namespace utils