@@ -367,24 +367,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
367
367
368
368
if self . is_fn_ty ( rcvr_ty, span) {
369
369
if let SelfSource :: MethodCall ( expr) = source {
370
- let suggest = if let ty:: FnDef ( def_id, _) = rcvr_ty. kind ( ) && let Some ( local_id) = def_id. as_local ( ) {
371
- let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( local_id) ;
372
- let node = tcx. hir ( ) . get ( hir_id) ;
373
- let fields = node. tuple_fields ( ) ;
374
-
375
- if let Some ( fields) = fields
376
- && let Some ( DefKind :: Ctor ( of, _) ) = self . tcx . opt_def_kind ( local_id) {
377
- Some ( ( fields, of) )
370
+ let suggest = if let ty:: FnDef ( def_id, _) = rcvr_ty. kind ( ) {
371
+ if let Some ( local_id) = def_id. as_local ( ) {
372
+ let hir_id = tcx. hir ( ) . local_def_id_to_hir_id ( local_id) ;
373
+ let node = tcx. hir ( ) . get ( hir_id) ;
374
+ let fields = node. tuple_fields ( ) ;
375
+ if let Some ( fields) = fields
376
+ && let Some ( DefKind :: Ctor ( of, _) ) = self . tcx . opt_def_kind ( local_id) {
377
+ Some ( ( fields. len ( ) , of) )
378
+ } else {
379
+ None
380
+ }
378
381
} else {
379
- None
382
+ // The logic here isn't smart but `associated_item_def_ids`
383
+ // doesn't work nicely on local.
384
+ if let DefKind :: Ctor ( of, _) = tcx. def_kind ( def_id) {
385
+ let parent_def_id = tcx. parent ( * def_id) ;
386
+ Some ( ( tcx. associated_item_def_ids ( parent_def_id) . len ( ) , of) )
387
+ } else {
388
+ None
389
+ }
380
390
}
381
391
} else {
382
392
None
383
393
} ;
384
394
385
395
// If the function is a tuple constructor, we recommend that they call it
386
396
if let Some ( ( fields, kind) ) = suggest {
387
- suggest_call_constructor ( expr. span , kind, fields. len ( ) , & mut err) ;
397
+ suggest_call_constructor ( expr. span , kind, fields, & mut err) ;
388
398
} else {
389
399
// General case
390
400
err. span_label (
0 commit comments