1
1
//! A bunch of methods and structures more or less related to resolving imports.
2
2
3
- use crate :: diagnostics:: { import_candidates, Suggestion } ;
3
+ use crate :: diagnostics:: { import_candidates, DiagnosticMode , Suggestion } ;
4
4
use crate :: Determinacy :: { self , * } ;
5
5
use crate :: Namespace :: * ;
6
6
use crate :: { module_to_string, names_to_string, ImportSuggestion } ;
@@ -402,7 +402,7 @@ struct UnresolvedImportError {
402
402
label : Option < String > ,
403
403
note : Option < String > ,
404
404
suggestion : Option < Suggestion > ,
405
- candidate : Option < Vec < ImportSuggestion > > ,
405
+ candidates : Option < Vec < ImportSuggestion > > ,
406
406
}
407
407
408
408
pub struct ImportResolver < ' a , ' b > {
@@ -475,12 +475,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
475
475
errors = vec ! [ ] ;
476
476
}
477
477
if seen_spans. insert ( err. span ) {
478
- let path = import_path_to_string (
479
- & import. module_path . iter ( ) . map ( |seg| seg. ident ) . collect :: < Vec < _ > > ( ) ,
480
- & import. kind ,
481
- err. span ,
482
- ) ;
483
- errors. push ( ( path, err) ) ;
478
+ errors. push ( ( import, err) ) ;
484
479
prev_root_id = import. root_id ;
485
480
}
486
481
} else if is_indeterminate {
@@ -494,10 +489,12 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
494
489
label : None ,
495
490
note : None ,
496
491
suggestion : None ,
497
- candidate : None ,
492
+ candidates : None ,
498
493
} ;
494
+ // FIXME: there should be a better way of doing this than
495
+ // formatting this as a string then checking for `::`
499
496
if path. contains ( "::" ) {
500
- errors. push ( ( path , err) )
497
+ errors. push ( ( import , err) )
501
498
}
502
499
}
503
500
}
@@ -507,7 +504,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
507
504
}
508
505
}
509
506
510
- fn throw_unresolved_import_error ( & self , errors : Vec < ( String , UnresolvedImportError ) > ) {
507
+ fn throw_unresolved_import_error ( & self , errors : Vec < ( & Import < ' _ > , UnresolvedImportError ) > ) {
511
508
if errors. is_empty ( ) {
512
509
return ;
513
510
}
@@ -516,7 +513,17 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
516
513
const MAX_LABEL_COUNT : usize = 10 ;
517
514
518
515
let span = MultiSpan :: from_spans ( errors. iter ( ) . map ( |( _, err) | err. span ) . collect ( ) ) ;
519
- let paths = errors. iter ( ) . map ( |( path, _) | format ! ( "`{}`" , path) ) . collect :: < Vec < _ > > ( ) ;
516
+ let paths = errors
517
+ . iter ( )
518
+ . map ( |( import, err) | {
519
+ let path = import_path_to_string (
520
+ & import. module_path . iter ( ) . map ( |seg| seg. ident ) . collect :: < Vec < _ > > ( ) ,
521
+ & import. kind ,
522
+ err. span ,
523
+ ) ;
524
+ format ! ( "`{path}`" )
525
+ } )
526
+ . collect :: < Vec < _ > > ( ) ;
520
527
let msg = format ! ( "unresolved import{} {}" , pluralize!( paths. len( ) ) , paths. join( ", " ) , ) ;
521
528
522
529
let mut diag = struct_span_err ! ( self . r. session, span, E0432 , "{}" , & msg) ;
@@ -525,7 +532,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
525
532
diag. note ( note) ;
526
533
}
527
534
528
- for ( _ , err) in errors. into_iter ( ) . take ( MAX_LABEL_COUNT ) {
535
+ for ( import , err) in errors. into_iter ( ) . take ( MAX_LABEL_COUNT ) {
529
536
if let Some ( label) = err. label {
530
537
diag. span_label ( err. span , label) ;
531
538
}
@@ -538,14 +545,36 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
538
545
diag. multipart_suggestion ( & msg, suggestions, applicability) ;
539
546
}
540
547
541
- if let Some ( candidate) = & err. candidate {
542
- import_candidates (
543
- self . r . session ,
544
- & self . r . untracked . source_span ,
545
- & mut diag,
546
- Some ( err. span ) ,
547
- & candidate,
548
- )
548
+ if let Some ( candidates) = & err. candidates {
549
+ match & import. kind {
550
+ ImportKind :: Single { nested : false , source, target, .. } => import_candidates (
551
+ self . r . session ,
552
+ & self . r . untracked . source_span ,
553
+ & mut diag,
554
+ Some ( err. span ) ,
555
+ & candidates,
556
+ DiagnosticMode :: Import ,
557
+ ( source != target)
558
+ . then ( || format ! ( " as {target}" ) )
559
+ . as_deref ( )
560
+ . unwrap_or ( "" ) ,
561
+ ) ,
562
+ ImportKind :: Single { nested : true , source, target, .. } => {
563
+ import_candidates (
564
+ self . r . session ,
565
+ & self . r . untracked . source_span ,
566
+ & mut diag,
567
+ None ,
568
+ & candidates,
569
+ DiagnosticMode :: Normal ,
570
+ ( source != target)
571
+ . then ( || format ! ( " as {target}" ) )
572
+ . as_deref ( )
573
+ . unwrap_or ( "" ) ,
574
+ ) ;
575
+ }
576
+ _ => { }
577
+ }
549
578
}
550
579
}
551
580
@@ -707,14 +736,14 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
707
736
String :: from ( "a similar path exists" ) ,
708
737
Applicability :: MaybeIncorrect ,
709
738
) ) ,
710
- candidate : None ,
739
+ candidates : None ,
711
740
} ,
712
741
None => UnresolvedImportError {
713
742
span,
714
743
label : Some ( label) ,
715
744
note : None ,
716
745
suggestion,
717
- candidate : None ,
746
+ candidates : None ,
718
747
} ,
719
748
} ;
720
749
return Some ( err) ;
@@ -761,7 +790,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
761
790
) ) ,
762
791
note : None ,
763
792
suggestion : None ,
764
- candidate : None ,
793
+ candidates : None ,
765
794
} ) ;
766
795
}
767
796
}
@@ -873,7 +902,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
873
902
let resolutions = resolutions. as_ref ( ) . into_iter ( ) . flat_map ( |r| r. iter ( ) ) ;
874
903
let names = resolutions
875
904
. filter_map ( |( BindingKey { ident : i, .. } , resolution) | {
876
- if * i == ident {
905
+ if i . name == ident. name {
877
906
return None ;
878
907
} // Never suggest the same name
879
908
match * resolution. borrow ( ) {
@@ -943,7 +972,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
943
972
label : Some ( label) ,
944
973
note,
945
974
suggestion,
946
- candidate : if !parent_suggestion. is_empty ( ) {
975
+ candidates : if !parent_suggestion. is_empty ( ) {
947
976
Some ( parent_suggestion)
948
977
} else {
949
978
None
0 commit comments