Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/display.rs')
-rw-r--r--crates/hir/src/display.rs27
1 files changed, 19 insertions, 8 deletions
diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs
index 53f24713cd..a71851ea8c 100644
--- a/crates/hir/src/display.rs
+++ b/crates/hir/src/display.rs
@@ -7,6 +7,7 @@ use hir_def::{
expr_store::{Body, ExpressionStore},
hir::generics::{GenericParams, TypeOrConstParamData, TypeParamProvenance, WherePredicate},
item_tree::FieldsShape,
+ layout::ExternAbi,
signatures::{
ConstSignature, FunctionSignature, ImplSignature, StaticFlags, StaticSignature, TraitFlags,
TraitSignature, TypeAliasSignature,
@@ -22,16 +23,16 @@ use hir_ty::{
hir_display_with_store, write_bounds_like_dyn_trait_with_prefix, write_params_bounds,
write_visibility,
},
- next_solver::ClauseKind,
+ next_solver::{ClauseKind, Unnormalized},
};
use itertools::Itertools;
-use rustc_type_ir::inherent::IntoKind;
+use rustc_type_ir::inherent::IntoKind as _;
use crate::{
Adt, AnyFunctionId, AsAssocItem, AssocItem, AssocItemContainer, Const, ConstParam, Crate, Enum,
EnumVariant, ExternCrateDecl, Field, Function, GenericParam, HasCrate, HasVisibility, Impl,
- LifetimeParam, Macro, Module, SelfParam, Static, Struct, StructKind, Trait, TraitRef,
- TupleField, Type, TypeAlias, TypeNs, TypeOrConstParam, TypeParam, Union,
+ LifetimeParam, Macro, Module, SelfParam, Static, Struct, StructKind, Trait, TraitPredicate,
+ TraitRef, TupleField, Type, TypeAlias, TypeNs, TypeOrConstParam, TypeParam, Union,
};
fn write_builtin_derive_impl_method<'db>(
@@ -163,13 +164,16 @@ fn write_function<'db>(f: &mut HirFormatter<'_, 'db>, func_id: FunctionId) -> Re
if data.is_async() {
f.write_str("async ")?;
}
+ if data.is_gen() {
+ f.write_str("gen ")?;
+ }
// FIXME: This will show `unsafe` for functions that are `#[target_feature]` but not unsafe
// (they are conditionally unsafe to call). We probably should show something else.
if func.is_unsafe_to_call(db, None, f.edition()) {
f.write_str("unsafe ")?;
}
- if let Some(abi) = &data.abi {
- write!(f, "extern \"{}\" ", abi.as_str())?;
+ if data.abi != ExternAbi::Rust {
+ write!(f, "extern \"{}\" ", data.abi.as_str())?;
}
write!(f, "fn {}", data.name.display(f.db, f.edition()))?;
@@ -200,7 +204,7 @@ fn write_function<'db>(f: &mut HirFormatter<'_, 'db>, func_id: FunctionId) -> Re
first = false;
}
- let pat_id = body.params[param.idx - body.self_param.is_some() as usize];
+ let pat_id = body.params[param.idx - body.self_param().is_some() as usize];
let pat_str = body.pretty_print_pat(db, func_id.into(), pat_id, true, f.edition());
f.write_str(&pat_str)?;
@@ -223,7 +227,7 @@ fn write_function<'db>(f: &mut HirFormatter<'_, 'db>, func_id: FunctionId) -> Re
// `FunctionData::ret_type` will be `::core::future::Future<Output = ...>` for async fns.
// Use ugly pattern match to strip the Future trait.
// Better way?
- let ret_type = if !data.is_async() {
+ let ret_type = if !data.is_async() && !data.is_gen() {
data.ret_type
} else if let Some(ret_type) = data.ret_type {
match &data.store[ret_type] {
@@ -579,6 +583,7 @@ impl<'db> HirDisplay<'db> for TypeParam {
let predicates = GenericPredicates::query_all(f.db, self.id.parent());
let predicates = predicates
.iter_identity()
+ .map(Unnormalized::skip_norm_wip)
.filter(|wc| match wc.kind().skip_binder() {
ClauseKind::Trait(tr) => tr.self_ty() == ty,
ClauseKind::Projection(proj) => proj.self_ty() == ty,
@@ -850,6 +855,12 @@ impl<'db> HirDisplay<'db> for TraitRef<'db> {
}
}
+impl<'db> HirDisplay<'db> for TraitPredicate<'db> {
+ fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
+ self.inner.hir_fmt(f)
+ }
+}
+
impl<'db> HirDisplay<'db> for Trait {
fn hir_fmt(&self, f: &mut HirFormatter<'_, 'db>) -> Result {
// FIXME(trait-alias) needs special handling to print the equal sign