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.rs56
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);