@@ -235,19 +235,7 @@ fn should_show_param_hint(
235235 param_name : & str ,
236236 argument : & ast:: Expr ,
237237) -> bool {
238- let argument_string = {
239- let mut arg_string = argument. syntax ( ) . to_string ( ) ;
240- if arg_string. get ( 0 ..5 ) == Some ( "&mut " ) {
241- arg_string = arg_string[ 5 ..] . to_string ( ) ;
242- } else if arg_string. get ( 0 ..1 ) == Some ( "&" ) {
243- arg_string = arg_string[ 1 ..] . to_string ( ) ;
244- }
245- arg_string
246- } ;
247- if param_name. is_empty ( )
248- || argument_string. ends_with ( & param_name)
249- || argument_string. starts_with ( & param_name)
250- {
238+ if param_name. is_empty ( ) || is_argument_similar_to_param ( argument, param_name) {
251239 return false ;
252240 }
253241
@@ -259,15 +247,27 @@ fn should_show_param_hint(
259247
260248 // avoid displaying hints for common functions like map, filter, etc.
261249 // or other obvious words used in std
250+ if parameters_len == 1 && is_obvious_param ( param_name) {
251+ return false ;
252+ }
253+ true
254+ }
255+
256+ fn is_argument_similar_to_param ( argument : & ast:: Expr , param_name : & str ) -> bool {
257+ let argument_string = if let ast:: Expr :: RefExpr ( ref_expr) = argument {
258+ ref_expr. syntax ( ) . last_token ( ) . expect ( "RefExpr should have a last_token" ) . to_string ( )
259+ } else {
260+ argument. syntax ( ) . to_string ( )
261+ } ;
262+ argument_string. starts_with ( & param_name) || argument_string. ends_with ( & param_name)
263+ }
264+
265+ fn is_obvious_param ( param_name : & str ) -> bool {
262266 let is_obvious_param_name = match param_name {
263267 "predicate" | "value" | "pat" | "rhs" | "other" => true ,
264268 _ => false ,
265269 } ;
266- if parameters_len == 1 && ( param_name. len ( ) == 1 || is_obvious_param_name) {
267- return false ;
268- }
269-
270- true
270+ param_name. len ( ) == 1 || is_obvious_param_name
271271}
272272
273273fn get_fn_signature ( sema : & Semantics < RootDatabase > , expr : & ast:: Expr ) -> Option < FunctionSignature > {
0 commit comments