From e84efc4a4656e54a4f08b99592d5d98ac5726449 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Tue, 11 May 2021 17:18:16 +0500 Subject: Replace the old match checking algorithm --- .../hir_ty/src/diagnostics/match_check/pat_util.rs | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 crates/hir_ty/src/diagnostics/match_check/pat_util.rs (limited to 'crates/hir_ty/src/diagnostics/match_check/pat_util.rs') diff --git a/crates/hir_ty/src/diagnostics/match_check/pat_util.rs b/crates/hir_ty/src/diagnostics/match_check/pat_util.rs new file mode 100644 index 000000000..eb0b07a52 --- /dev/null +++ b/crates/hir_ty/src/diagnostics/match_check/pat_util.rs @@ -0,0 +1,52 @@ +use std::iter::{Enumerate, ExactSizeIterator}; + +pub(crate) struct EnumerateAndAdjust { + enumerate: Enumerate, + gap_pos: usize, + gap_len: usize, +} + +impl Iterator for EnumerateAndAdjust +where + I: Iterator, +{ + type Item = (usize, ::Item); + + fn next(&mut self) -> Option<(usize, ::Item)> { + self.enumerate + .next() + .map(|(i, elem)| (if i < self.gap_pos { i } else { i + self.gap_len }, elem)) + } + + fn size_hint(&self) -> (usize, Option) { + self.enumerate.size_hint() + } +} + +pub(crate) trait EnumerateAndAdjustIterator { + fn enumerate_and_adjust( + self, + expected_len: usize, + gap_pos: Option, + ) -> EnumerateAndAdjust + where + Self: Sized; +} + +impl EnumerateAndAdjustIterator for T { + fn enumerate_and_adjust( + self, + expected_len: usize, + gap_pos: Option, + ) -> EnumerateAndAdjust + where + Self: Sized, + { + let actual_len = self.len(); + EnumerateAndAdjust { + enumerate: self.enumerate(), + gap_pos: gap_pos.unwrap_or(expected_len), + gap_len: expected_len - actual_len, + } + } +} -- cgit v1.2.3 From f571b62a13aff662c9d1c17206342479f8529633 Mon Sep 17 00:00:00 2001 From: Dawer <7803845+iDawer@users.noreply.github.com> Date: Sun, 16 May 2021 18:11:45 +0500 Subject: minor: doc comment pat_util --- crates/hir_ty/src/diagnostics/match_check/pat_util.rs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'crates/hir_ty/src/diagnostics/match_check/pat_util.rs') diff --git a/crates/hir_ty/src/diagnostics/match_check/pat_util.rs b/crates/hir_ty/src/diagnostics/match_check/pat_util.rs index eb0b07a52..b89b4f2bf 100644 --- a/crates/hir_ty/src/diagnostics/match_check/pat_util.rs +++ b/crates/hir_ty/src/diagnostics/match_check/pat_util.rs @@ -1,3 +1,7 @@ +//! Pattern untilities. +//! +//! Originates from `rustc_hir::pat_util` + use std::iter::{Enumerate, ExactSizeIterator}; pub(crate) struct EnumerateAndAdjust { -- cgit v1.2.3