mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 14:13:58 +00:00
Merge #3901
3901: Add more heuristics for hiding obvious param hints r=matklad a=IceSentry This will now hide `value`, `pat`, `rhs` and `other`. These words were selected from the std because they are used in commonly used functions with only a single param and are obvious by their use. It will also hide the hint if the passed param **starts** or end with the param_name. Maybe we could also split on '_' and check if one of the string is the param_name. I think it would be good to also hide `bytes` if the type is `[u8; n]` but I'm not sure how to get the param type signature. Closes #3900 Co-authored-by: IceSentry <c.giguere42@gmail.com>
This commit is contained in:
commit
9635d8bc44
1 changed files with 46 additions and 6 deletions
|
@ -1,4 +1,4 @@
|
||||||
//! FIXME: write short doc here
|
//! This module defines multiple types of inlay hints and their visibility
|
||||||
|
|
||||||
use hir::{Adt, HirDisplay, Semantics, Type};
|
use hir::{Adt, HirDisplay, Semantics, Type};
|
||||||
use ra_ide_db::RootDatabase;
|
use ra_ide_db::RootDatabase;
|
||||||
|
@ -235,8 +235,7 @@ fn should_show_param_hint(
|
||||||
param_name: &str,
|
param_name: &str,
|
||||||
argument: &ast::Expr,
|
argument: &ast::Expr,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let argument_string = argument.syntax().to_string();
|
if param_name.is_empty() || is_argument_similar_to_param(argument, param_name) {
|
||||||
if param_name.is_empty() || argument_string.ends_with(param_name) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,14 +244,37 @@ fn should_show_param_hint(
|
||||||
} else {
|
} else {
|
||||||
fn_signature.parameters.len()
|
fn_signature.parameters.len()
|
||||||
};
|
};
|
||||||
|
|
||||||
// avoid displaying hints for common functions like map, filter, etc.
|
// avoid displaying hints for common functions like map, filter, etc.
|
||||||
if parameters_len == 1 && (param_name.len() == 1 || param_name == "predicate") {
|
// or other obvious words used in std
|
||||||
|
if parameters_len == 1 && is_obvious_param(param_name) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_argument_similar_to_param(argument: &ast::Expr, param_name: &str) -> bool {
|
||||||
|
let argument_string = remove_ref(argument.clone()).syntax().to_string();
|
||||||
|
argument_string.starts_with(¶m_name) || argument_string.ends_with(¶m_name)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn remove_ref(expr: ast::Expr) -> ast::Expr {
|
||||||
|
if let ast::Expr::RefExpr(ref_expr) = &expr {
|
||||||
|
if let Some(inner) = ref_expr.expr() {
|
||||||
|
return inner;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
expr
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_obvious_param(param_name: &str) -> bool {
|
||||||
|
let is_obvious_param_name = match param_name {
|
||||||
|
"predicate" | "value" | "pat" | "rhs" | "other" => true,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
param_name.len() == 1 || is_obvious_param_name
|
||||||
|
}
|
||||||
|
|
||||||
fn get_fn_signature(sema: &Semantics<RootDatabase>, expr: &ast::Expr) -> Option<FunctionSignature> {
|
fn get_fn_signature(sema: &Semantics<RootDatabase>, expr: &ast::Expr) -> Option<FunctionSignature> {
|
||||||
match expr {
|
match expr {
|
||||||
ast::Expr::CallExpr(expr) => {
|
ast::Expr::CallExpr(expr) => {
|
||||||
|
@ -1059,9 +1081,18 @@ impl Test {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn field(self, value: i32) -> Self {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
fn no_hints_expected(&self, _: i32, test_var: i32) {}
|
fn no_hints_expected(&self, _: i32, test_var: i32) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Param {}
|
||||||
|
|
||||||
|
fn different_order(param: &Param) {}
|
||||||
|
fn different_order_mut(param: &mut Param) {}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let container: TestVarContainer = TestVarContainer { test_var: 42 };
|
let container: TestVarContainer = TestVarContainer { test_var: 42 };
|
||||||
let test: Test = Test {};
|
let test: Test = Test {};
|
||||||
|
@ -1069,11 +1100,20 @@ fn main() {
|
||||||
map(22);
|
map(22);
|
||||||
filter(33);
|
filter(33);
|
||||||
|
|
||||||
let test_processed: Test = test.map(1).filter(2);
|
let test_processed: Test = test.map(1).filter(2).field(3);
|
||||||
|
|
||||||
let test_var: i32 = 55;
|
let test_var: i32 = 55;
|
||||||
test_processed.no_hints_expected(22, test_var);
|
test_processed.no_hints_expected(22, test_var);
|
||||||
test_processed.no_hints_expected(33, container.test_var);
|
test_processed.no_hints_expected(33, container.test_var);
|
||||||
|
|
||||||
|
let param_begin: Param = Param {};
|
||||||
|
different_order(¶m_begin);
|
||||||
|
different_order(&mut param_begin);
|
||||||
|
|
||||||
|
let a: f64 = 7.0;
|
||||||
|
let b: f64 = 4.0;
|
||||||
|
let _: f64 = a.div_euclid(b);
|
||||||
|
let _: f64 = a.abs_sub(b);
|
||||||
}"#,
|
}"#,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue