Better handling of casting
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -36,23 +36,26 @@ namespace Porygon {
|
||||
}
|
||||
|
||||
bool IsValid(const shared_ptr<Diagnostics::DiagnosticsHolder>& diagnostics,
|
||||
const vector<Binder::BoundExpression *>& parameters){
|
||||
if (parameters.size() != _parameterTypes.size()){
|
||||
vector<Binder::BoundExpression *>* parameters){
|
||||
if (parameters->size() != _parameterTypes.size()){
|
||||
return false;
|
||||
}
|
||||
for (size_t i = 0; i < parameters.size(); i++){
|
||||
for (size_t i = 0; i < parameters->size(); i++){
|
||||
if (_parameterTypes[i]->GetClass() == TypeClass::All)
|
||||
continue;
|
||||
auto parameter = parameters[i];
|
||||
auto parameter = parameters->at(i);
|
||||
const auto& parameterType = parameter->GetType();
|
||||
if (parameterType->operator!=(_parameterTypes[i].get())){
|
||||
auto castResult = parameterType->CastableTo(_parameterTypes[i], false);
|
||||
if (castResult == CastResult::Failure){
|
||||
return false;
|
||||
}
|
||||
else if (castResult == CastResult::DataLoss){
|
||||
diagnostics->LogWarning(Diagnostics::DiagnosticCode::DataLossOnImplicitCast, parameter->GetStartPosition(),
|
||||
parameter->GetLength());
|
||||
else{
|
||||
if (castResult == CastResult::DataLoss){
|
||||
diagnostics->LogWarning(Diagnostics::DiagnosticCode::DataLossOnImplicitCast, parameter->GetStartPosition(),
|
||||
parameter->GetLength());
|
||||
}
|
||||
parameters->at(i) = new Binder::BoundImplicitCastExpression(parameter, _parameterTypes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,8 +106,9 @@ namespace Porygon {
|
||||
return this;
|
||||
}
|
||||
|
||||
[[nodiscard]]
|
||||
GenericFunctionOption* GetFunctionOption(const shared_ptr<Diagnostics::DiagnosticsHolder>& diagnostics,
|
||||
const vector<Binder::BoundExpression *>& parameters) const{
|
||||
vector<Binder::BoundExpression *>* parameters) const{
|
||||
for (auto o: *_options){
|
||||
if (o->IsValid(diagnostics, parameters)){
|
||||
return o;
|
||||
|
||||
Reference in New Issue
Block a user