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.rs42
1 files changed, 31 insertions, 11 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index de8ce56df6..d8db473682 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -474,7 +474,7 @@ impl HirDisplay for ProjectionTy {
let trait_ref = self.trait_ref(f.db);
write!(f, "<")?;
- fmt_trait_ref(f, &trait_ref, true)?;
+ fmt_trait_ref(f, &trait_ref, TraitRefFormat::SelfAsTrait)?;
write!(
f,
">::{}",
@@ -1775,21 +1775,34 @@ fn write_bounds_like_dyn_trait(
Ok(())
}
+#[derive(Clone, Copy)]
+pub enum TraitRefFormat {
+ SelfAsTrait,
+ SelfImplementsTrait,
+ OnlyTrait,
+}
+
fn fmt_trait_ref(
f: &mut HirFormatter<'_>,
tr: &TraitRef,
- use_as: bool,
+ format: TraitRefFormat,
) -> Result<(), HirDisplayError> {
if f.should_truncate() {
return write!(f, "{TYPE_HINT_TRUNCATION}");
}
- tr.self_type_parameter(Interner).hir_fmt(f)?;
- if use_as {
- write!(f, " as ")?;
- } else {
- write!(f, ": ")?;
+ match format {
+ TraitRefFormat::SelfAsTrait => {
+ tr.self_type_parameter(Interner).hir_fmt(f)?;
+ write!(f, " as ")?;
+ }
+ TraitRefFormat::SelfImplementsTrait => {
+ tr.self_type_parameter(Interner).hir_fmt(f)?;
+ write!(f, ": ")?;
+ }
+ TraitRefFormat::OnlyTrait => {}
}
+
let trait_ = tr.hir_trait_id();
f.start_location_link(trait_.into());
write!(f, "{}", f.db.trait_data(trait_).name.display(f.db.upcast(), f.edition()))?;
@@ -1798,9 +1811,14 @@ fn fmt_trait_ref(
hir_fmt_generics(f, &substs[1..], None, substs[0].ty(Interner))
}
-impl HirDisplay for TraitRef {
+pub struct TraitRefDisplayWrapper {
+ pub trait_ref: TraitRef,
+ pub format: TraitRefFormat,
+}
+
+impl HirDisplay for TraitRefDisplayWrapper {
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
- fmt_trait_ref(f, self, false)
+ fmt_trait_ref(f, &self.trait_ref, self.format)
}
}
@@ -1811,10 +1829,12 @@ impl HirDisplay for WhereClause {
}
match self {
- WhereClause::Implemented(trait_ref) => trait_ref.hir_fmt(f)?,
+ WhereClause::Implemented(trait_ref) => {
+ fmt_trait_ref(f, trait_ref, TraitRefFormat::SelfImplementsTrait)?;
+ }
WhereClause::AliasEq(AliasEq { alias: AliasTy::Projection(projection_ty), ty }) => {
write!(f, "<")?;
- fmt_trait_ref(f, &projection_ty.trait_ref(f.db), true)?;
+ fmt_trait_ref(f, &projection_ty.trait_ref(f.db), TraitRefFormat::SelfAsTrait)?;
write!(f, ">::",)?;
let type_alias = from_assoc_type_id(projection_ty.associated_ty_id);
f.start_location_link(type_alias.into());