Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/display.rs')
| -rw-r--r-- | crates/hir-ty/src/display.rs | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs index 6767bd05b3..c76b8dc5f0 100644 --- a/crates/hir-ty/src/display.rs +++ b/crates/hir-ty/src/display.rs @@ -17,7 +17,7 @@ use hir_def::{ hir::generics::{TypeOrConstParamData, TypeParamProvenance, WherePredicate}, item_scope::ItemInNs, item_tree::FieldsShape, - lang_item::LangItem, + lang_item::LangItems, nameres::DefMap, signatures::VariantFields, type_ref::{ @@ -47,7 +47,7 @@ use stdx::never; use triomphe::Arc; use crate::{ - CallableDefId, FnAbi, ImplTraitId, MemoryMap, TraitEnvironment, consteval, + CallableDefId, FnAbi, ImplTraitId, InferenceResult, MemoryMap, TraitEnvironment, consteval, db::{HirDatabase, InternedClosure, InternedCoroutine}, generics::generics, layout::Layout, @@ -61,7 +61,7 @@ use crate::{ infer::{DbInternerInferExt, traits::ObligationCause}, }, primitive, - utils::{self, detect_variant_from_bytes}, + utils::{detect_variant_from_bytes, fn_traits}, }; pub trait HirWrite: fmt::Write { @@ -309,8 +309,7 @@ pub trait HirDisplay<'db> { allow_opaque: bool, ) -> Result<String, DisplaySourceCodeError> { let mut result = String::new(); - let interner = - DbInterner::new_with(db, Some(module_id.krate()), module_id.containing_block()); + let interner = DbInterner::new_with(db, module_id.krate()); match self.hir_fmt(&mut HirFormatter { db, interner, @@ -392,6 +391,11 @@ impl<'db> HirFormatter<'_, 'db> { self.display_target.edition } + #[inline] + pub fn lang_items(&self) -> &'db LangItems { + self.interner.lang_items() + } + pub fn write_joined<T: HirDisplay<'db>>( &mut self, iter: impl IntoIterator<Item = T>, @@ -540,11 +544,7 @@ pub enum ClosureStyle { impl<'db, T: HirDisplay<'db>> HirDisplayWrapper<'_, 'db, T> { pub fn write_to<F: HirWrite>(&self, f: &mut F) -> Result<(), HirDisplayError> { let krate = self.display_target.krate; - let block = match self.display_kind { - DisplayKind::SourceCode { target_module_id, .. } => target_module_id.containing_block(), - DisplayKind::Diagnostics | DisplayKind::Test => None, - }; - let interner = DbInterner::new_with(self.db, Some(krate), block); + let interner = DbInterner::new_with(self.db, krate); self.t.hir_fmt(&mut HirFormatter { db: self.db, interner, @@ -1102,7 +1102,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { bounds.iter().any(|bound| match bound.skip_binder() { ExistentialPredicate::Trait(trait_ref) => { let trait_ = trait_ref.def_id.0; - fn_traits(db, trait_).any(|it| it == trait_) + fn_traits(f.lang_items()).any(|it| it == trait_) } _ => false, }); @@ -1146,7 +1146,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { let contains_impl_fn = bounds().any(|bound| { if let ClauseKind::Trait(trait_ref) = bound.kind().skip_binder() { let trait_ = trait_ref.def_id().0; - fn_traits(db, trait_).any(|it| it == trait_) + fn_traits(f.lang_items()).any(|it| it == trait_) } else { false } @@ -1394,7 +1394,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { if let Some(sig) = sig { let sig = sig.skip_binder(); let InternedClosure(def, _) = db.lookup_intern_closure(id); - let infer = db.infer(def); + let infer = InferenceResult::for_body(db, def); let (_, kind) = infer.closure_info(id); match f.closure_style { ClosureStyle::ImplFn => write!(f, "impl {kind:?}(")?, @@ -1588,8 +1588,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { .. } | hir_def::hir::Expr::Async { .. } => { - let future_trait = - LangItem::Future.resolve_trait(db, owner.module(db).krate()); + let future_trait = f.lang_items().Future; let output = future_trait.and_then(|t| { t.trait_items(db) .associated_type_by_name(&Name::new_symbol_root(sym::Output)) @@ -1799,11 +1798,6 @@ impl<'db> HirDisplay<'db> for Term<'db> { } } -fn fn_traits(db: &dyn DefDatabase, trait_: TraitId) -> impl Iterator<Item = TraitId> + '_ { - let krate = trait_.lookup(db).container.krate(); - utils::fn_traits(db, krate) -} - #[derive(Clone, Copy, PartialEq, Eq)] pub enum SizedByDefault { NotSized, @@ -1815,7 +1809,7 @@ impl SizedByDefault { match self { Self::NotSized => false, Self::Sized { anchor } => { - let sized_trait = LangItem::Sized.resolve_trait(db, anchor); + let sized_trait = hir_def::lang_item::lang_items(db, anchor).Sized; Some(trait_) == sized_trait } } @@ -1868,7 +1862,7 @@ fn write_bounds_like_dyn_trait<'db>( } } if !is_fn_trait { - is_fn_trait = fn_traits(f.db, trait_).any(|it| it == trait_); + is_fn_trait = fn_traits(f.lang_items()).any(|it| it == trait_); } if !is_fn_trait && angle_open { write!(f, ">")?; @@ -1966,7 +1960,7 @@ fn write_bounds_like_dyn_trait<'db>( write!(f, ">")?; } if let SizedByDefault::Sized { anchor } = default_sized { - let sized_trait = LangItem::Sized.resolve_trait(f.db, anchor); + let sized_trait = hir_def::lang_item::lang_items(f.db, anchor).Sized; if !is_sized { if !first { write!(f, " + ")?; |