feat: add hover config for showing container bounds

This commit is contained in:
roife 2024-06-11 20:59:06 +08:00
parent 184ddc6f5b
commit 78118f98f6
3 changed files with 60 additions and 14 deletions

View file

@ -74,6 +74,8 @@ pub struct HirFormatter<'a> {
/// When rendering something that has a concept of "children" (like fields in a struct), this limits /// When rendering something that has a concept of "children" (like fields in a struct), this limits
/// how many should be rendered. /// how many should be rendered.
pub entity_limit: Option<usize>, pub entity_limit: Option<usize>,
/// When rendering functions, whether to show the constraint from the container
show_container_bounds: bool,
omit_verbose_types: bool, omit_verbose_types: bool,
closure_style: ClosureStyle, closure_style: ClosureStyle,
display_target: DisplayTarget, display_target: DisplayTarget,
@ -101,6 +103,7 @@ pub trait HirDisplay {
omit_verbose_types: bool, omit_verbose_types: bool,
display_target: DisplayTarget, display_target: DisplayTarget,
closure_style: ClosureStyle, closure_style: ClosureStyle,
show_container_bounds: bool,
) -> HirDisplayWrapper<'a, Self> ) -> HirDisplayWrapper<'a, Self>
where where
Self: Sized, Self: Sized,
@ -117,6 +120,7 @@ pub trait HirDisplay {
omit_verbose_types, omit_verbose_types,
display_target, display_target,
closure_style, closure_style,
show_container_bounds,
} }
} }
@ -134,6 +138,7 @@ pub trait HirDisplay {
omit_verbose_types: false, omit_verbose_types: false,
closure_style: ClosureStyle::ImplFn, closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::Diagnostics, display_target: DisplayTarget::Diagnostics,
show_container_bounds: false,
} }
} }
@ -155,6 +160,7 @@ pub trait HirDisplay {
omit_verbose_types: true, omit_verbose_types: true,
closure_style: ClosureStyle::ImplFn, closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::Diagnostics, display_target: DisplayTarget::Diagnostics,
show_container_bounds: false,
} }
} }
@ -176,6 +182,7 @@ pub trait HirDisplay {
omit_verbose_types: true, omit_verbose_types: true,
closure_style: ClosureStyle::ImplFn, closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::Diagnostics, display_target: DisplayTarget::Diagnostics,
show_container_bounds: false,
} }
} }
@ -198,6 +205,7 @@ pub trait HirDisplay {
omit_verbose_types: false, omit_verbose_types: false,
closure_style: ClosureStyle::ImplFn, closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::SourceCode { module_id, allow_opaque }, display_target: DisplayTarget::SourceCode { module_id, allow_opaque },
show_container_bounds: false,
}) { }) {
Ok(()) => {} Ok(()) => {}
Err(HirDisplayError::FmtError) => panic!("Writing to String can't fail!"), Err(HirDisplayError::FmtError) => panic!("Writing to String can't fail!"),
@ -219,6 +227,29 @@ pub trait HirDisplay {
omit_verbose_types: false, omit_verbose_types: false,
closure_style: ClosureStyle::ImplFn, closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::Test, display_target: DisplayTarget::Test,
show_container_bounds: false,
}
}
/// Returns a String representation of `self` that shows the constraint from
/// the container for functions
fn display_with_container_bounds<'a>(
&'a self,
db: &'a dyn HirDatabase,
show_container_bounds: bool,
) -> HirDisplayWrapper<'a, Self>
where
Self: Sized,
{
HirDisplayWrapper {
db,
t: self,
max_size: None,
limited_size: None,
omit_verbose_types: false,
closure_style: ClosureStyle::ImplFn,
display_target: DisplayTarget::Diagnostics,
show_container_bounds,
} }
} }
} }
@ -277,6 +308,10 @@ impl HirFormatter<'_> {
pub fn omit_verbose_types(&self) -> bool { pub fn omit_verbose_types(&self) -> bool {
self.omit_verbose_types self.omit_verbose_types
} }
pub fn show_container_bounds(&self) -> bool {
self.show_container_bounds
}
} }
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -336,6 +371,7 @@ pub struct HirDisplayWrapper<'a, T> {
omit_verbose_types: bool, omit_verbose_types: bool,
closure_style: ClosureStyle, closure_style: ClosureStyle,
display_target: DisplayTarget, display_target: DisplayTarget,
show_container_bounds: bool,
} }
#[derive(Debug, PartialEq, Eq, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Clone, Copy)]
@ -365,6 +401,7 @@ impl<T: HirDisplay> HirDisplayWrapper<'_, T> {
omit_verbose_types: self.omit_verbose_types, omit_verbose_types: self.omit_verbose_types,
display_target: self.display_target, display_target: self.display_target,
closure_style: self.closure_style, closure_style: self.closure_style,
show_container_bounds: self.show_container_bounds,
}) })
} }

