@@ -219,26 +219,26 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
219219 let ( mod_prefix, mod_str, suggestion) = if path. len ( ) == 1 {
220220 debug ! ( ?self . diagnostic_metadata. current_impl_items) ;
221221 debug ! ( ?self . diagnostic_metadata. current_function) ;
222- let suggestion = if let Some ( items ) = self . diagnostic_metadata . current_impl_items
222+ let suggestion = if self . current_trait_ref . is_none ( )
223223 && let Some ( ( fn_kind, _) ) = self . diagnostic_metadata . current_function
224- && self . current_trait_ref . is_none ( )
225224 && let Some ( FnCtxt :: Assoc ( _) ) = fn_kind. ctxt ( )
225+ && let Some ( items) = self . diagnostic_metadata . current_impl_items
226226 && let Some ( item) = items. iter ( ) . find ( |i| {
227- if let AssocItemKind :: Fn ( fn_) = & i. kind
228- && !fn_. sig . decl . has_self ( )
229- && i. ident . name == item_str. name
227+ if let AssocItemKind :: Fn ( _) = & i. kind && i. ident . name == item_str. name
230228 {
231229 debug ! ( ?item_str. name) ;
232- debug ! ( ?fn_. sig. decl. inputs) ;
233230 return true
234231 }
235232 false
236233 } )
234+ && let AssocItemKind :: Fn ( fn_) = & item. kind
237235 {
236+ debug ! ( ?fn_) ;
237+ let self_sugg = if fn_. sig . decl . has_self ( ) { "self." } else { "Self::" } ;
238238 Some ( (
239- item_span,
239+ item_span. shrink_to_lo ( ) ,
240240 "consider using the associated function" ,
241- format ! ( "Self::{}" , item . ident )
241+ self_sugg . to_string ( )
242242 ) )
243243 } else {
244244 None
@@ -396,11 +396,13 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
396396 }
397397
398398 fn suggest_self_or_self_ref ( & mut self , err : & mut Diagnostic , path : & [ Segment ] , span : Span ) {
399- let is_assoc_fn = self . self_type_is_available ( ) ;
399+ if !self . self_type_is_available ( ) {
400+ return ;
401+ }
400402 let Some ( path_last_segment) = path. last ( ) else { return } ;
401403 let item_str = path_last_segment. ident ;
402404 // Emit help message for fake-self from other languages (e.g., `this` in Javascript).
403- if [ "this" , "my" ] . contains ( & item_str. as_str ( ) ) && is_assoc_fn {
405+ if [ "this" , "my" ] . contains ( & item_str. as_str ( ) ) {
404406 err. span_suggestion_short (
405407 span,
406408 "you might have meant to use `self` here instead" ,
@@ -451,7 +453,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
451453 let is_enum_variant = & |res| matches ! ( res, Res :: Def ( DefKind :: Variant , _) ) ;
452454 let path_str = Segment :: names_to_string ( path) ;
453455 let ident_span = path. last ( ) . map_or ( span, |ident| ident. ident . span ) ;
454-
455456 let mut candidates = self
456457 . r
457458 . lookup_import_candidates ( ident, ns, & self . parent_scope , is_expected)
@@ -1542,7 +1543,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
15421543 _ => None ,
15431544 }
15441545 }
1545-
15461546 // Fields are generally expected in the same contexts as locals.
15471547 if filter_fn ( Res :: Local ( ast:: DUMMY_NODE_ID ) ) {
15481548 if let Some ( node_id) =
0 commit comments