@@ -162,6 +162,39 @@ impl<'a> std::fmt::Debug for CrateDump<'a> {
162
162
}
163
163
}
164
164
165
+ /// Reason that a crate is being sourced as a dependency.
166
+ #[ derive( Clone , Copy ) ]
167
+ enum CrateOrigin < ' a > {
168
+ /// This crate was a dependency of another crate.
169
+ IndirectDependency {
170
+ dep_root : & ' a CratePaths ,
171
+ /// Dependency info about this crate.
172
+ dep : & ' a CrateDep ,
173
+ } ,
174
+ /// Injected by `rustc`.
175
+ Injected ,
176
+ /// Provided by `extern crate foo` or as part of the extern prelude.
177
+ Extern ,
178
+ }
179
+
180
+ impl < ' a > CrateOrigin < ' a > {
181
+ /// Return the dependency root, if any.
182
+ fn dep_root ( & self ) -> Option < & ' a CratePaths > {
183
+ match self {
184
+ CrateOrigin :: IndirectDependency { dep_root, .. } => Some ( dep_root) ,
185
+ _ => None ,
186
+ }
187
+ }
188
+
189
+ /// Return dependency information, if any.
190
+ fn dep ( & self ) -> Option < & ' a CrateDep > {
191
+ match self {
192
+ CrateOrigin :: IndirectDependency { dep, .. } => Some ( dep) ,
193
+ _ => None ,
194
+ }
195
+ }
196
+ }
197
+
165
198
impl CStore {
166
199
pub fn from_tcx ( tcx : TyCtxt < ' _ > ) -> FreezeReadGuard < ' _ , CStore > {
167
200
FreezeReadGuard :: map ( tcx. untracked ( ) . cstore . read ( ) , |cstore| {
@@ -497,20 +530,24 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
497
530
& self ,
498
531
name : Symbol ,
499
532
private_dep : Option < bool > ,
500
- dep_root : Option < & CratePaths > ,
533
+ origin : CrateOrigin < ' _ > ,
501
534
) -> bool {
502
535
// Standard library crates are never private.
503
536
if STDLIB_STABLE_CRATES . contains ( & name) {
504
537
tracing:: info!( "returning false for {name} is private" ) ;
505
538
return false ;
506
539
}
507
540
541
+ if matches ! ( origin, CrateOrigin :: Injected ) {
542
+ return true ;
543
+ }
544
+
508
545
let extern_private = self . sess . opts . externs . get ( name. as_str ( ) ) . map ( |e| e. is_private_dep ) ;
509
546
510
547
// Any descendants of `std` should be private. These crates are usually not marked
511
548
// private in metadata, so we ignore that field.
512
549
if extern_private. is_none ( )
513
- && let Some ( dep) = dep_root
550
+ && let Some ( dep) = origin . dep_root ( )
514
551
&& STDLIB_STABLE_CRATES . contains ( & dep. name )
515
552
{
516
553
return true ;
@@ -528,7 +565,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
528
565
fn register_crate (
529
566
& mut self ,
530
567
host_lib : Option < Library > ,
531
- dep_root : Option < & CratePaths > ,
568
+ origin : CrateOrigin < ' _ > ,
532
569
lib : Library ,
533
570
dep_kind : CrateDepKind ,
534
571
name : Symbol ,
@@ -540,7 +577,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
540
577
let Library { source, metadata } = lib;
541
578
let crate_root = metadata. get_root ( ) ;
542
579
let host_hash = host_lib. as_ref ( ) . map ( |lib| lib. metadata . get_root ( ) . hash ( ) ) ;
543
- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
580
+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
544
581
545
582
// Claim this crate number and cache it
546
583
let feed = self . cstore . intern_stable_crate_id ( & crate_root, self . tcx ) ?;
@@ -556,7 +593,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
556
593
// Maintain a reference to the top most crate.
557
594
// Stash paths for top-most crate locally if necessary.
558
595
let crate_paths;
559
- let dep_root = if let Some ( dep_root) = dep_root {
596
+ let dep_root = if let Some ( dep_root) = origin . dep_root ( ) {
560
597
dep_root
561
598
} else {
562
599
crate_paths = CratePaths :: new ( crate_root. name ( ) , source. clone ( ) ) ;
@@ -664,17 +701,19 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
664
701
name : Symbol ,
665
702
span : Span ,
666
703
dep_kind : CrateDepKind ,
704
+ origin : CrateOrigin < ' _ > ,
667
705
) -> Option < CrateNum > {
668
706
self . used_extern_options . insert ( name) ;
669
- match self . maybe_resolve_crate ( name, dep_kind, None ) {
707
+ match self . maybe_resolve_crate ( name, dep_kind, origin ) {
670
708
Ok ( cnum) => {
671
709
self . cstore . set_used_recursively ( cnum) ;
672
710
Some ( cnum)
673
711
}
674
712
Err ( err) => {
675
713
debug ! ( "failed to resolve crate {} {:?}" , name, dep_kind) ;
676
- let missing_core =
677
- self . maybe_resolve_crate ( sym:: core, CrateDepKind :: Explicit , None ) . is_err ( ) ;
714
+ let missing_core = self
715
+ . maybe_resolve_crate ( sym:: core, CrateDepKind :: Explicit , CrateOrigin :: Extern )
716
+ . is_err ( ) ;
678
717
err. report ( self . sess , span, missing_core) ;
679
718
None
680
719
}
@@ -685,15 +724,15 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
685
724
& ' b mut self ,
686
725
name : Symbol ,
687
726
mut dep_kind : CrateDepKind ,
688
- dep_of : Option < ( & ' b CratePaths , & ' b CrateDep ) > ,
727
+ origin : CrateOrigin < ' b > ,
689
728
) -> Result < CrateNum , CrateError > {
690
729
info ! ( "resolving crate `{}`" , name) ;
691
730
if !name. as_str ( ) . is_ascii ( ) {
692
731
return Err ( CrateError :: NonAsciiName ( name) ) ;
693
732
}
694
733
695
- let dep_root = dep_of . map ( |d| d . 0 ) ;
696
- let dep = dep_of . map ( |d| d . 1 ) ;
734
+ let dep_root = origin . dep_root ( ) ;
735
+ let dep = origin . dep ( ) ;
697
736
let hash = dep. map ( |d| d. hash ) ;
698
737
let host_hash = dep. map ( |d| d. host_hash ) . flatten ( ) ;
699
738
let extra_filename = dep. map ( |d| & d. extra_filename [ ..] ) ;
@@ -736,7 +775,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
736
775
// not specified by `--extern` on command line parameters, it may be
737
776
// `private-dependency` when `register_crate` is called for the first time. Then it must be updated to
738
777
// `public-dependency` here.
739
- let private_dep = self . is_private_dep ( name, private_dep, dep_root ) ;
778
+ let private_dep = self . is_private_dep ( name, private_dep, origin ) ;
740
779
let data = self . cstore . get_crate_data_mut ( cnum) ;
741
780
if data. is_proc_macro_crate ( ) {
742
781
dep_kind = CrateDepKind :: MacrosOnly ;
@@ -747,7 +786,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
747
786
}
748
787
( LoadResult :: Loaded ( library) , host_library) => {
749
788
info ! ( "register newly loaded library for `{}`" , name) ;
750
- self . register_crate ( host_library, dep_root , library, dep_kind, name, private_dep)
789
+ self . register_crate ( host_library, origin , library, dep_kind, name, private_dep)
751
790
}
752
791
_ => panic ! ( ) ,
753
792
}
@@ -823,7 +862,11 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
823
862
CrateDepKind :: MacrosOnly => CrateDepKind :: MacrosOnly ,
824
863
_ => dep. kind ,
825
864
} ;
826
- let cnum = self . maybe_resolve_crate ( dep. name , dep_kind, Some ( ( dep_root, & dep) ) ) ?;
865
+ let cnum = self . maybe_resolve_crate (
866
+ dep. name ,
867
+ dep_kind,
868
+ CrateOrigin :: IndirectDependency { dep_root, dep : & dep } ,
869
+ ) ?;
827
870
crate_num_map. push ( cnum) ;
828
871
}
829
872
@@ -917,7 +960,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
917
960
} ;
918
961
info ! ( "panic runtime not found -- loading {}" , name) ;
919
962
920
- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
963
+ let Some ( cnum) =
964
+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
965
+ else {
921
966
return ;
922
967
} ;
923
968
let data = self . cstore . get_crate_data ( cnum) ;
@@ -946,7 +991,9 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
946
991
info ! ( "loading profiler" ) ;
947
992
948
993
let name = Symbol :: intern ( & self . sess . opts . unstable_opts . profiler_runtime ) ;
949
- let Some ( cnum) = self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit ) else {
994
+ let Some ( cnum) =
995
+ self . resolve_crate ( name, DUMMY_SP , CrateDepKind :: Implicit , CrateOrigin :: Injected )
996
+ else {
950
997
return ;
951
998
} ;
952
999
let data = self . cstore . get_crate_data ( cnum) ;
@@ -1059,7 +1106,12 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1059
1106
if entry. force {
1060
1107
let name_interned = Symbol :: intern ( name) ;
1061
1108
if !self . used_extern_options . contains ( & name_interned) {
1062
- self . resolve_crate ( name_interned, DUMMY_SP , CrateDepKind :: Explicit ) ;
1109
+ self . resolve_crate (
1110
+ name_interned,
1111
+ DUMMY_SP ,
1112
+ CrateDepKind :: Explicit ,
1113
+ CrateOrigin :: Extern ,
1114
+ ) ;
1063
1115
}
1064
1116
}
1065
1117
}
@@ -1185,6 +1237,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1185
1237
info ! ( "{:?}" , CrateDump ( self . cstore) ) ;
1186
1238
}
1187
1239
1240
+ /// Process an `extern crate foo` AST node.
1188
1241
pub fn process_extern_crate (
1189
1242
& mut self ,
1190
1243
item : & ast:: Item ,
@@ -1210,7 +1263,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1210
1263
CrateDepKind :: Explicit
1211
1264
} ;
1212
1265
1213
- let cnum = self . resolve_crate ( name, item. span , dep_kind) ?;
1266
+ let cnum = self . resolve_crate ( name, item. span , dep_kind, CrateOrigin :: Extern ) ?;
1214
1267
1215
1268
let path_len = definitions. def_path ( def_id) . data . len ( ) ;
1216
1269
self . cstore . update_extern_crate (
@@ -1229,7 +1282,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1229
1282
}
1230
1283
1231
1284
pub fn process_path_extern ( & mut self , name : Symbol , span : Span ) -> Option < CrateNum > {
1232
- let cnum = self . resolve_crate ( name, span, CrateDepKind :: Explicit ) ?;
1285
+ let cnum = self . resolve_crate ( name, span, CrateDepKind :: Explicit , CrateOrigin :: Extern ) ?;
1233
1286
1234
1287
self . cstore . update_extern_crate (
1235
1288
cnum,
@@ -1246,7 +1299,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
1246
1299
}
1247
1300
1248
1301
pub fn maybe_process_path_extern ( & mut self , name : Symbol ) -> Option < CrateNum > {
1249
- self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , None ) . ok ( )
1302
+ self . maybe_resolve_crate ( name, CrateDepKind :: Explicit , CrateOrigin :: Extern ) . ok ( )
1250
1303
}
1251
1304
}
1252
1305
0 commit comments