mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2026-01-25 13:07:13 +00:00
type_check_visitor first iteration, value, execution_visitor started
This commit is contained in:
parent
173d50672a
commit
890bd90eba
22 changed files with 481 additions and 452 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue