@@ -683,75 +683,16 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
683
683
}
684
684
685
685
ItemKind :: ExternCrate ( orig_name) => {
686
- let module = if orig_name. is_none ( ) && ident. name == kw:: SelfLower {
687
- self . r
688
- . session
689
- . struct_span_err ( item. span , "`extern crate self;` requires renaming" )
690
- . span_suggestion (
691
- item. span ,
692
- "try" ,
693
- "extern crate self as name;" . into ( ) ,
694
- Applicability :: HasPlaceholders ,
695
- )
696
- . emit ( ) ;
697
- return ;
698
- } else if orig_name == Some ( kw:: SelfLower ) {
699
- self . r . graph_root
700
- } else {
701
- let crate_id = self . r . crate_loader . process_extern_crate (
702
- item,
703
- & self . r . definitions ,
704
- local_def_id,
705
- ) ;
706
- self . r . extern_crate_map . insert ( local_def_id, crate_id) ;
707
- self . r . expect_module ( crate_id. as_def_id ( ) )
708
- } ;
709
-
710
- let used = self . process_macro_use_imports ( item, module) ;
711
- let binding =
712
- ( module, ty:: Visibility :: Public , sp, expansion) . to_name_binding ( self . r . arenas ) ;
713
- let import = self . r . arenas . alloc_import ( Import {
714
- kind : ImportKind :: ExternCrate { source : orig_name, target : ident } ,
715
- root_id : item. id ,
716
- id : item. id ,
717
- parent_scope : self . parent_scope ,
718
- imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
719
- has_attributes : !item. attrs . is_empty ( ) ,
720
- use_span_with_attributes : item. span_with_attributes ( ) ,
721
- use_span : item. span ,
722
- root_span : item. span ,
723
- span : item. span ,
724
- module_path : Vec :: new ( ) ,
725
- vis : Cell :: new ( vis) ,
726
- used : Cell :: new ( used) ,
727
- } ) ;
728
- self . r . potentially_unused_imports . push ( import) ;
729
- let imported_binding = self . r . import ( binding, import) ;
730
- if ptr:: eq ( parent, self . r . graph_root ) {
731
- if let Some ( entry) = self . r . extern_prelude . get ( & ident. normalize_to_macros_2_0 ( ) )
732
- {
733
- if expansion != LocalExpnId :: ROOT
734
- && orig_name. is_some ( )
735
- && entry. extern_crate_item . is_none ( )
736
- {
737
- let msg = "macro-expanded `extern crate` items cannot \
738
- shadow names passed with `--extern`";
739
- self . r . session . span_err ( item. span , msg) ;
740
- }
741
- }
742
- let entry =
743
- self . r . extern_prelude . entry ( ident. normalize_to_macros_2_0 ( ) ) . or_insert (
744
- ExternPreludeEntry {
745
- extern_crate_item : None ,
746
- introduced_by_item : true ,
747
- } ,
748
- ) ;
749
- entry. extern_crate_item = Some ( imported_binding) ;
750
- if orig_name. is_some ( ) {
751
- entry. introduced_by_item = true ;
752
- }
753
- }
754
- self . r . define ( parent, ident, TypeNS , imported_binding) ;
686
+ self . build_reduced_graph_for_extern_crate (
687
+ orig_name,
688
+ ident,
689
+ item,
690
+ local_def_id,
691
+ sp,
692
+ expansion,
693
+ vis,
694
+ parent,
695
+ ) ;
755
696
}
756
697
757
698
ItemKind :: Mod ( ..) => {
@@ -889,6 +830,79 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
889
830
}
890
831
}
891
832
833
+ fn build_reduced_graph_for_extern_crate (
834
+ & mut self ,
835
+ orig_name : Option < Symbol > ,
836
+ ident : Ident ,
837
+ item : & Item ,
838
+ local_def_id : LocalDefId ,
839
+ sp : Span ,
840
+ expansion : LocalExpnId ,
841
+ vis : ty:: Visibility ,
842
+ parent : Module < ' a > ,
843
+ ) {
844
+ let module = if orig_name. is_none ( ) && ident. name == kw:: SelfLower {
845
+ self . r
846
+ . session
847
+ . struct_span_err ( item. span , "`extern crate self;` requires renaming" )
848
+ . span_suggestion (
849
+ item. span ,
850
+ "try" ,
851
+ "extern crate self as name;" . into ( ) ,
852
+ Applicability :: HasPlaceholders ,
853
+ )
854
+ . emit ( ) ;
855
+ return ;
856
+ } else if orig_name == Some ( kw:: SelfLower ) {
857
+ self . r . graph_root
858
+ } else {
859
+ let crate_id =
860
+ self . r . crate_loader . process_extern_crate ( item, & self . r . definitions , local_def_id) ;
861
+ self . r . extern_crate_map . insert ( local_def_id, crate_id) ;
862
+ self . r . expect_module ( crate_id. as_def_id ( ) )
863
+ } ;
864
+ let used = self . process_macro_use_imports ( item, module) ;
865
+ let binding =
866
+ ( module, ty:: Visibility :: Public , sp, expansion) . to_name_binding ( self . r . arenas ) ;
867
+ let import = self . r . arenas . alloc_import ( Import {
868
+ kind : ImportKind :: ExternCrate { source : orig_name, target : ident } ,
869
+ root_id : item. id ,
870
+ id : item. id ,
871
+ parent_scope : self . parent_scope ,
872
+ imported_module : Cell :: new ( Some ( ModuleOrUniformRoot :: Module ( module) ) ) ,
873
+ has_attributes : !item. attrs . is_empty ( ) ,
874
+ use_span_with_attributes : item. span_with_attributes ( ) ,
875
+ use_span : item. span ,
876
+ root_span : item. span ,
877
+ span : item. span ,
878
+ module_path : Vec :: new ( ) ,
879
+ vis : Cell :: new ( vis) ,
880
+ used : Cell :: new ( used) ,
881
+ } ) ;
882
+ self . r . potentially_unused_imports . push ( import) ;
883
+ let imported_binding = self . r . import ( binding, import) ;
884
+ if ptr:: eq ( parent, self . r . graph_root ) {
885
+ if let Some ( entry) = self . r . extern_prelude . get ( & ident. normalize_to_macros_2_0 ( ) ) {
886
+ if expansion != LocalExpnId :: ROOT
887
+ && orig_name. is_some ( )
888
+ && entry. extern_crate_item . is_none ( )
889
+ {
890
+ let msg = "macro-expanded `extern crate` items cannot \
891
+ shadow names passed with `--extern`";
892
+ self . r . session . span_err ( item. span , msg) ;
893
+ }
894
+ }
895
+ let entry = self . r . extern_prelude . entry ( ident. normalize_to_macros_2_0 ( ) ) . or_insert (
896
+ ExternPreludeEntry { extern_crate_item : None , introduced_by_item : true } ,
897
+ ) ;
898
+ entry. extern_crate_item = Some ( imported_binding) ;
899
+ if orig_name. is_some ( ) {
900
+ entry. introduced_by_item = true ;
901
+ }
902
+ }
903
+ self . r . define ( parent, ident, TypeNS , imported_binding) ;
904
+ }
905
+
892
906
/// Constructs the reduced graph for one foreign item.
893
907
fn build_reduced_graph_for_foreign_item ( & mut self , item : & ForeignItem ) {
894
908
let local_def_id = self . r . local_def_id ( item. id ) ;
0 commit comments