Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/match_check.rs')
| -rw-r--r-- | crates/hir-ty/src/diagnostics/match_check.rs | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/crates/hir-ty/src/diagnostics/match_check.rs b/crates/hir-ty/src/diagnostics/match_check.rs index b0f9fc53e2..7df22a45cb 100644 --- a/crates/hir-ty/src/diagnostics/match_check.rs +++ b/crates/hir-ty/src/diagnostics/match_check.rs @@ -11,19 +11,21 @@ pub(crate) mod pat_analysis; use chalk_ir::Mutability; use hir_def::{ - data::adt::VariantData, expr_store::Body, hir::PatId, AdtId, EnumVariantId, LocalFieldId, - VariantId, + AdtId, EnumVariantId, LocalFieldId, Lookup, VariantId, + expr_store::{Body, path::Path}, + hir::PatId, + item_tree::FieldsShape, }; use hir_expand::name::Name; use span::Edition; use stdx::{always, never}; use crate::{ + InferenceResult, Interner, Substitution, Ty, TyExt, TyKind, db::HirDatabase, display::{HirDisplay, HirDisplayError, HirFormatter}, infer::BindingMode, lang_items::is_box, - InferenceResult, Interner, Substitution, Ty, TyExt, TyKind, }; use self::pat_util::EnumerateAndAdjustIterator; @@ -155,7 +157,7 @@ impl<'a> PatCtxt<'a> { (BindingMode::Ref(_), _) => { never!( "`ref {}` has wrong type {:?}", - name.display(self.db.upcast(), Edition::LATEST), + name.display(self.db, Edition::LATEST), ty ); self.errors.push(PatternError::UnexpectedType); @@ -167,13 +169,13 @@ impl<'a> PatCtxt<'a> { } hir_def::hir::Pat::TupleStruct { ref args, ellipsis, .. } if variant.is_some() => { - let expected_len = variant.unwrap().variant_data(self.db.upcast()).fields().len(); + let expected_len = variant.unwrap().variant_data(self.db).fields().len(); let subpatterns = self.lower_tuple_subpats(args, expected_len, ellipsis); self.lower_variant_or_leaf(pat, ty, subpatterns) } hir_def::hir::Pat::Record { ref args, .. } if variant.is_some() => { - let variant_data = variant.unwrap().variant_data(self.db.upcast()); + let variant_data = variant.unwrap().variant_data(self.db); let subpatterns = args .iter() .map(|field| { @@ -242,7 +244,7 @@ impl<'a> PatCtxt<'a> { ty: &Ty, subpatterns: Vec<FieldPat>, ) -> PatKind { - let kind = match self.infer.variant_resolution_for_pat(pat) { + match self.infer.variant_resolution_for_pat(pat) { Some(variant_id) => { if let VariantId::EnumVariantId(enum_variant) = variant_id { let substs = match ty.kind(Interner) { @@ -266,11 +268,10 @@ impl<'a> PatCtxt<'a> { self.errors.push(PatternError::UnresolvedVariant); PatKind::Wild } - }; - kind + } } - fn lower_path(&mut self, pat: PatId, _path: &hir_def::path::Path) -> Pat { + fn lower_path(&mut self, pat: PatId, _path: &Path) -> Pat { let ty = &self.infer[pat]; let pat_from_kind = |kind| Pat { ty: ty.clone(), kind: Box::new(kind) }; @@ -303,7 +304,7 @@ impl HirDisplay for Pat { PatKind::Wild => write!(f, "_"), PatKind::Never => write!(f, "!"), PatKind::Binding { name, subpattern } => { - write!(f, "{}", name.display(f.db.upcast(), f.edition()))?; + write!(f, "{}", name.display(f.db, f.edition()))?; if let Some(subpattern) = subpattern { write!(f, " @ ")?; subpattern.hir_fmt(f)?; @@ -323,26 +324,29 @@ impl HirDisplay for Pat { if let Some(variant) = variant { match variant { VariantId::EnumVariantId(v) => { + let loc = v.lookup(f.db); write!( f, "{}", - f.db.enum_variant_data(v).name.display(f.db.upcast(), f.edition()) + f.db.enum_variants(loc.parent).variants[loc.index as usize] + .1 + .display(f.db, f.edition()) )?; } VariantId::StructId(s) => write!( f, "{}", - f.db.struct_data(s).name.display(f.db.upcast(), f.edition()) + f.db.struct_signature(s).name.display(f.db, f.edition()) )?, VariantId::UnionId(u) => write!( f, "{}", - f.db.union_data(u).name.display(f.db.upcast(), f.edition()) + f.db.union_signature(u).name.display(f.db, f.edition()) )?, }; - let variant_data = variant.variant_data(f.db.upcast()); - if let VariantData::Record { fields: rec_fields, .. } = &*variant_data { + let variant_data = variant.variant_data(f.db); + if variant_data.shape == FieldsShape::Record { write!(f, " {{ ")?; let mut printed = 0; @@ -351,20 +355,20 @@ impl HirDisplay for Pat { .filter(|p| !matches!(*p.pattern.kind, PatKind::Wild)) .map(|p| { printed += 1; - WriteWith(move |f| { + WriteWith(|f| { write!( f, "{}: ", - rec_fields[p.field] + variant_data.fields()[p.field] .name - .display(f.db.upcast(), f.edition()) + .display(f.db, f.edition()) )?; p.pattern.hir_fmt(f) }) }); f.write_joined(subpats, ", ")?; - if printed < rec_fields.len() { + if printed < variant_data.fields().len() { write!(f, "{}..", if printed > 0 { ", " } else { "" })?; } @@ -372,8 +376,8 @@ impl HirDisplay for Pat { } } - let num_fields = variant - .map_or(subpatterns.len(), |v| v.variant_data(f.db.upcast()).fields().len()); + let num_fields = + variant.map_or(subpatterns.len(), |v| v.variant_data(f.db).fields().len()); if num_fields != 0 || variant.is_none() { write!(f, "(")?; let subpats = (0..num_fields).map(|i| { |