|
1 | 1 | use assists::utils::FamousDefs;
|
2 | 2 | use either::Either;
|
3 |
| -use hir::{known, HirDisplay, Semantics}; |
| 3 | +use hir::{known, Callable, HirDisplay, Semantics}; |
4 | 4 | use ide_db::RootDatabase;
|
5 | 5 | use stdx::to_lower_snake_case;
|
6 | 6 | use syntax::{
|
@@ -170,7 +170,7 @@ fn get_param_name_hints(
|
170 | 170 | };
|
171 | 171 | Some((param_name, arg))
|
172 | 172 | })
|
173 |
| - .filter(|(param_name, arg)| should_show_param_name_hint(sema, &callable, ¶m_name, &arg)) |
| 173 | + .filter(|(param_name, arg)| should_show_param_name_hint(sema, &callable, param_name, &arg)) |
174 | 174 | .map(|(param_name, arg)| InlayHint {
|
175 | 175 | range: arg.syntax().text_range(),
|
176 | 176 | kind: InlayKind::ParameterHint,
|
@@ -334,9 +334,11 @@ fn should_show_param_name_hint(
|
334 | 334 | | hir::CallableKind::TupleEnumVariant(_)
|
335 | 335 | | hir::CallableKind::Closure => None,
|
336 | 336 | };
|
| 337 | + |
337 | 338 | if param_name.is_empty()
|
338 | 339 | || Some(param_name) == fn_name.as_ref().map(|s| s.trim_start_matches('_'))
|
339 | 340 | || is_argument_similar_to_param_name(sema, argument, param_name)
|
| 341 | + || is_param_name_similar_to_fn_name(param_name, callable, fn_name.as_ref()) |
340 | 342 | || param_name.starts_with("ra_fixture")
|
341 | 343 | {
|
342 | 344 | return false;
|
@@ -364,6 +366,26 @@ fn is_argument_similar_to_param_name(
|
364 | 366 | }
|
365 | 367 | }
|
366 | 368 |
|
| 369 | +fn is_param_name_similar_to_fn_name( |
| 370 | + param_name: &str, |
| 371 | + callable: &Callable, |
| 372 | + fn_name: Option<&String>, |
| 373 | +) -> bool { |
| 374 | + // if it's the only parameter, don't show it if: |
| 375 | + // - is the same as the function name, or |
| 376 | + // - the function ends with '_' + param_name |
| 377 | + |
| 378 | + match (callable.n_params(), fn_name) { |
| 379 | + (1, Some(function)) => { |
| 380 | + function == param_name |
| 381 | + || (function.len() > param_name.len() |
| 382 | + && function.ends_with(param_name) |
| 383 | + && function[..function.len() - param_name.len()].ends_with('_')) |
| 384 | + } |
| 385 | + _ => false, |
| 386 | + } |
| 387 | +} |
| 388 | + |
367 | 389 | fn is_enum_name_similar_to_param_name(
|
368 | 390 | sema: &Semantics<RootDatabase>,
|
369 | 391 | argument: &ast::Expr,
|
@@ -456,6 +478,88 @@ fn main() {
|
456 | 478 | );
|
457 | 479 | }
|
458 | 480 |
|
| 481 | + #[test] |
| 482 | + fn param_name_similar_to_fn_name_still_hints() { |
| 483 | + check_with_config( |
| 484 | + InlayHintsConfig { |
| 485 | + parameter_hints: true, |
| 486 | + type_hints: false, |
| 487 | + chaining_hints: false, |
| 488 | + max_length: None, |
| 489 | + }, |
| 490 | + r#" |
| 491 | +fn max(x: i32, y: i32) -> i32 { x + y } |
| 492 | +fn main() { |
| 493 | + let _x = max( |
| 494 | + 4, |
| 495 | + //^ x |
| 496 | + 4, |
| 497 | + //^ y |
| 498 | + ); |
| 499 | +}"#, |
| 500 | + ); |
| 501 | + } |
| 502 | + |
| 503 | + #[test] |
| 504 | + fn param_name_similar_to_fn_name() { |
| 505 | + check_with_config( |
| 506 | + InlayHintsConfig { |
| 507 | + parameter_hints: true, |
| 508 | + type_hints: false, |
| 509 | + chaining_hints: false, |
| 510 | + max_length: None, |
| 511 | + }, |
| 512 | + r#" |
| 513 | +fn param_with_underscore(with_underscore: i32) -> i32 { with_underscore } |
| 514 | +fn main() { |
| 515 | + let _x = param_with_underscore( |
| 516 | + 4, |
| 517 | + ); |
| 518 | +}"#, |
| 519 | + ); |
| 520 | + } |
| 521 | + |
| 522 | + #[test] |
| 523 | + fn param_name_same_as_fn_name() { |
| 524 | + check_with_config( |
| 525 | + InlayHintsConfig { |
| 526 | + parameter_hints: true, |
| 527 | + type_hints: false, |
| 528 | + chaining_hints: false, |
| 529 | + max_length: None, |
| 530 | + }, |
| 531 | + r#" |
| 532 | +fn foo(foo: i32) -> i32 { foo } |
| 533 | +fn main() { |
| 534 | + let _x = foo( |
| 535 | + 4, |
| 536 | + ); |
| 537 | +}"#, |
| 538 | + ); |
| 539 | + } |
| 540 | + |
| 541 | + #[test] |
| 542 | + fn never_hide_param_when_multiple_params() { |
| 543 | + check_with_config( |
| 544 | + InlayHintsConfig { |
| 545 | + parameter_hints: true, |
| 546 | + type_hints: false, |
| 547 | + chaining_hints: false, |
| 548 | + max_length: None, |
| 549 | + }, |
| 550 | + r#" |
| 551 | +fn foo(bar: i32, baz: i32) -> i32 { bar + baz } |
| 552 | +fn main() { |
| 553 | + let _x = foo( |
| 554 | + 4, |
| 555 | + //^ bar |
| 556 | + 8, |
| 557 | + //^ baz |
| 558 | + ); |
| 559 | +}"#, |
| 560 | + ); |
| 561 | + } |
| 562 | + |
459 | 563 | #[test]
|
460 | 564 | fn hints_disabled() {
|
461 | 565 | check_with_config(
|
|
0 commit comments