View file

@ -36,12 +36,16 @@ impl HirDisplay for Function {
match container { match container {
Some(AssocItemContainer::Trait(trait_)) => { Some(AssocItemContainer::Trait(trait_)) => {
if f.show_container_bounds() {
write_trait_header(&trait_, f)?; write_trait_header(&trait_, f)?;
f.write_str("\n")?; f.write_str("\n")?;
} }
}
Some(AssocItemContainer::Impl(impl_)) => { Some(AssocItemContainer::Impl(impl_)) => {
if f.show_container_bounds() {
write_impl_header(&impl_, f)?; write_impl_header(&impl_, f)?;
f.write_str("\n")?; f.write_str("\n")?;
}
// Block-local impls are "hoisted" to the nearest (non-block) module. // Block-local impls are "hoisted" to the nearest (non-block) module.
module = module.nearest_non_block_module(db); module = module.nearest_non_block_module(db);
@ -588,12 +592,14 @@ fn write_where_clause(
let params = f.db.generic_params(def); let params = f.db.generic_params(def);
let container = match def { let container = match def {
GenericDefId::FunctionId(id) => match id.lookup(f.db.upcast()).container() { GenericDefId::FunctionId(id) if f.show_container_bounds() => {
match id.lookup(f.db.upcast()).container() {
ItemContainerId::ImplId(it) => Some(("impl", it.into())), ItemContainerId::ImplId(it) => Some(("impl", it.into())),
ItemContainerId::TraitId(it) => Some(("trait", it.into())), ItemContainerId::TraitId(it) => Some(("trait", it.into())),
_ => None, _ => None,
} }
.map(|(name, def)| (name, f.db.generic_params(def))), .map(|(name, def)| (name, f.db.generic_params(def)))
}
_ => None, _ => None,
}; };
@ -607,9 +613,9 @@ fn write_where_clause(
}) })
}; };
if no_displayable_pred(&params) let container_bounds_no_displayable =
&& container.as_ref().map_or(true, |(_, p)| no_displayable_pred(p)) container.as_ref().map_or(true, |(_, p)| no_displayable_pred(p));
{ if no_displayable_pred(&params) && container_bounds_no_displayable {
return Ok(false); return Ok(false);
} }
@ -617,9 +623,11 @@ fn write_where_clause(
write_where_predicates(&params, f)?; write_where_predicates(&params, f)?;
if let Some((name, container_params)) = container { if let Some((name, container_params)) = container {
if !container_bounds_no_displayable {
write!(f, "\n // Bounds from {}:", name)?; write!(f, "\n // Bounds from {}:", name)?;
write_where_predicates(&container_params, f)?; write_where_predicates(&container_params, f)?;
} }
}
Ok(true) Ok(true)
} }

View file

@ -430,6 +430,7 @@ pub(super) fn definition(
} }
label label
} }
Definition::Function(fn_) => fn_.display_with_container_bounds(db, true).to_string(),
_ => def.label(db), _ => def.label(db),
}; };
let docs = def.docs(db, famous_defs); let docs = def.docs(db, famous_defs);