mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-15 14:43:58 +00:00
Add check if param name is similar to fn name
This commit is contained in:
parent
53c7aead8f
commit
05723cb50d
1 changed files with 106 additions and 2 deletions
|
@ -1,6 +1,6 @@
|
||||||
use assists::utils::FamousDefs;
|
use assists::utils::FamousDefs;
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use hir::{known, HirDisplay, Semantics};
|
use hir::{known, Callable, HirDisplay, Semantics};
|
||||||
use ide_db::RootDatabase;
|
use ide_db::RootDatabase;
|
||||||
use stdx::to_lower_snake_case;
|
use stdx::to_lower_snake_case;
|
||||||
use syntax::{
|
use syntax::{
|
||||||
|
@ -170,7 +170,7 @@ fn get_param_name_hints(
|
||||||
};
|
};
|
||||||
Some((param_name, arg))
|
Some((param_name, arg))
|
||||||
})
|
})
|
||||||
.filter(|(param_name, arg)| should_show_param_name_hint(sema, &callable, ¶m_name, &arg))
|
.filter(|(param_name, arg)| should_show_param_name_hint(sema, &callable, param_name, &arg))
|
||||||
.map(|(param_name, arg)| InlayHint {
|
.map(|(param_name, arg)| InlayHint {
|
||||||
range: arg.syntax().text_range(),
|
range: arg.syntax().text_range(),
|
||||||
kind: InlayKind::ParameterHint,
|
kind: InlayKind::ParameterHint,
|
||||||
|
@ -334,9 +334,11 @@ fn should_show_param_name_hint(
|
||||||
| hir::CallableKind::TupleEnumVariant(_)
|
| hir::CallableKind::TupleEnumVariant(_)
|
||||||
| hir::CallableKind::Closure => None,
|
| hir::CallableKind::Closure => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
if param_name.is_empty()
|
if param_name.is_empty()
|
||||||
|| Some(param_name) == fn_name.as_ref().map(|s| s.trim_start_matches('_'))
|
|| Some(param_name) == fn_name.as_ref().map(|s| s.trim_start_matches('_'))
|
||||||
|| is_argument_similar_to_param_name(sema, argument, param_name)
|
|| is_argument_similar_to_param_name(sema, argument, param_name)
|
||||||
|
|| is_param_name_similar_to_fn_name(param_name, callable, fn_name.as_ref())
|
||||||
|| param_name.starts_with("ra_fixture")
|
|| param_name.starts_with("ra_fixture")
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -364,6 +366,26 @@ fn is_argument_similar_to_param_name(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_param_name_similar_to_fn_name(
|
||||||
|
param_name: &str,
|
||||||
|
callable: &Callable,
|
||||||
|
fn_name: Option<&String>,
|
||||||
|
) -> bool {
|
||||||
|
// if it's the only parameter, don't show it if:
|
||||||
|
// - is the same as the function name, or
|
||||||
|
// - the function ends with '_' + param_name
|
||||||
|
|
||||||
|
match (callable.n_params(), fn_name) {
|
||||||
|
(1, Some(function)) => {
|
||||||
|
function == param_name
|
||||||
|
|| (function.len() > param_name.len()
|
||||||
|
&& function.ends_with(param_name)
|
||||||
|
&& function[..function.len() - param_name.len()].ends_with('_'))
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn is_enum_name_similar_to_param_name(
|
fn is_enum_name_similar_to_param_name(
|
||||||
sema: &Semantics<RootDatabase>,
|
sema: &Semantics<RootDatabase>,
|
||||||
argument: &ast::Expr,
|
argument: &ast::Expr,
|
||||||
|
@ -456,6 +478,88 @@ fn main() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn param_name_similar_to_fn_name_still_hints() {
|
||||||
|
check_with_config(
|
||||||
|
InlayHintsConfig {
|
||||||
|
parameter_hints: true,
|
||||||
|
type_hints: false,
|
||||||
|
chaining_hints: false,
|
||||||
|
max_length: None,
|
||||||
|
},
|
||||||
|
r#"
|
||||||
|
fn max(x: i32, y: i32) -> i32 { x + y }
|
||||||
|
fn main() {
|
||||||
|
let _x = max(
|
||||||
|
4,
|
||||||
|
//^ x
|
||||||
|
4,
|
||||||
|
//^ y
|
||||||
|
);
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn param_name_similar_to_fn_name() {
|
||||||
|
check_with_config(
|
||||||
|
InlayHintsConfig {
|
||||||
|
parameter_hints: true,
|
||||||
|
type_hints: false,
|
||||||
|
chaining_hints: false,
|
||||||
|
max_length: None,
|
||||||
|
},
|
||||||
|
r#"
|
||||||
|
fn param_with_underscore(with_underscore: i32) -> i32 { with_underscore }
|
||||||
|
fn main() {
|
||||||
|
let _x = param_with_underscore(
|
||||||
|
4,
|
||||||
|
);
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn param_name_same_as_fn_name() {
|
||||||
|
check_with_config(
|
||||||
|
InlayHintsConfig {
|
||||||
|
parameter_hints: true,
|
||||||
|
type_hints: false,
|
||||||
|
chaining_hints: false,
|
||||||
|
max_length: None,
|
||||||
|
},
|
||||||
|
r#"
|
||||||
|
fn foo(foo: i32) -> i32 { foo }
|
||||||
|
fn main() {
|
||||||
|
let _x = foo(
|
||||||
|
4,
|
||||||
|
);
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn never_hide_param_when_multiple_params() {
|
||||||
|
check_with_config(
|
||||||
|
InlayHintsConfig {
|
||||||
|
parameter_hints: true,
|
||||||
|
type_hints: false,
|
||||||
|
chaining_hints: false,
|
||||||
|
max_length: None,
|
||||||
|
},
|
||||||
|
r#"
|
||||||
|
fn foo(bar: i32, baz: i32) -> i32 { bar + baz }
|
||||||
|
fn main() {
|
||||||
|
let _x = foo(
|
||||||
|
4,
|
||||||
|
//^ bar
|
||||||
|
8,
|
||||||
|
//^ baz
|
||||||
|
);
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn hints_disabled() {
|
fn hints_disabled() {
|
||||||
check_with_config(
|
check_with_config(
|
||||||
|
|
Loading…
Reference in a new issue