Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/mismatched_array_pat_len.rs')
| -rw-r--r-- | crates/ide-diagnostics/src/handlers/mismatched_array_pat_len.rs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/handlers/mismatched_array_pat_len.rs b/crates/ide-diagnostics/src/handlers/mismatched_array_pat_len.rs new file mode 100644 index 0000000000..8cae405c92 --- /dev/null +++ b/crates/ide-diagnostics/src/handlers/mismatched_array_pat_len.rs @@ -0,0 +1,114 @@ +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 +} +"#, + ); + } +} |