Skip to content

Commit a60e009

Browse files
bors[bot]Veykril
andauthored
Merge #10806
10806: fix: inlay param hint hiding heurstic is case unsensitive r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <[email protected]>
2 parents 2fafe0e + cd290b4 commit a60e009

File tree

1 file changed

+25
-8
lines changed

1 file changed

+25
-8
lines changed

crates/ide/src/inlay_hints.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -441,15 +441,25 @@ fn is_argument_similar_to_param_name(argument: &ast::Expr, param_name: &str) ->
441441
None => return false,
442442
};
443443

444+
// std is honestly too panic happy...
445+
let str_split_at = |str: &str, at| str.is_char_boundary(at).then(|| argument.split_at(at));
446+
444447
let param_name = param_name.trim_start_matches('_');
445448
let argument = argument.trim_start_matches('_');
446-
if argument.strip_prefix(param_name).map_or(false, |s| s.starts_with('_')) {
447-
return true;
449+
450+
match str_split_at(argument, param_name.len()) {
451+
Some((prefix, rest)) if prefix.eq_ignore_ascii_case(param_name) => {
452+
return rest.is_empty() || rest.starts_with('_');
453+
}
454+
_ => (),
448455
}
449-
if argument.strip_suffix(param_name).map_or(false, |s| s.ends_with('_')) {
450-
return true;
456+
match argument.len().checked_sub(param_name.len()).and_then(|at| str_split_at(argument, at)) {
457+
Some((rest, suffix)) if param_name.eq_ignore_ascii_case(suffix) => {
458+
return rest.is_empty() || rest.ends_with('_');
459+
}
460+
_ => (),
451461
}
452-
argument == param_name
462+
false
453463
}
454464

455465
/// Hide the parameter name of a unary function if it is a `_` - prefixed suffix of the function's name, or equal.
@@ -464,9 +474,13 @@ fn is_param_name_suffix_of_fn_name(
464474
match (callable.n_params(), fn_name) {
465475
(1, Some(function)) => {
466476
function == param_name
467-
|| (function.len() > param_name.len()
468-
&& function.ends_with(param_name)
469-
&& function[..function.len() - param_name.len()].ends_with('_'))
477+
|| function
478+
.len()
479+
.checked_sub(param_name.len())
480+
.and_then(|at| function.is_char_boundary(at).then(|| function.split_at(at)))
481+
.map_or(false, |(prefix, suffix)| {
482+
suffix.eq_ignore_ascii_case(param_name) && prefix.ends_with('_')
483+
})
470484
}
471485
_ => false,
472486
}
@@ -852,6 +866,9 @@ enum CompletionKind {
852866
fn non_ident_pat((a, b): (u32, u32)) {}
853867
854868
fn main() {
869+
const PARAM: u32 = 0;
870+
foo(PARAM);
871+
855872
check("");
856873
857874
map(0);

0 commit comments

Comments
 (0)