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 | 57 |
1 files changed, 29 insertions, 28 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs index df8ea98dd0..0728509432 100644 --- a/crates/hir-ty/src/display.rs +++ b/crates/hir-ty/src/display.rs @@ -11,7 +11,7 @@ use base_db::{Crate, FxIndexMap}; use either::Either; use hir_def::{ ExpressionStoreOwnerId, FindPathConfig, GenericDefId, GenericParamId, HasModule, - ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId, TraitId, + ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId, TraitId, TypeAliasId, expr_store::{ExpressionStore, path::Path}, find_path::{self, PrefixKind}, hir::{ @@ -35,6 +35,7 @@ use hir_expand::{mod_path::PathKind, name::Name}; use intern::{Internable, Interned, sym}; use itertools::Itertools; use la_arena::ArenaMap; +use rustc_abi::ExternAbi; use rustc_apfloat::{ Float, ieee::{Half as f16, Quad as f128}, @@ -50,7 +51,7 @@ use span::Edition; use stdx::never; use crate::{ - CallableDefId, FnAbi, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval, + CallableDefId, ImplTraitId, MemoryMap, ParamEnvAndCrate, consteval, db::{GeneralConstId, HirDatabase}, generics::{ProvenanceSplit, generics}, layout::Layout, @@ -59,8 +60,8 @@ use crate::{ next_solver::{ AliasTy, Allocation, Clause, ClauseKind, Const, ConstKind, DbInterner, ExistentialPredicate, FnSig, GenericArg, GenericArgKind, GenericArgs, ParamEnv, PolyFnSig, - Region, SolverDefId, StoredEarlyBinder, StoredTy, Term, TermKind, TraitPredicate, TraitRef, - Ty, TyKind, TypingMode, ValTree, + Region, StoredEarlyBinder, StoredTy, Term, TermId, TermKind, TraitPredicate, TraitRef, Ty, + TyKind, TypingMode, Unnormalized, ValTree, abi::Safety, infer::{DbInternerInferExt, traits::ObligationCause}, }, @@ -190,7 +191,7 @@ impl<'db> HirFormatter<'_, 'db> { } else { match target.kind { AliasTyKind::Projection { def_id } => { - let def_id = def_id.expect_type_alias(); + let def_id = def_id.0; let ItemContainerId::TraitId(trait_) = def_id.loc(self.db).container else { panic!("expected an assoc type"); }; @@ -653,6 +654,7 @@ fn write_projection<'db>( f: &mut HirFormatter<'_, 'db>, alias: &AliasTy<'db>, needs_parens_if_multi: bool, + def_id: TypeAliasId, ) -> Result { f.format_bounds_with(*alias, |f| { if f.should_truncate() { @@ -671,6 +673,7 @@ fn write_projection<'db>( // `GenericDefId` from the formatted type (store it inside the `HirFormatter`). let bounds = GenericPredicates::query_all(f.db, param.id.parent()) .iter_identity() + .map(Unnormalized::skip_norm_wip) .filter(|wc| { let ty = match wc.kind().skip_binder() { ClauseKind::Trait(tr) => tr.self_ty(), @@ -699,13 +702,7 @@ fn write_projection<'db>( self_ty.hir_fmt(f)?; write!(f, " as ")?; trait_ref.hir_fmt(f)?; - write!( - f, - ">::{}", - TypeAliasSignature::of(f.db, alias.kind.def_id().expect_type_alias()) - .name - .display(f.db, f.edition()) - )?; + write!(f, ">::{}", TypeAliasSignature::of(f.db, def_id).name.display(f.db, f.edition()))?; let proj_params = &alias.args.as_slice()[trait_ref.args.len()..]; hir_fmt_generics(f, proj_params, None, None) }) @@ -1223,7 +1220,7 @@ fn render_variant_after_name<'db>( FieldsShape::Record | FieldsShape::Tuple => { let render_field = |f: &mut HirFormatter<'_, 'db>, id: LocalFieldId| { let offset = layout.fields.offset(u32::from(id.into_raw()) as usize).bytes_usize(); - let ty = field_types[id].get().instantiate(f.interner, args); + let ty = field_types[id].get().instantiate(f.interner, args).skip_norm_wip(); let Ok(layout) = f.db.layout_of_ty(ty.store(), param_env.store()) else { return f.write_str("<layout-error>"); }; @@ -1334,7 +1331,8 @@ impl<'db> HirDisplay<'db> for Ty<'db> { } TyKind::FnDef(def, args) => { let def = def.0; - let sig = db.callable_item_signature(def).instantiate(interner, args); + let sig = + db.callable_item_signature(def).instantiate(interner, args).skip_norm_wip(); if f.display_kind.is_source_code() { // `FnDef` is anonymous and there's no surface syntax for it. Show it as a @@ -1344,7 +1342,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { if let Safety::Unsafe = sig.safety() { write!(f, "unsafe ")?; } - if !matches!(sig.abi(), FnAbi::Rust | FnAbi::RustCall) { + if !sig.abi().is_rustic_abi() { f.write_str("extern \"")?; f.write_str(sig.abi().as_str())?; f.write_str("\" ")?; @@ -1480,8 +1478,8 @@ impl<'db> HirDisplay<'db> for Ty<'db> { hir_fmt_generics(f, parameters.as_slice(), Some(def.def_id().into()), None)?; } - TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Projection { .. }, .. }) => { - write_projection(f, &alias_ty, trait_bounds_need_parens)? + TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Projection { def_id }, .. }) => { + write_projection(f, &alias_ty, trait_bounds_need_parens, def_id.0)? } TyKind::Foreign(alias) => { let type_alias = TypeAliasSignature::of(db, alias.0); @@ -1490,10 +1488,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { f.end_location_link(); } TyKind::Alias(alias_ty @ AliasTy { kind: AliasTyKind::Opaque { def_id }, .. }) => { - let opaque_ty_id = match def_id { - SolverDefId::InternedOpaqueTyId(id) => id, - _ => unreachable!(), - }; + let opaque_ty_id = def_id.0; if !f.display_kind.allows_opaque() { return Err(HirDisplayError::DisplaySourceCodeError( DisplaySourceCodeError::OpaqueType, @@ -1503,6 +1498,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { let data = impl_trait_id.predicates(db); let bounds = data .iter_instantiated_copied(interner, alias_ty.args.as_slice()) + .map(Unnormalized::skip_norm_wip) .collect::<Vec<_>>(); let krate = match impl_trait_id { ImplTraitId::ReturnTypeImplTrait(func, _) => { @@ -1670,6 +1666,7 @@ impl<'db> HirDisplay<'db> for Ty<'db> { TypeParamProvenance::ArgumentImplTrait => { let bounds = GenericPredicates::query_all(f.db, param.id.parent()) .iter_identity() + .map(Unnormalized::skip_norm_wip) .filter(|wc| match wc.kind().skip_binder() { ClauseKind::Trait(tr) => tr.self_ty() == *self, ClauseKind::Projection(proj) => proj.self_ty() == *self, @@ -1878,7 +1875,9 @@ fn generic_args_sans_defaults<'ga, 'db>( let should_show = |arg: GenericArg<'db>, i: usize| match default_parameters.get(i) { None => true, Some(default_parameter) => { - arg != default_parameter.instantiate(f.interner, ¶meters[..i]) + arg != default_parameter + .instantiate(f.interner, ¶meters[..i]) + .skip_norm_wip() } }; let mut default_from = 0; @@ -1961,8 +1960,8 @@ fn hir_fmt_tys<'db>( impl<'db> HirDisplay<'db> for PolyFnSig<'db> { fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result { - let FnSig { inputs_and_output, c_variadic, safety, abi: _ } = self.skip_binder(); - if let Safety::Unsafe = safety { + let FnSig { inputs_and_output, fn_sig_kind } = self.skip_binder(); + if let Safety::Unsafe = fn_sig_kind.safety() { write!(f, "unsafe ")?; } // FIXME: Enable this when the FIXME on FnAbi regarding PartialEq is fixed. @@ -1973,7 +1972,7 @@ impl<'db> HirDisplay<'db> for PolyFnSig<'db> { // } write!(f, "fn(")?; f.write_joined(inputs_and_output.inputs(), ", ")?; - if c_variadic { + if fn_sig_kind.c_variadic() { if inputs_and_output.inputs().is_empty() { write!(f, "...")?; } else { @@ -2176,6 +2175,9 @@ fn write_bounds_like_dyn_trait<'db>( } } ClauseKind::Projection(projection) => { + let TermId::TypeAliasId(assoc_ty_id) = projection.def_id().0 else { + continue; + }; // in types in actual Rust, these will always come // after the corresponding Implemented predicate if angle_open { @@ -2184,7 +2186,6 @@ fn write_bounds_like_dyn_trait<'db>( write!(f, "<")?; angle_open = true; } - let assoc_ty_id = projection.def_id().expect_type_alias(); let type_alias = TypeAliasSignature::of(f.db, assoc_ty_id); f.start_location_link(assoc_ty_id.into()); write!(f, "{}", type_alias.name.display(f.db, f.edition()))?; @@ -2490,9 +2491,9 @@ impl<'db> HirDisplayWithExpressionStore<'db> for TypeRefId { if fn_.is_unsafe { write!(f, "unsafe ")?; } - if let Some(abi) = &fn_.abi { + if fn_.abi != ExternAbi::Rust { f.write_str("extern \"")?; - f.write_str(abi.as_str())?; + f.write_str(fn_.abi.as_str())?; f.write_str("\" ")?; } write!(f, "fn(")?; |