Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints/param_name.rs')
-rw-r--r--crates/ide/src/inlay_hints/param_name.rs27
1 files changed, 20 insertions, 7 deletions
diff --git a/crates/ide/src/inlay_hints/param_name.rs b/crates/ide/src/inlay_hints/param_name.rs
index 9819d0e3fb..2e2a64c552 100644
--- a/crates/ide/src/inlay_hints/param_name.rs
+++ b/crates/ide/src/inlay_hints/param_name.rs
@@ -3,6 +3,8 @@
//! fn max(x: i32, y: i32) -> i32 { x + y }
//! _ = max(/*x*/4, /*y*/4);
//! ```
+use std::fmt::Display;
+
use either::Either;
use hir::{Callable, Semantics};
use ide_db::{base_db::FileRange, RootDatabase};
@@ -46,9 +48,7 @@ pub(super) fn hints(
.map(|(param, param_name, _, FileRange { range, .. })| {
let linked_location = param.and_then(|name| sema.original_range_opt(name.syntax()));
- let colon = if config.render_colons { ":" } else { "" };
- let label =
- InlayHintLabel::simple(format!("{param_name}{colon}"), None, linked_location);
+ let label = render_label(&param_name, config, linked_location);
InlayHint {
range,
kind: InlayKind::Parameter,
@@ -64,6 +64,16 @@ pub(super) fn hints(
Some(())
}
+pub(super) fn render_label(
+ param_name: impl Display,
+ config: &InlayHintsConfig,
+ linked_location: Option<FileRange>,
+) -> InlayHintLabel {
+ let colon = if config.render_colons { ":" } else { "" };
+
+ InlayHintLabel::simple(format!("{param_name}{colon}"), None, linked_location)
+}
+
fn get_callable(
sema: &Semantics<'_, RootDatabase>,
expr: &ast::Expr,
@@ -113,7 +123,7 @@ fn should_hide_param_name_hint(
};
let fn_name = fn_name.as_deref();
is_param_name_suffix_of_fn_name(param_name, callable, fn_name)
- || is_argument_similar_to_param_name(argument, param_name)
+ || is_argument_expr_similar_to_param_name(argument, param_name)
|| param_name.starts_with("ra_fixture")
|| (callable.n_params() == 1 && is_obvious_param(param_name))
|| is_adt_constructor_similar_to_param_name(sema, argument, param_name)
@@ -143,14 +153,17 @@ fn is_param_name_suffix_of_fn_name(
}
}
-fn is_argument_similar_to_param_name(argument: &ast::Expr, param_name: &str) -> bool {
- // check whether param_name and argument are the same or
- // whether param_name is a prefix/suffix of argument(split at `_`)
+fn is_argument_expr_similar_to_param_name(argument: &ast::Expr, param_name: &str) -> bool {
let argument = match get_string_representation(argument) {
Some(argument) => argument,
None => return false,
};
+ is_argument_similar_to_param_name(&argument, param_name)
+}
+/// Check whether param_name and argument are the same or
+/// whether param_name is a prefix/suffix of argument(split at `_`).
+pub(super) fn is_argument_similar_to_param_name(argument: &str, param_name: &str) -> bool {
// std is honestly too panic happy...
let str_split_at = |str: &str, at| str.is_char_boundary(at).then(|| argument.split_at(at));