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.rs102
1 files changed, 60 insertions, 42 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index d63a64a70d..96c7949e3d 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -8,7 +8,7 @@ use std::{
};
use base_db::CrateId;
-use chalk_ir::{BoundVar, TyKind};
+use chalk_ir::{BoundVar, Safety, TyKind};
use hir_def::{
data::adt::VariantData,
db::DefDatabase,
@@ -20,8 +20,7 @@ use hir_def::{
path::{Path, PathKind},
type_ref::{TraitBoundModifier, TypeBound, TypeRef},
visibility::Visibility,
- EnumVariantId, HasModule, ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId,
- TraitId,
+ HasModule, ItemContainerId, LocalFieldId, Lookup, ModuleDefId, ModuleId, TraitId,
};
use hir_expand::name::Name;
use intern::{Internable, Interned};
@@ -42,7 +41,7 @@ use crate::{
primitive, to_assoc_type_id,
utils::{self, detect_variant_from_bytes, generics, ClosureSubst},
AdtId, AliasEq, AliasTy, Binders, CallableDefId, CallableSig, Const, ConstScalar, ConstValue,
- DomainGoal, GenericArg, ImplTraitId, Interner, Lifetime, LifetimeData, LifetimeOutlives,
+ DomainGoal, FnAbi, GenericArg, ImplTraitId, Interner, Lifetime, LifetimeData, LifetimeOutlives,
MemoryMap, Mutability, OpaqueTy, ProjectionTy, ProjectionTyExt, QuantifiedWhereClause, Scalar,
Substitution, TraitEnvironment, TraitRef, TraitRefExt, Ty, TyExt, WhereClause,
};
@@ -276,7 +275,7 @@ impl DisplayTarget {
pub enum DisplaySourceCodeError {
PathNotFound,
UnknownType,
- Generator,
+ Coroutine,
OpaqueType,
}
@@ -428,7 +427,7 @@ impl HirDisplay for Const {
Ok(())
}
ConstValue::Concrete(c) => match &c.interned {
- ConstScalar::Bytes(b, m) => render_const_scalar(f, &b, m, &data.ty),
+ ConstScalar::Bytes(b, m) => render_const_scalar(f, b, m, &data.ty),
ConstScalar::UnevaluatedConst(c, parameters) => {
write!(f, "{}", c.name(f.db.upcast()))?;
hir_fmt_generics(f, parameters, c.generic_def(f.db.upcast()))?;
@@ -452,7 +451,7 @@ fn render_const_scalar(
TraitEnvironment::empty(*f.db.crate_graph().crates_in_topological_order().last().unwrap());
match ty.kind(Interner) {
TyKind::Scalar(s) => match s {
- Scalar::Bool => write!(f, "{}", if b[0] == 0 { false } else { true }),
+ Scalar::Bool => write!(f, "{}", b[0] != 0),
Scalar::Char => {
let it = u128::from_le_bytes(pad16(b, false)) as u32;
let Ok(c) = char::try_from(it) else {
@@ -486,7 +485,7 @@ fn render_const_scalar(
let Some(bytes) = memory_map.get(addr, size) else {
return f.write_str("<ref-data-not-available>");
};
- let s = std::str::from_utf8(&bytes).unwrap_or("<utf8-error>");
+ let s = std::str::from_utf8(bytes).unwrap_or("<utf8-error>");
write!(f, "{s:?}")
}
TyKind::Slice(ty) => {
@@ -508,7 +507,7 @@ fn render_const_scalar(
f.write_str(", ")?;
}
let offset = size_one * i;
- render_const_scalar(f, &bytes[offset..offset + size_one], memory_map, &ty)?;
+ render_const_scalar(f, &bytes[offset..offset + size_one], memory_map, ty)?;
}
f.write_str("]")
}
@@ -534,9 +533,7 @@ fn render_const_scalar(
write!(f, "&{}", data.name.display(f.db.upcast()))?;
Ok(())
}
- _ => {
- return f.write_str("<unsized-enum-or-union>");
- }
+ _ => f.write_str("<unsized-enum-or-union>"),
},
_ => {
let addr = usize::from_le_bytes(match b.try_into() {
@@ -580,7 +577,7 @@ fn render_const_scalar(
continue;
};
let size = layout.size.bytes_usize();
- render_const_scalar(f, &b[offset..offset + size], memory_map, &ty)?;
+ render_const_scalar(f, &b[offset..offset + size], memory_map, ty)?;
}
f.write_str(")")
}
@@ -613,16 +610,15 @@ fn render_const_scalar(
else {
return f.write_str("<failed-to-detect-variant>");
};
- let data = &f.db.enum_data(e).variants[var_id];
+ let data = f.db.enum_variant_data(var_id);
write!(f, "{}", data.name.display(f.db.upcast()))?;
- let field_types =
- f.db.field_types(EnumVariantId { parent: e, local_id: var_id }.into());
+ let field_types = f.db.field_types(var_id.into());
render_variant_after_name(
&data.variant_data,
f,
&field_types,
f.db.trait_environment(adt.0.into()),
- &var_layout,
+ var_layout,
subst,
b,
memory_map,
@@ -653,14 +649,14 @@ fn render_const_scalar(
f.write_str(", ")?;
}
let offset = size_one * i;
- render_const_scalar(f, &b[offset..offset + size_one], memory_map, &ty)?;
+ render_const_scalar(f, &b[offset..offset + size_one], memory_map, ty)?;
}
f.write_str("]")
}
TyKind::Never => f.write_str("!"),
TyKind::Closure(_, _) => f.write_str("<closure>"),
- TyKind::Generator(_, _) => f.write_str("<generator>"),
- TyKind::GeneratorWitness(_, _) => f.write_str("<generator-witness>"),
+ TyKind::Coroutine(_, _) => f.write_str("<coroutine>"),
+ TyKind::CoroutineWitness(_, _) => f.write_str("<coroutine-witness>"),
// The below arms are unreachable, since const eval will bail out before here.
TyKind::Foreign(_) => f.write_str("<extern-type>"),
TyKind::Error
@@ -720,7 +716,7 @@ fn render_variant_after_name(
}
write!(f, ")")?;
}
- return Ok(());
+ Ok(())
}
VariantData::Unit => Ok(()),
}
@@ -866,7 +862,7 @@ impl HirDisplay for Ty {
write!(f, ",)")?;
} else {
write!(f, "(")?;
- f.write_joined(&*substs.as_slice(Interner), ", ")?;
+ f.write_joined(substs.as_slice(Interner), ", ")?;
write!(f, ")")?;
}
}
@@ -883,20 +879,29 @@ impl HirDisplay for Ty {
// function pointer type.
return sig.hir_fmt(f);
}
+ if let Safety::Unsafe = sig.safety {
+ write!(f, "unsafe ")?;
+ }
+ if !matches!(sig.abi, FnAbi::Rust) {
+ f.write_str("extern \"")?;
+ f.write_str(sig.abi.as_str())?;
+ f.write_str("\" ")?;
+ }
- f.start_location_link(def.into());
match def {
CallableDefId::FunctionId(ff) => {
- write!(f, "fn {}", db.function_data(ff).name.display(f.db.upcast()))?
+ write!(f, "fn ")?;
+ f.start_location_link(def.into());
+ write!(f, "{}", db.function_data(ff).name.display(f.db.upcast()))?
}
CallableDefId::StructId(s) => {
+ f.start_location_link(def.into());
write!(f, "{}", db.struct_data(s).name.display(f.db.upcast()))?
}
- CallableDefId::EnumVariantId(e) => write!(
- f,
- "{}",
- db.enum_data(e.parent).variants[e.local_id].name.display(f.db.upcast())
- )?,
+ CallableDefId::EnumVariantId(e) => {
+ f.start_location_link(def.into());
+ write!(f, "{}", db.enum_variant_data(e).name.display(f.db.upcast()))?
+ }
};
f.end_location_link();
if parameters.len(Interner) > 0 {
@@ -1038,7 +1043,7 @@ impl HirDisplay for Ty {
f.start_location_link(t.into());
}
write!(f, "Future")?;
- if let Some(_) = future_trait {
+ if future_trait.is_some() {
f.end_location_link();
}
write!(f, "<")?;
@@ -1046,7 +1051,7 @@ impl HirDisplay for Ty {
f.start_location_link(t.into());
}
write!(f, "Output")?;
- if let Some(_) = output {
+ if output.is_some() {
f.end_location_link();
}
write!(f, " = ")?;
@@ -1205,17 +1210,16 @@ impl HirDisplay for Ty {
write!(f, "{{unknown}}")?;
}
TyKind::InferenceVar(..) => write!(f, "_")?,
- TyKind::Generator(_, subst) => {
+ TyKind::Coroutine(_, subst) => {
if f.display_target.is_source_code() {
return Err(HirDisplayError::DisplaySourceCodeError(
- DisplaySourceCodeError::Generator,
+ DisplaySourceCodeError::Coroutine,
));
}
let subst = subst.as_slice(Interner);
let a: Option<SmallVec<[&Ty; 3]>> = subst
.get(subst.len() - 3..)
- .map(|args| args.iter().map(|arg| arg.ty(Interner)).collect())
- .flatten();
+ .and_then(|args| args.iter().map(|arg| arg.ty(Interner)).collect());
if let Some([resume_ty, yield_ty, ret_ty]) = a.as_deref() {
write!(f, "|")?;
@@ -1229,10 +1233,10 @@ impl HirDisplay for Ty {
ret_ty.hir_fmt(f)?;
} else {
// This *should* be unreachable, but fallback just in case.
- write!(f, "{{generator}}")?;
+ write!(f, "{{coroutine}}")?;
}
}
- TyKind::GeneratorWitness(..) => write!(f, "{{generator witness}}")?,
+ TyKind::CoroutineWitness(..) => write!(f, "{{coroutine witness}}")?,
}
Ok(())
}
@@ -1323,9 +1327,19 @@ fn hir_fmt_generics(
impl HirDisplay for CallableSig {
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
+ let CallableSig { params_and_return: _, is_varargs, safety, abi: _ } = *self;
+ if let Safety::Unsafe = safety {
+ write!(f, "unsafe ")?;
+ }
+ // FIXME: Enable this when the FIXME on FnAbi regarding PartialEq is fixed.
+ // if !matches!(abi, FnAbi::Rust) {
+ // f.write_str("extern \"")?;
+ // f.write_str(abi.as_str())?;
+ // f.write_str("\" ")?;
+ // }
write!(f, "fn(")?;
f.write_joined(self.params(), ", ")?;
- if self.is_varargs {
+ if is_varargs {
if self.params().is_empty() {
write!(f, "...")?;
} else {
@@ -1426,7 +1440,7 @@ fn write_bounds_like_dyn_trait(
f.start_location_link(trait_.into());
write!(f, "{}", f.db.trait_data(trait_).name.display(f.db.upcast()))?;
f.end_location_link();
- if let [_, params @ ..] = &*trait_ref.substitution.as_slice(Interner) {
+ if let [_, params @ ..] = trait_ref.substitution.as_slice(Interner) {
if is_fn_trait {
if let Some(args) =
params.first().and_then(|it| it.assert_ty_ref(Interner).as_tuple())
@@ -1506,7 +1520,7 @@ fn write_bounds_like_dyn_trait(
}
write!(f, "Sized")?;
}
- if let Some(_) = sized_trait {
+ if sized_trait.is_some() {
f.end_location_link();
}
}
@@ -1690,11 +1704,15 @@ impl HirDisplay for TypeRef {
inner.hir_fmt(f)?;
write!(f, "]")?;
}
- &TypeRef::Fn(ref parameters, is_varargs, is_unsafe) => {
- // FIXME: Function pointer qualifiers.
+ &TypeRef::Fn(ref parameters, is_varargs, is_unsafe, ref abi) => {
if is_unsafe {
write!(f, "unsafe ")?;
}
+ if let Some(abi) = abi {
+ f.write_str("extern \"")?;
+ f.write_str(abi)?;
+ f.write_str("\" ")?;
+ }
write!(f, "fn(")?;
if let Some(((_, return_type), function_parameters)) = parameters.split_last() {
for index in 0..function_parameters.len() {