mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
feat: add hover config for showing container bounds
This commit is contained in:
parent
184ddc6f5b
commit
78118f98f6
3 changed files with 60 additions and 14 deletions
|
@ -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,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(¶ms)
|
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(¶ms) && container_bounds_no_displayable {
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,9 +623,11 @@ fn write_where_clause(
|
||||||
write_where_predicates(¶ms, f)?;
|
write_where_predicates(¶ms, 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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue