@@ -368,24 +368,33 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
368
368
if self . is_fn_ty ( rcvr_ty, span) {
369
369
if let SelfSource :: MethodCall ( expr) = source {
370
370
let suggest = if let ty:: FnDef ( def_id, _) = rcvr_ty. kind ( ) {
371
- let local_id = def_id. expect_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
-
376
- if let Some ( fields) = fields
377
- && let Some ( DefKind :: Ctor ( of, _) ) = self . tcx . opt_def_kind ( local_id) {
378
- Some ( ( fields, of) )
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
+ }
379
381
} else {
380
- 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
+ }
381
390
}
382
391
} else {
383
392
None
384
393
} ;
385
394
386
395
// If the function is a tuple constructor, we recommend that they call it
387
396
if let Some ( ( fields, kind) ) = suggest {
388
- suggest_call_constructor ( expr. span , kind, fields. len ( ) , & mut err) ;
397
+ suggest_call_constructor ( expr. span , kind, fields, & mut err) ;
389
398
} else {
390
399
// General case
391
400
err. span_label (
0 commit comments