Rollup merge of #123242 - Nadrieril:require-contiguous-enum-indices, r=compiler-errors
pattern analysis: Require enum indices to be contiguous We had a cfg-hack to allow rust-analyzer to use non-contiguous indices for its enum variants. Unfortunately this no longer works if r-a uses the in-tree version of the crate. This PR removes the hack, and on the r-a side we'll have to use contiguous indices but that's not too hard. r? `@compiler-errors`
This commit is contained in:
commit
f04d068adc
@ -155,13 +155,13 @@
|
|||||||
use smallvec::SmallVec;
|
use smallvec::SmallVec;
|
||||||
|
|
||||||
use rustc_apfloat::ieee::{DoubleS, IeeeFloat, SingleS};
|
use rustc_apfloat::ieee::{DoubleS, IeeeFloat, SingleS};
|
||||||
use rustc_index::bit_set::GrowableBitSet;
|
use rustc_index::bit_set::{BitSet, GrowableBitSet};
|
||||||
|
use rustc_index::IndexVec;
|
||||||
|
|
||||||
use self::Constructor::*;
|
use self::Constructor::*;
|
||||||
use self::MaybeInfiniteInt::*;
|
use self::MaybeInfiniteInt::*;
|
||||||
use self::SliceKind::*;
|
use self::SliceKind::*;
|
||||||
|
|
||||||
use crate::index;
|
|
||||||
use crate::PatCx;
|
use crate::PatCx;
|
||||||
|
|
||||||
/// Whether we have seen a constructor in the column or not.
|
/// Whether we have seen a constructor in the column or not.
|
||||||
@ -920,10 +920,7 @@ pub enum ConstructorSet<Cx: PatCx> {
|
|||||||
Struct { empty: bool },
|
Struct { empty: bool },
|
||||||
/// This type has the following list of constructors. If `variants` is empty and
|
/// This type has the following list of constructors. If `variants` is empty and
|
||||||
/// `non_exhaustive` is false, don't use this; use `NoConstructors` instead.
|
/// `non_exhaustive` is false, don't use this; use `NoConstructors` instead.
|
||||||
Variants {
|
Variants { variants: IndexVec<Cx::VariantIdx, VariantVisibility>, non_exhaustive: bool },
|
||||||
variants: index::IdxContainer<Cx::VariantIdx, VariantVisibility>,
|
|
||||||
non_exhaustive: bool,
|
|
||||||
},
|
|
||||||
/// The type is `&T`.
|
/// The type is `&T`.
|
||||||
Ref,
|
Ref,
|
||||||
/// The type is a union.
|
/// The type is a union.
|
||||||
@ -1025,7 +1022,7 @@ pub fn split<'a>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ConstructorSet::Variants { variants, non_exhaustive } => {
|
ConstructorSet::Variants { variants, non_exhaustive } => {
|
||||||
let mut seen_set = index::IdxSet::new_empty(variants.len());
|
let mut seen_set = BitSet::new_empty(variants.len());
|
||||||
for idx in seen.iter().filter_map(|c| c.as_variant()) {
|
for idx in seen.iter().filter_map(|c| c.as_variant()) {
|
||||||
seen_set.insert(idx);
|
seen_set.insert(idx);
|
||||||
}
|
}
|
||||||
|
@ -25,50 +25,9 @@
|
|||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
#[cfg(feature = "rustc")]
|
// Re-exports to avoid rustc_index version issues.
|
||||||
pub mod index {
|
pub use rustc_index::Idx;
|
||||||
// Faster version when the indices of variants are `0..variants.len()`.
|
pub use rustc_index::IndexVec;
|
||||||
pub use rustc_index::bit_set::BitSet as IdxSet;
|
|
||||||
pub use rustc_index::Idx;
|
|
||||||
pub use rustc_index::IndexVec as IdxContainer;
|
|
||||||
}
|
|
||||||
#[cfg(not(feature = "rustc"))]
|
|
||||||
pub mod index {
|
|
||||||
// Slower version when the indices of variants are something else.
|
|
||||||
pub trait Idx: Copy + PartialEq + Eq + std::hash::Hash {}
|
|
||||||
impl<T: Copy + PartialEq + Eq + std::hash::Hash> Idx for T {}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct IdxContainer<K, V>(pub rustc_hash::FxHashMap<K, V>);
|
|
||||||
impl<K: Idx, V> IdxContainer<K, V> {
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
self.0.len()
|
|
||||||
}
|
|
||||||
pub fn iter_enumerated(&self) -> impl Iterator<Item = (K, &V)> {
|
|
||||||
self.0.iter().map(|(k, v)| (*k, v))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<V> FromIterator<V> for IdxContainer<usize, V> {
|
|
||||||
fn from_iter<T: IntoIterator<Item = V>>(iter: T) -> Self {
|
|
||||||
Self(iter.into_iter().enumerate().collect())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct IdxSet<T>(pub rustc_hash::FxHashSet<T>);
|
|
||||||
impl<T: Idx> IdxSet<T> {
|
|
||||||
pub fn new_empty(_len: usize) -> Self {
|
|
||||||
Self(Default::default())
|
|
||||||
}
|
|
||||||
pub fn contains(&self, elem: T) -> bool {
|
|
||||||
self.0.contains(&elem)
|
|
||||||
}
|
|
||||||
pub fn insert(&mut self, elem: T) {
|
|
||||||
self.0.insert(elem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "rustc")]
|
#[cfg(feature = "rustc")]
|
||||||
use rustc_middle::ty::Ty;
|
use rustc_middle::ty::Ty;
|
||||||
@ -96,7 +55,7 @@ pub trait PatCx: Sized + fmt::Debug {
|
|||||||
/// Errors that can abort analysis.
|
/// Errors that can abort analysis.
|
||||||
type Error: fmt::Debug;
|
type Error: fmt::Debug;
|
||||||
/// The index of an enum variant.
|
/// The index of an enum variant.
|
||||||
type VariantIdx: Clone + index::Idx + fmt::Debug;
|
type VariantIdx: Clone + Idx + fmt::Debug;
|
||||||
/// A string literal
|
/// A string literal
|
||||||
type StrLit: Clone + PartialEq + fmt::Debug;
|
type StrLit: Clone + PartialEq + fmt::Debug;
|
||||||
/// Extra data to store in a match arm.
|
/// Extra data to store in a match arm.
|
||||||
|
Loading…
Reference in New Issue
Block a user