use crate::records::overload_resolution::OverloadResolution;
use crate::records::selected_overload::SelectedOverload;
use luaur_common::macros::luau_assert::LUAU_ASSERT;
impl OverloadResolution {
pub fn get_unambiguous_overload(&self) -> SelectedOverload {
if self.ok.len() == 1 && self.potential_overloads.len() == 0 {
return SelectedOverload {
overload: Some(self.ok[0]),
assumed_constraints: vec![],
should_retry: false,
};
}
if self.ok.len() == 0 && self.potential_overloads.len() == 1 {
return SelectedOverload {
overload: Some(self.potential_overloads[0].0),
assumed_constraints: self.potential_overloads[0].1.clone(),
should_retry: false,
};
}
if self.ok.len() > 1 {
return SelectedOverload {
overload: None,
assumed_constraints: vec![],
should_retry: false,
};
}
if self.potential_overloads.len() + self.ok.len() > 1 {
if self.ok.is_empty() {
return SelectedOverload {
overload: Some(self.potential_overloads[0].0),
assumed_constraints: self.potential_overloads[0].1.clone(),
should_retry: true,
};
} else {
LUAU_ASSERT!(self.ok.len() == 1);
return SelectedOverload {
overload: Some(self.ok[0]),
assumed_constraints: vec![],
should_retry: true,
};
}
}
LUAU_ASSERT!(self.potential_overloads.len() + self.ok.len() == 0);
if self.incompatible_overloads.len() == 1 {
return SelectedOverload {
overload: Some(self.incompatible_overloads[0].0),
assumed_constraints: vec![],
should_retry: false,
};
}
SelectedOverload {
overload: None,
assumed_constraints: vec![],
should_retry: false,
}
}
}