Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/diagnostics/expr.rs')
| -rw-r--r-- | crates/hir-ty/src/diagnostics/expr.rs | 56 |
1 files changed, 26 insertions, 30 deletions
diff --git a/crates/hir-ty/src/diagnostics/expr.rs b/crates/hir-ty/src/diagnostics/expr.rs index cc6f4d9e52..5e3d880589 100644 --- a/crates/hir-ty/src/diagnostics/expr.rs +++ b/crates/hir-ty/src/diagnostics/expr.rs @@ -4,40 +4,40 @@ use std::fmt; -use base_db::CrateId; +use base_db::Crate; use chalk_solve::rust_ir::AdtKind; use either::Either; use hir_def::{ + AdtId, AssocItemId, DefWithBodyId, HasModule, ItemContainerId, Lookup, lang_item::LangItem, resolver::{HasResolver, ValueNs}, - AdtId, AssocItemId, DefWithBodyId, HasModule, ItemContainerId, Lookup, }; use intern::sym; use itertools::Itertools; use rustc_hash::FxHashSet; use rustc_pattern_analysis::constructor::Constructor; use syntax::{ - ast::{self, UnaryOp}, AstNode, + ast::{self, UnaryOp}, }; use tracing::debug; use triomphe::Arc; use typed_arena::Arena; use crate::{ + Adjust, InferenceResult, Interner, Ty, TyExt, TyKind, db::HirDatabase, diagnostics::match_check::{ self, pat_analysis::{self, DeconstructedPat, MatchCheckCtx, WitnessPat}, }, display::{DisplayTarget, HirDisplay}, - Adjust, InferenceResult, Interner, Ty, TyExt, TyKind, }; pub(crate) use hir_def::{ + LocalFieldId, VariantId, expr_store::Body, hir::{Expr, ExprId, MatchArm, Pat, PatId, Statement}, - LocalFieldId, VariantId, }; pub enum BodyValidationDiagnostic { @@ -164,9 +164,8 @@ impl ExprValidator { None => return, }; - let checker = filter_map_next_checker.get_or_insert_with(|| { - FilterMapNextChecker::new(&self.owner.resolver(db.upcast()), db) - }); + let checker = filter_map_next_checker + .get_or_insert_with(|| FilterMapNextChecker::new(&self.owner.resolver(db), db)); if checker.check(call_id, receiver, &callee).is_some() { self.diagnostics.push(BodyValidationDiagnostic::ReplaceFilterMapNextWithFindMap { @@ -191,7 +190,7 @@ impl ExprValidator { return; } - let cx = MatchCheckCtx::new(self.owner.module(db.upcast()), self.owner, db); + let cx = MatchCheckCtx::new(self.owner.module(db), self.owner, db); let pattern_arena = Arena::new(); let mut m_arms = Vec::with_capacity(arms.len()); @@ -264,7 +263,7 @@ impl ExprValidator { scrut_ty, witnesses, m_arms.is_empty(), - self.owner.krate(db.upcast()), + self.owner.krate(db), ), }); } @@ -288,17 +287,16 @@ impl ExprValidator { match &self.body[scrutinee_expr] { Expr::UnaryOp { op: UnaryOp::Deref, .. } => false, Expr::Path(path) => { - let value_or_partial = - self.owner.resolver(db.upcast()).resolve_path_in_value_ns_fully( - db.upcast(), - path, - self.body.expr_path_hygiene(scrutinee_expr), - ); + let value_or_partial = self.owner.resolver(db).resolve_path_in_value_ns_fully( + db, + path, + self.body.expr_path_hygiene(scrutinee_expr), + ); value_or_partial.is_none_or(|v| !matches!(v, ValueNs::StaticId(_))) } Expr::Field { expr, .. } => match self.infer.type_of_expr[*expr].kind(Interner) { TyKind::Adt(adt, ..) - if db.adt_datum(self.owner.krate(db.upcast()), *adt).kind == AdtKind::Union => + if db.adt_datum(self.owner.krate(db), *adt).kind == AdtKind::Union => { false } @@ -319,7 +317,7 @@ impl ExprValidator { return; }; let pattern_arena = Arena::new(); - let cx = MatchCheckCtx::new(self.owner.module(db.upcast()), self.owner, db); + let cx = MatchCheckCtx::new(self.owner.module(db), self.owner, db); for stmt in &**statements { let &Statement::Let { pat, initializer, else_branch: None, .. } = stmt else { continue; @@ -359,7 +357,7 @@ impl ExprValidator { ty, witnesses, false, - self.owner.krate(db.upcast()), + self.owner.krate(db), ), }); } @@ -434,11 +432,11 @@ impl ExprValidator { let last_then_expr_ty = &self.infer[last_then_expr]; if last_then_expr_ty.is_never() { // Only look at sources if the then branch diverges and we have an else branch. - let (_, source_map) = db.body_with_source_map(self.owner); + let source_map = db.body_with_source_map(self.owner).1; let Ok(source_ptr) = source_map.expr_syntax(id) else { return; }; - let root = source_ptr.file_syntax(db.upcast()); + let root = source_ptr.file_syntax(db); let either::Left(ast::Expr::IfExpr(if_expr)) = source_ptr.value.to_node(&root) else { @@ -490,13 +488,11 @@ impl FilterMapNextChecker { { Some(next_function_id) => ( Some(next_function_id), - match next_function_id.lookup(db.upcast()).container { + match next_function_id.lookup(db).container { ItemContainerId::TraitId(iterator_trait_id) => { - let iterator_trait_items = &db.trait_data(iterator_trait_id).items; + let iterator_trait_items = &db.trait_items(iterator_trait_id).items; iterator_trait_items.iter().find_map(|(name, it)| match it { - &AssocItemId::FunctionId(id) if *name == sym::filter_map.clone() => { - Some(id) - } + &AssocItemId::FunctionId(id) if *name == sym::filter_map => Some(id), _ => None, }) } @@ -558,7 +554,7 @@ pub fn record_literal_missing_fields( return None; } - let variant_data = variant_def.variant_data(db.upcast()); + let variant_data = variant_def.variant_data(db); let specified_fields: FxHashSet<_> = fields.iter().map(|f| &f.name).collect(); let missed_fields: Vec<LocalFieldId> = variant_data @@ -588,7 +584,7 @@ pub fn record_pattern_missing_fields( return None; } - let variant_data = variant_def.variant_data(db.upcast()); + let variant_data = variant_def.variant_data(db); let specified_fields: FxHashSet<_> = fields.iter().map(|f| &f.name).collect(); let missed_fields: Vec<LocalFieldId> = variant_data @@ -630,7 +626,7 @@ fn missing_match_arms<'p>( scrut_ty: &Ty, witnesses: Vec<WitnessPat<'p>>, arms_is_empty: bool, - krate: CrateId, + krate: Crate, ) -> String { struct DisplayWitness<'a, 'p>(&'a WitnessPat<'p>, &'a MatchCheckCtx<'p>, DisplayTarget); impl fmt::Display for DisplayWitness<'_, '_> { @@ -642,7 +638,7 @@ fn missing_match_arms<'p>( } let non_empty_enum = match scrut_ty.as_adt() { - Some((AdtId::EnumId(e), _)) => !cx.db.enum_data(e).variants.is_empty(), + Some((AdtId::EnumId(e), _)) => !cx.db.enum_variants(e).variants.is_empty(), _ => false, }; let display_target = DisplayTarget::from_crate(cx.db, krate); |