MalachScript/src/Binder/BoundType.hpp

78 lines
3.1 KiB
C++

#ifndef MALACHSCRIPT_BOUNDTYPE_HPP
#define MALACHSCRIPT_BOUNDTYPE_HPP
#include <functional>
#include <unordered_map>
#include <vector>
#include "../CoreData/ClassAttr.hpp"
#include "../CoreData/Identifier.hpp"
#include "../Diagnostics/Logger.hpp"
#include "BoundVariable.hpp"
namespace MalachScript::Binder {
class BoundType {
public:
using log_func = const std::function<void(Diagnostics::DiagnosticLevel level, Diagnostics::DiagnosticType,
const ScriptTextSpan&, const std::vector<std::string>&)>;
BoundType(Identifier identifier, ClassAttr classAttr, std::optional<ScriptTextSpan> span)
: _identifier(identifier), _classAttr(classAttr), _span(span) {}
BoundType(Identifier identifier, ClassAttr classAttr, size_t size)
: _initialised(true), _identifier(identifier), _classAttr(classAttr), _size(size), _inherits(0) {}
void Finalise(size_t size) noexcept {
_initialised = true;
_size = size;
}
[[nodiscard]] inline const Identifier& GetIdentifier() const noexcept { return _identifier; }
[[nodiscard]] inline size_t GetSize() const noexcept { return _size; }
[[nodiscard]] inline bool IsInitialised() const noexcept { return _initialised; }
[[nodiscard]] inline ClassAttr GetAttributes() const noexcept { return _classAttr; }
inline void AddInheritType(const BoundType* type) { _inherits.push_back(type); }
inline void AddField(const Identifier& identifier, BoundVariable* var) {
_fields.push_back(var);
_fieldsLookup[identifier] = var;
}
inline void RegisterType(const Identifier& identifier, const BoundType* type) {
_types[identifier] = const_cast<BoundType*>(type);
}
[[nodiscard]] inline const std::unordered_map<Identifier, BoundType*>& GetTypes() const noexcept {
return _types;
}
[[nodiscard]] inline const std::unordered_map<Identifier, BoundVariable*>& GetFieldsLookup() const noexcept {
return _fieldsLookup;
}
[[nodiscard]] inline const std::vector<const BoundType*>& GetInherits() const noexcept { return _inherits; }
[[nodiscard]] inline std::optional<BoundType*> ResolveType(const Identifier& identifier) const noexcept {
auto find = _types.find(identifier);
if (find == _types.end()) {
return {};
}
return find->second;
}
[[nodiscard]] inline const std::optional<ScriptTextSpan>& GetSpan() const noexcept { return _span; }
private:
bool _initialised = false;
Identifier _identifier;
ClassAttr _classAttr;
std::optional<ScriptTextSpan> _span;
size_t _size = 0;
std::vector<const BoundType*> _inherits;
std::vector<BoundVariable*> _fields;
std::unordered_map<Identifier, BoundVariable*> _fieldsLookup;
// TODO: functions
std::unordered_map<Identifier, BoundType*> _types;
};
}
#endif // MALACHSCRIPT_BOUNDTYPE_HPP