use yog_ids::script_problem;
use super::Checker;
use super::model::Type;
use crate::ast::{Arg, Pass};
use crate::words::{self, Word};
impl Checker<'_, '_, '_> {
pub(super) fn check_passing(&mut self, takes: &[Option<Pass>], args: &[&Arg], given: &[Type]) {
for ((a, ¶m), t) in args.iter().zip(takes).zip(given) {
if agrees(a.pass, param) {
if param.is_none() && a.pass.is_none() {
self.handed(&a.value, t);
}
continue;
}
let wanted = param.map_or_else(
|| "by value (or `move`)".to_string(),
|p| format!("with `{}`", word(p).text),
);
self.report.error(
script_problem::PASS,
a.value.span,
format!("this parameter is passed {wanted}"),
);
}
}
}
fn agrees(given: Option<Pass>, param: Option<Pass>) -> bool {
matches!(
(given, param),
(None | Some(Pass::In), Some(Pass::In))
| (Some(Pass::Ref), Some(Pass::Ref))
| (Some(Pass::Out), Some(Pass::Out))
| (Some(Pass::Move), Some(Pass::Move))
| (None | Some(Pass::Move), None)
)
}
fn word(p: Pass) -> &'static Word {
match p {
Pass::In => &words::r#in::WORD,
Pass::Ref => &words::r#ref::WORD,
Pass::Out => &words::out::WORD,
Pass::Move => &words::r#move::WORD,
}
}