mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 14:21:44 +00:00
fix: Fix wrong where clause rendering on hover
This commit is contained in:
parent
0dd89d7ee7
commit
d69a81fddb
2 changed files with 211 additions and 109 deletions
|
@ -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();
|
||||
match variant_data.kind() {
|
||||
StructKind::Tuple => {
|
||||
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(", ")?;
|
||||
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_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(");")?;
|
||||
}
|
||||
|
||||
write_where_clause(def_id, f)?;
|
||||
|
||||
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_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(())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue