This commit is contained in:
@@ -124,6 +124,8 @@ namespace Porygon::Binder {
|
||||
return ScriptType::BoolType;
|
||||
case HashedString::ConstHash("string"):
|
||||
return StringScriptType::Dynamic;
|
||||
case HashedString::ConstHash("table"):
|
||||
return make_shared<TableScriptType>();
|
||||
default:
|
||||
if (!UserData::UserDataStorage::HasUserDataType(hash)) {
|
||||
return nullptr;
|
||||
|
||||
@@ -10,8 +10,8 @@ vector<Diagnostic> DiagnosticsHolder::GetDiagnostics() {
|
||||
void DiagnosticsHolder::Log(DiagnosticSeverity severity, DiagnosticCode code, unsigned int start, unsigned int length,
|
||||
const std::vector<string>& arguments) {
|
||||
_diagnostics.emplace_back(severity, code, start, length, arguments);
|
||||
if (severity >= DiagnosticSeverity::Error){
|
||||
_hasErrors = true;
|
||||
if (severity == DiagnosticSeverity::Error){
|
||||
_hasErrors = static_cast<byte>(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ void DiagnosticsHolder::LogInfo(DiagnosticCode code, unsigned int start, unsigne
|
||||
}
|
||||
|
||||
bool DiagnosticsHolder::HasErrors() {
|
||||
return _hasErrors;
|
||||
return _hasErrors == static_cast<byte>(1);
|
||||
}
|
||||
|
||||
int DiagnosticsHolder::DiagnosticsCount() {
|
||||
|
||||
@@ -13,13 +13,13 @@ using namespace std;
|
||||
|
||||
namespace Porygon::Diagnostics {
|
||||
class DiagnosticsHolder {
|
||||
bool _hasErrors;
|
||||
byte _hasErrors;
|
||||
vector<Diagnostic> _diagnostics;
|
||||
vector<size_t> _lineStarts;
|
||||
vector<size_t> _lineLength;
|
||||
|
||||
public:
|
||||
explicit DiagnosticsHolder(const u16string& str) :_hasErrors(false), _lineStarts(vector<size_t>{0}) {
|
||||
explicit DiagnosticsHolder(const u16string& str) : _hasErrors(static_cast<byte>(0)), _lineStarts(vector<size_t>{0}) {
|
||||
size_t lineLength = 0;
|
||||
for (size_t i = 0; i < str.size(); i++){
|
||||
lineLength++;
|
||||
|
||||
@@ -77,6 +77,9 @@ namespace Porygon{
|
||||
}
|
||||
|
||||
[[nodiscard]] virtual CastResult CastableTo(const shared_ptr<const ScriptType>& castType, bool explicitCast) const{
|
||||
if (_class == TypeClass::All){
|
||||
return CastResult ::UncheckedCast;
|
||||
}
|
||||
if (explicitCast)
|
||||
return CastResult::InvalidCast;
|
||||
return CastResult::InvalidCast;
|
||||
|
||||
@@ -15,9 +15,18 @@ namespace Porygon{
|
||||
_localVariableCount(localVariableCount)
|
||||
{}
|
||||
|
||||
explicit TableScriptType()
|
||||
: ScriptType(TypeClass::Table),
|
||||
_values(nullptr),
|
||||
_localVariableCount(0)
|
||||
{}
|
||||
|
||||
|
||||
~TableScriptType() final{
|
||||
for (auto i : *_values){
|
||||
delete i.second;
|
||||
if (_values != nullptr){
|
||||
for (const auto& i : *_values){
|
||||
delete i.second;
|
||||
}
|
||||
}
|
||||
delete _values;
|
||||
}
|
||||
@@ -33,10 +42,10 @@ namespace Porygon{
|
||||
|
||||
shared_ptr<const ScriptType> GetIndexedType(const ScriptType* indexer) const final{
|
||||
auto stringKey = dynamic_cast<const StringScriptType*>(indexer);
|
||||
if (stringKey->IsKnownAtBind()){
|
||||
if (stringKey != nullptr && stringKey->IsKnownAtBind() && _values != nullptr){
|
||||
return _values-> at(Utilities::HashedString::CreateLookup(stringKey->GetHashValue()))->GetType();
|
||||
}
|
||||
throw "TODO: indexing with dynamic keys";
|
||||
return make_shared<ScriptType>(TypeClass::All);
|
||||
}
|
||||
|
||||
[[nodiscard]] inline shared_ptr<const ScriptType> GetIndexedType(uint32_t hash) const final{
|
||||
@@ -46,6 +55,16 @@ namespace Porygon{
|
||||
[[nodiscard]] inline const map<Utilities::HashedString, BoundVariable*>* GetValues() const{
|
||||
return _values;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
bool CanBeIterated() const final {
|
||||
return true;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
shared_ptr<const ScriptType> GetIteratorKeyType() const final {
|
||||
return make_shared<ScriptType>(TypeClass::All);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user