use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
// Diagnostic: mismatched-array-pat-len
//
// This diagnostic is triggered when an array pattern's element count does not
// match the array's declared length.
pub(crate) fn mismatched_array_pat_len(
ctx: &DiagnosticsContext<'_, '_>,
d: &hir::MismatchedArrayPatLen,
) -> Diagnostic {
let (code, message) = if d.has_rest {
(
"E0528",
format!(
"pattern requires at least {} element{} but array has {}",
d.found,
if d.found == 1 { "" } else { "s" },
d.expected,
),
)
} else {
(
"E0527",
format!(
"pattern requires {} element{} but array has {}",
d.found,
if d.found == 1 { "" } else { "s" },
d.expected,
),
)
};
Diagnostic::new_with_syntax_node_ptr(
ctx,
DiagnosticCode::RustcHardError(code),
message,
d.pat.map(Into::into),
)
.stable()
}
#[cfg(test)]
mod tests {
use crate::tests::check_diagnostics;
#[test]
fn array_pattern_too_few_elements() {
check_diagnostics(
r#"
fn f(arr: [i32; 3]) {
let [_a, _b] = arr;
//^^^^^^^^ error: pattern requires 2 elements but array has 3
}
"#,
);
}
#[test]
fn array_pattern_too_many_elements() {
check_diagnostics(
r#"
fn f(arr: [i32; 2]) {
let [_a, _b, _c] = arr;
//^^^^^^^^^^^^ error: pattern requires 3 elements but array has 2
}
"#,
);
}
#[test]
fn array_pattern_with_rest_too_short() {
check_diagnostics(
r#"
fn f(arr: [i32; 2]) {
let [_a, _b, _c, ..] = arr;
//^^^^^^^^^^^^^^^^ error: pattern requires at least 3 elements but array has 2
}
"#,
);
}
#[test]
fn array_pattern_with_rest_ok() {
check_diagnostics(
r#"
fn f(arr: [i32; 5]) {
let [_a, _b, ..] = arr;
}
"#,
);
}
#[test]
fn array_pattern_exact_length_ok() {
check_diagnostics(
r#"
fn f(arr: [i32; 3]) {
let [_a, _b, _c] = arr;
}
"#,
);
}
#[test]
fn array_pattern_singular_element_uses_singular() {
check_diagnostics(
r#"
fn f(arr: [i32; 3]) {
let [_a] = arr;
//^^^^ error: pattern requires 1 element but array has 3
}
"#,
);
}
}