type_check_visitor first iteration, value, execution_visitor started

This commit is contained in:
ProgramSnail 2023-05-07 19:52:35 +03:00
parent 173d50672a
commit 890bd90eba
22 changed files with 481 additions and 452 deletions

View file

@ -225,7 +225,7 @@ public:
Type() = default;
template<typename T>
explicit Type(T&& type) : type_(std::forward(type)) {}
explicit Type(const T& type) : type_(type) {}
std::optional<utils::IdType> InContext(const std::unordered_map<std::string, utils::IdType>& context);
bool Same(const Type& type) const;
@ -236,6 +236,17 @@ public:
std::string GetTypeName() const;
std::variant<AbstractType,
DefinedType,
InternalType,
TupleType,
VariantType,
ReferenceToType,
FunctionType,
ArrayType,
OptionalType>& GetType() {
return type_;
}
private:
std::variant<AbstractType,
DefinedType,
@ -251,22 +262,42 @@ private:
class TypeManager {
public:
template<typename T>
utils::IdType AddType(T&& type, utils::ValueType value_type);
utils::IdType AddType(const T& type, utils::ValueType value_type) {
types_.push_back(std::pair<Type, utils::ValueType> {type, value_type});
return types_.size() - 1;
}
utils::IdType AddAnyType(Type&& type, utils::ValueType value_type);
utils::IdType AddAnyType(Type&& type, utils::ValueType value_type) {
types_.push_back(std::pair<Type, utils::ValueType> {std::move(type), value_type});
return types_.size() - 1;
}
template<typename T>
std::optional<T*> GetType(utils::IdType type_id);
std::optional<T*> GetType(utils::IdType type_id) {
if (!std::holds_alternative<T>(types_.at(type_id).first.GetType())) {
return std::nullopt;
}
return &std::get<T>(types_.at(type_id).first.GetType());
}
Type* GetAnyType(utils::IdType type_id);
Type* GetAnyType(utils::IdType type_id) {
return &types_.at(type_id).first;
}
utils::ValueType GetValueType(utils::IdType type_id);
utils::ValueType GetValueType(utils::IdType type_id) {
return types_.at(type_id).second;
}
bool AddTypeRequirement(utils::IdType type, utils::IdType requrement);
bool EqualTypes(utils::IdType first_type, utils::IdType second_type);
bool EqualTypes(utils::IdType first_type, utils::IdType second_type) {
return GetAnyType(first_type)->Same(*GetAnyType(second_type));
}
bool AddTypeRequirement(utils::IdType type, utils::IdType requrement) {
return *GetAnyType(requrement) < *GetAnyType(type);
}
private:
std::vector<std::pair<info::type::Type, utils::ValueType>> types_;
std::vector<std::pair<Type, utils::ValueType>> types_;
};
} // namespace info::type