Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints/generic_param.rs')
-rw-r--r--crates/ide/src/inlay_hints/generic_param.rs73
1 files changed, 42 insertions, 31 deletions
diff --git a/crates/ide/src/inlay_hints/generic_param.rs b/crates/ide/src/inlay_hints/generic_param.rs
index 037b328d97..762a4c2655 100644
--- a/crates/ide/src/inlay_hints/generic_param.rs
+++ b/crates/ide/src/inlay_hints/generic_param.rs
@@ -1,17 +1,19 @@
//! Implementation of inlay hints for generic parameters.
-use ide_db::{active_parameter::generic_def_for_node, RootDatabase};
+use ide_db::{active_parameter::generic_def_for_node, famous_defs::FamousDefs};
use syntax::{
ast::{self, AnyHasGenericArgs, HasGenericArgs, HasName},
AstNode,
};
-use crate::{inlay_hints::GenericParameterHints, InlayHint, InlayHintsConfig, InlayKind};
+use crate::{
+ inlay_hints::GenericParameterHints, InlayHint, InlayHintLabel, InlayHintsConfig, InlayKind,
+};
-use super::param_name::{is_argument_similar_to_param_name, render_label};
+use super::param_name::is_argument_similar_to_param_name;
pub(crate) fn hints(
acc: &mut Vec<InlayHint>,
- sema: &hir::Semantics<'_, RootDatabase>,
+ FamousDefs(sema, krate): &FamousDefs<'_, '_>,
config: &InlayHintsConfig,
node: AnyHasGenericArgs,
) -> Option<()> {
@@ -45,12 +47,23 @@ pub(crate) fn hints(
return None;
}
- let name = param.name(sema.db);
- let param_name = name.as_str();
+ let allowed = match (param, &arg) {
+ (hir::GenericParam::TypeParam(_), ast::GenericArg::TypeArg(_)) => type_hints,
+ (hir::GenericParam::ConstParam(_), ast::GenericArg::ConstArg(_)) => const_hints,
+ (hir::GenericParam::LifetimeParam(_), ast::GenericArg::LifetimeArg(_)) => {
+ lifetime_hints
+ }
+ _ => false,
+ };
+ if !allowed {
+ return None;
+ }
+
+ let param_name = param.name(sema.db);
let should_hide = {
let argument = get_string_representation(&arg)?;
- is_argument_similar_to_param_name(&argument, param_name)
+ is_argument_similar_to_param_name(&argument, param_name.as_str())
};
if should_hide {
@@ -59,30 +72,28 @@ pub(crate) fn hints(
let range = sema.original_range_opt(arg.syntax())?.range;
- let source_syntax = match param {
- hir::GenericParam::TypeParam(it) => {
- if !type_hints || !matches!(arg, ast::GenericArg::TypeArg(_)) {
- return None;
- }
- sema.source(it.merge())?.value.syntax().clone()
- }
- hir::GenericParam::ConstParam(it) => {
- if !const_hints || !matches!(arg, ast::GenericArg::ConstArg(_)) {
- return None;
- }
- let syntax = sema.source(it.merge())?.value.syntax().clone();
- let const_param = ast::ConstParam::cast(syntax)?;
- const_param.name()?.syntax().clone()
- }
- hir::GenericParam::LifetimeParam(it) => {
- if !lifetime_hints || !matches!(arg, ast::GenericArg::LifetimeArg(_)) {
- return None;
- }
- sema.source(it)?.value.syntax().clone()
- }
- };
- let linked_location = sema.original_range_opt(&source_syntax);
- let label = render_label(param_name, config, linked_location);
+ let colon = if config.render_colons { ":" } else { "" };
+ let label = InlayHintLabel::simple(
+ format!("{}{colon}", param_name.display(sema.db, krate.edition(sema.db))),
+ None,
+ config.lazy_location_opt(|| {
+ let source_syntax = match param {
+ hir::GenericParam::TypeParam(it) => {
+ sema.source(it.merge()).map(|it| it.value.syntax().clone())
+ }
+ hir::GenericParam::ConstParam(it) => {
+ let syntax = sema.source(it.merge())?.value.syntax().clone();
+ let const_param = ast::ConstParam::cast(syntax)?;
+ const_param.name().map(|it| it.syntax().clone())
+ }
+ hir::GenericParam::LifetimeParam(it) => {
+ sema.source(it).map(|it| it.value.syntax().clone())
+ }
+ };
+ let linked_location = source_syntax.and_then(|it| sema.original_range_opt(&it));
+ linked_location.map(Into::into)
+ }),
+ );
Some(InlayHint {
range,