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.rs88
1 files changed, 49 insertions, 39 deletions
diff --git a/crates/hir/src/display.rs b/crates/hir/src/display.rs
index cdc0db8653..c5d44c11f2 100644
--- a/crates/hir/src/display.rs
+++ b/crates/hir/src/display.rs
@@ -159,6 +159,7 @@ impl HirDisplay for Adt {
impl HirDisplay for Struct {
fn hir_fmt(&self, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
let module_id = self.module(f.db).id;
+ // FIXME: Render repr if its set explicitly?
write_visibility(module_id, self.visibility(f.db), f)?;
f.write_str("struct ")?;
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
@@ -166,37 +167,40 @@ impl HirDisplay for Struct {
write_generic_params(def_id, f)?;
let variant_data = self.variant_data(f.db);
- if let StructKind::Tuple = variant_data.kind() {
- f.write_char('(')?;
- let mut it = variant_data.fields().iter().peekable();
-
- while let Some((id, _)) = it.next() {
- let field = Field { parent: (*self).into(), id };
- write_visibility(module_id, field.visibility(f.db), f)?;
- field.ty(f.db).hir_fmt(f)?;
- if it.peek().is_some() {
- f.write_str(", ")?;
- }
- }
-
- f.write_str(");")?;
- }
+ match variant_data.kind() {
+ StructKind::Tuple => {
+ f.write_char('(')?;
+ let mut it = variant_data.fields().iter().peekable();
- write_where_clause(def_id, f)?;
+ while let Some((id, _)) = it.next() {
+ let field = Field { parent: (*self).into(), id };
+ write_visibility(module_id, field.visibility(f.db), f)?;
+ field.ty(f.db).hir_fmt(f)?;
+ if it.peek().is_some() {
+ f.write_str(", ")?;
+ }
+ }
- if let StructKind::Record = variant_data.kind() {
- let fields = self.fields(f.db);
- if fields.is_empty() {
- f.write_str(" {}")?;
- } else {
- f.write_str(" {\n")?;
- for field in self.fields(f.db) {
- f.write_str(" ")?;
- field.hir_fmt(f)?;
- f.write_str(",\n")?;
+ f.write_char(')')?;
+ write_where_clause(def_id, f)?;
+ }
+ StructKind::Record => {
+ let has_where_clause = write_where_clause(def_id, f)?;
+ let fields = self.fields(f.db);
+ f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
+ if fields.is_empty() {
+ f.write_str("{}")?;
+ } else {
+ f.write_str("{\n")?;
+ for field in self.fields(f.db) {
+ f.write_str(" ")?;
+ field.hir_fmt(f)?;
+ f.write_str(",\n")?;
+ }
+ f.write_str("}")?;
}
- f.write_str("}")?;
}
+ StructKind::Unit => _ = write_where_clause(def_id, f)?,
}
Ok(())
@@ -210,11 +214,12 @@ impl HirDisplay for Enum {
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
write_generic_params(def_id, f)?;
- write_where_clause(def_id, f)?;
+ let has_where_clause = write_where_clause(def_id, f)?;
let variants = self.variants(f.db);
if !variants.is_empty() {
- f.write_str(" {\n")?;
+ f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
+ f.write_str("{\n")?;
for variant in variants {
f.write_str(" ")?;
variant.hir_fmt(f)?;
@@ -234,11 +239,12 @@ impl HirDisplay for Union {
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
write_generic_params(def_id, f)?;
- write_where_clause(def_id, f)?;
+ let has_where_clause = write_where_clause(def_id, f)?;
let fields = self.fields(f.db);
if !fields.is_empty() {
- f.write_str(" {\n")?;
+ f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
+ f.write_str("{\n")?;
for field in self.fields(f.db) {
f.write_str(" ")?;
field.hir_fmt(f)?;
@@ -446,7 +452,10 @@ fn write_generic_params(
Ok(())
}
-fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(), HirDisplayError> {
+fn write_where_clause(
+ def: GenericDefId,
+ f: &mut HirFormatter<'_>,
+) -> Result<bool, HirDisplayError> {
let params = f.db.generic_params(def);
// unnamed type targets are displayed inline with the argument itself, e.g. `f: impl Y`.
@@ -465,7 +474,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
});
if !has_displayable_predicate {
- return Ok(());
+ return Ok(false);
}
let write_target = |target: &WherePredicateTypeTarget, f: &mut HirFormatter<'_>| match target {
@@ -543,7 +552,7 @@ fn write_where_clause(def: GenericDefId, f: &mut HirFormatter<'_>) -> Result<(),
// End of final predicate. There must be at least one predicate here.
f.write_char(',')?;
- Ok(())
+ Ok(true)
}
impl HirDisplay for Const {
@@ -594,19 +603,20 @@ impl HirDisplay for Trait {
write!(f, "trait {}", data.name.display(f.db.upcast()))?;
let def_id = GenericDefId::TraitId(self.id);
write_generic_params(def_id, f)?;
- write_where_clause(def_id, f)?;
+ let has_where_clause = write_where_clause(def_id, f)?;
if let Some(limit) = f.entity_limit {
let assoc_items = self.items(f.db);
let count = assoc_items.len().min(limit);
+ f.write_char(if !has_where_clause { ' ' } else { '\n' })?;
if count == 0 {
if assoc_items.is_empty() {
- f.write_str(" {}")?;
+ f.write_str("{}")?;
} else {
- f.write_str(" { /* … */ }")?;
+ f.write_str("{ /* … */ }")?;
}
} else {
- f.write_str(" {\n")?;
+ f.write_str("{\n")?;
for item in &assoc_items[..count] {
f.write_str(" ")?;
match item {
@@ -651,7 +661,6 @@ impl HirDisplay for TypeAlias {
write!(f, "type {}", data.name.display(f.db.upcast()))?;
let def_id = GenericDefId::TypeAliasId(self.id);
write_generic_params(def_id, f)?;
- write_where_clause(def_id, f)?;
if !data.bounds.is_empty() {
f.write_str(": ")?;
f.write_joined(data.bounds.iter(), " + ")?;
@@ -660,6 +669,7 @@ impl HirDisplay for TypeAlias {
f.write_str(" = ")?;
ty.hir_fmt(f)?;
}
+ write_where_clause(def_id, f)?;
Ok(())
}
}