diff --git a/src/Binder/Binder.cpp b/src/Binder/Binder.cpp index a9f1f0b..6669cbf 100644 --- a/src/Binder/Binder.cpp +++ b/src/Binder/Binder.cpp @@ -748,6 +748,9 @@ namespace Porygon::Binder { this->_scriptData->Diagnostics->LogInfo(Diagnostics::DiagnosticCode::UnvalidatedCast, exp->GetStartPosition(), exp->GetLength()); } + else if (castResult == CastResult::Unchanged){ + return toCastParameter; + } return new BoundCastExpression(toCastParameter, destinationType); } diff --git a/src/Evaluator/EvalValues/EvalValue.hpp b/src/Evaluator/EvalValues/EvalValue.hpp index f6bc804..63fab40 100644 --- a/src/Evaluator/EvalValues/EvalValue.hpp +++ b/src/Evaluator/EvalValues/EvalValue.hpp @@ -100,7 +100,13 @@ namespace Porygon::Evaluation { [[nodiscard]] virtual EvalValue* Cast(shared_ptr castType) const{ - throw new EvaluationException("Casting to invalid type."); + if (castType->GetClass() == this->GetTypeClass()){ + return this->Clone(); + } + std::stringstream s; + s << "Casting to invalid type. From: " << this->ToString(); + s << ". To: " << castType->ToString(); + throw EvaluationException(s.str()); } virtual std::string ToString() const{ diff --git a/src/ScriptTypes/CastResult.hpp b/src/ScriptTypes/CastResult.hpp index 0ef85a3..61fa05c 100644 --- a/src/ScriptTypes/CastResult.hpp +++ b/src/ScriptTypes/CastResult.hpp @@ -7,6 +7,7 @@ namespace Porygon{ InvalidCast, UncheckedCast, DataLoss, + Unchanged, }; } diff --git a/src/ScriptTypes/FunctionScriptType.hpp b/src/ScriptTypes/FunctionScriptType.hpp index e640ef5..8414835 100644 --- a/src/ScriptTypes/FunctionScriptType.hpp +++ b/src/ScriptTypes/FunctionScriptType.hpp @@ -55,6 +55,10 @@ namespace Porygon { diagnostics->LogWarning(Diagnostics::DiagnosticCode::DataLossOnCast, parameter->GetStartPosition(), parameter->GetLength()); } + else if(castResult == CastResult::Unchanged){ + parameters->at(i) = parameter; + continue; + } parameters->at(i) = new Binder::BoundCastExpression(parameter, _parameterTypes[i]); } } diff --git a/src/ScriptTypes/ScriptType.hpp b/src/ScriptTypes/ScriptType.hpp index 3d20a43..f626ad7 100644 --- a/src/ScriptTypes/ScriptType.hpp +++ b/src/ScriptTypes/ScriptType.hpp @@ -115,7 +115,7 @@ namespace Porygon{ [[nodiscard]] CastResult CastableTo(const shared_ptr& castType, bool explicitCast) const final{ if (this->operator==(castType)) - return CastResult ::ValidCast; + return CastResult ::Unchanged; if (!explicitCast){ if (castType->GetClass() != TypeClass::Number ) return CastResult::InvalidCast;