From 62be1c78f384458ef20aaf1aa591921acb8b1078 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 22 Sep 2019 15:19:58 +0200 Subject: [PATCH] Allow nil to be set to nullable types --- src/Evaluator/EvalValues/NilEvalValue.hpp | 5 +++++ src/ScriptTypes/ScriptType.cpp | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Evaluator/EvalValues/NilEvalValue.hpp b/src/Evaluator/EvalValues/NilEvalValue.hpp index 233ab0f..f56a11d 100644 --- a/src/Evaluator/EvalValues/NilEvalValue.hpp +++ b/src/Evaluator/EvalValues/NilEvalValue.hpp @@ -27,6 +27,11 @@ namespace Porygon::Evaluation{ inline std::size_t GetHashCode() const final{ return 0; } + + public: + EvalValue *Cast(shared_ptr castType) const override { + return this->Clone(); + } }; } diff --git a/src/ScriptTypes/ScriptType.cpp b/src/ScriptTypes/ScriptType.cpp index a9b39ad..f83819c 100644 --- a/src/ScriptTypes/ScriptType.cpp +++ b/src/ScriptTypes/ScriptType.cpp @@ -50,9 +50,16 @@ namespace Porygon{ } CastResult ScriptType::CastableTo(const shared_ptr &castType, bool explicitCast) const { + if (this->operator==(castType)) + return CastResult ::Unchanged; if (_class == TypeClass::Any){ return CastResult ::UncheckedCast; } + if (_class == TypeClass::Nil){ + auto otherClass = castType->GetClass(); + if (otherClass != TypeClass::Number && otherClass != TypeClass::Bool) + return CastResult ::ValidCast; + } if (explicitCast) return CastResult::InvalidCast; return CastResult::InvalidCast; @@ -60,7 +67,6 @@ namespace Porygon{ std::string ScriptType::ToString(TypeClass c) { switch (c){ - case TypeClass::Error: return "error"; case TypeClass::Nil: return "nil"; case TypeClass::Number: return "number";