1212
1313use cstore:: { self , CStore , CrateSource , MetadataBlob } ;
1414use loader:: { self , CratePaths } ;
15+ use macro_import;
1516use schema:: CrateRoot ;
1617
1718use rustc:: hir:: def_id:: { CrateNum , DefIndex } ;
1819use rustc:: hir:: svh:: Svh ;
19- use rustc:: dep_graph:: { DepGraph , DepNode } ;
2020use rustc:: session:: { config, Session } ;
2121use rustc:: session:: config:: PanicStrategy ;
2222use rustc:: session:: search_paths:: PathKind ;
23+ use rustc:: middle;
2324use rustc:: middle:: cstore:: { CrateStore , validate_crate_name, ExternCrate } ;
2425use rustc:: util:: nodemap:: { FnvHashMap , FnvHashSet } ;
2526use rustc:: hir:: map as hir_map;
@@ -31,20 +32,18 @@ use std::rc::Rc;
3132use std:: fs;
3233
3334use syntax:: ast;
35+ use syntax:: ext:: base:: LoadedMacro ;
3436use syntax:: abi:: Abi ;
3537use syntax:: parse;
3638use syntax:: attr;
3739use syntax:: parse:: token:: InternedString ;
38- use syntax:: visit;
3940use syntax_pos:: { self , Span , mk_sp} ;
4041use log;
4142
42- struct LocalCrateReader < ' a > {
43- sess : & ' a Session ,
43+ pub struct CrateLoader < ' a > {
44+ pub sess : & ' a Session ,
45+ pub creader : CrateReader < ' a > ,
4446 cstore : & ' a CStore ,
45- creader : CrateReader < ' a > ,
46- krate : & ' a ast:: Crate ,
47- definitions : & ' a hir_map:: Definitions ,
4847}
4948
5049pub struct CrateReader < ' a > {
@@ -56,13 +55,6 @@ pub struct CrateReader<'a> {
5655 local_crate_config : ast:: CrateConfig ,
5756}
5857
59- impl < ' a > visit:: Visitor for LocalCrateReader < ' a > {
60- fn visit_item ( & mut self , a : & ast:: Item ) {
61- self . process_item ( a) ;
62- visit:: walk_item ( self , a) ;
63- }
64- }
65-
6658fn dump_crates ( cstore : & CStore ) {
6759 info ! ( "resolved crates:" ) ;
6860 cstore. iter_crate_data_origins ( |_, data, opt_source| {
@@ -918,98 +910,22 @@ impl ExtensionCrate {
918910 }
919911}
920912
921- impl < ' a > LocalCrateReader < ' a > {
922- fn new ( sess : & ' a Session ,
923- cstore : & ' a CStore ,
924- defs : & ' a hir_map:: Definitions ,
925- krate : & ' a ast:: Crate ,
926- local_crate_name : & str )
927- -> LocalCrateReader < ' a > {
928- LocalCrateReader {
913+ impl < ' a > CrateLoader < ' a > {
914+ pub fn new ( sess : & ' a Session , cstore : & ' a CStore , krate : & ast:: Crate , crate_name : & str )
915+ -> Self {
916+ let loader = CrateLoader {
929917 sess : sess,
930918 cstore : cstore,
931- creader : CrateReader :: new ( sess, cstore, local_crate_name, krate. config . clone ( ) ) ,
932- krate : krate,
933- definitions : defs,
934- }
935- }
936-
937- // Traverses an AST, reading all the information about use'd crates and
938- // extern libraries necessary for later resolving, typechecking, linking,
939- // etc.
940- fn read_crates ( & mut self , dep_graph : & DepGraph ) {
941- let _task = dep_graph. in_task ( DepNode :: CrateReader ) ;
942-
943- self . process_crate ( self . krate ) ;
944- visit:: walk_crate ( self , self . krate ) ;
945- self . creader . inject_allocator_crate ( ) ;
946- self . creader . inject_panic_runtime ( self . krate ) ;
947-
948- if log_enabled ! ( log:: INFO ) {
949- dump_crates ( & self . cstore ) ;
950- }
951-
952- for & ( ref name, kind) in & self . sess . opts . libs {
953- register_native_lib ( self . sess , self . cstore , None , name. clone ( ) , kind) ;
954- }
955- self . creader . register_statically_included_foreign_items ( ) ;
956- }
919+ creader : CrateReader :: new ( sess, cstore, crate_name, krate. config . clone ( ) ) ,
920+ } ;
957921
958- fn process_crate ( & self , c : & ast:: Crate ) {
959- for a in c. attrs . iter ( ) . filter ( |m| m. name ( ) == "link_args" ) {
960- if let Some ( ref linkarg) = a. value_str ( ) {
961- self . cstore . add_used_link_args ( & linkarg) ;
922+ for attr in krate. attrs . iter ( ) . filter ( |m| m. name ( ) == "link_args" ) {
923+ if let Some ( ref linkarg) = attr. value_str ( ) {
924+ loader. cstore . add_used_link_args ( & linkarg) ;
962925 }
963926 }
964- }
965927
966- fn process_item ( & mut self , i : & ast:: Item ) {
967- match i. node {
968- ast:: ItemKind :: ExternCrate ( _) => {
969- // If this `extern crate` item has `#[macro_use]` then we can
970- // safely skip it. These annotations were processed during macro
971- // expansion and are already loaded (if necessary) into our
972- // crate store.
973- //
974- // Note that it's important we *don't* fall through below as
975- // some `#[macro_use]` crate are explicitly not linked (e.g.
976- // macro crates) so we want to ensure we avoid `resolve_crate`
977- // with those.
978- if attr:: contains_name ( & i. attrs , "macro_use" ) {
979- if self . cstore . was_used_for_derive_macros ( i) {
980- return
981- }
982- }
983-
984- if let Some ( info) = self . creader . extract_crate_info ( i) {
985- if !info. should_link {
986- return ;
987- }
988- let ( cnum, ..) = self . creader . resolve_crate ( & None ,
989- & info. ident ,
990- & info. name ,
991- None ,
992- i. span ,
993- PathKind :: Crate ,
994- true ) ;
995-
996- let def_id = self . definitions . opt_local_def_id ( i. id ) . unwrap ( ) ;
997- let len = self . definitions . def_path ( def_id. index ) . data . len ( ) ;
998-
999- self . creader . update_extern_crate ( cnum,
1000- ExternCrate {
1001- def_id : def_id,
1002- span : i. span ,
1003- direct : true ,
1004- path_len : len,
1005- } ,
1006- & mut FnvHashSet ( ) ) ;
1007- self . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
1008- }
1009- }
1010- ast:: ItemKind :: ForeignMod ( ref fm) => self . process_foreign_mod ( i, fm) ,
1011- _ => { }
1012- }
928+ loader
1013929 }
1014930
1015931 fn process_foreign_mod ( & mut self , i : & ast:: Item , fm : & ast:: ForeignMod ) {
@@ -1073,13 +989,62 @@ impl<'a> LocalCrateReader<'a> {
1073989 }
1074990}
1075991
1076- /// Traverses an AST, reading all the information about use'd crates and extern
1077- /// libraries necessary for later resolving, typechecking, linking, etc.
1078- pub fn read_local_crates ( sess : & Session ,
1079- cstore : & CStore ,
1080- defs : & hir_map:: Definitions ,
1081- krate : & ast:: Crate ,
1082- local_crate_name : & str ,
1083- dep_graph : & DepGraph ) {
1084- LocalCrateReader :: new ( sess, cstore, defs, krate, local_crate_name) . read_crates ( dep_graph)
992+ impl < ' a > middle:: cstore:: CrateLoader for CrateLoader < ' a > {
993+ fn postprocess ( & mut self , krate : & ast:: Crate ) {
994+ self . creader . inject_allocator_crate ( ) ;
995+ self . creader . inject_panic_runtime ( krate) ;
996+
997+ if log_enabled ! ( log:: INFO ) {
998+ dump_crates ( & self . cstore ) ;
999+ }
1000+
1001+ for & ( ref name, kind) in & self . sess . opts . libs {
1002+ register_native_lib ( self . sess , self . cstore , None , name. clone ( ) , kind) ;
1003+ }
1004+ self . creader . register_statically_included_foreign_items ( ) ;
1005+ }
1006+
1007+ fn process_item ( & mut self , item : & ast:: Item , definitions : & hir_map:: Definitions ) {
1008+ match item. node {
1009+ ast:: ItemKind :: ExternCrate ( _) => { }
1010+ ast:: ItemKind :: ForeignMod ( ref fm) => return self . process_foreign_mod ( item, fm) ,
1011+ _ => return ,
1012+ }
1013+
1014+ // If this `extern crate` item has `#[macro_use]` then we can safely skip it.
1015+ // These annotations were processed during macro expansion and are already loaded
1016+ // (if necessary) into our crate store.
1017+ //
1018+ // Note that it's important we *don't* fall through below as some `#[macro_use]`
1019+ // crates are explicitly not linked (e.g. macro crates) so we want to ensure
1020+ // we avoid `resolve_crate` with those.
1021+ if attr:: contains_name ( & item. attrs , "macro_use" ) {
1022+ if self . cstore . was_used_for_derive_macros ( item) {
1023+ return
1024+ }
1025+ }
1026+
1027+ if let Some ( info) = self . creader . extract_crate_info ( item) {
1028+ if !info. should_link {
1029+ return ;
1030+ }
1031+
1032+ let ( cnum, ..) = self . creader . resolve_crate (
1033+ & None , & info. ident , & info. name , None , item. span , PathKind :: Crate , true ,
1034+ ) ;
1035+
1036+ let def_id = definitions. opt_local_def_id ( item. id ) . unwrap ( ) ;
1037+ let len = definitions. def_path ( def_id. index ) . data . len ( ) ;
1038+
1039+ let extern_crate =
1040+ ExternCrate { def_id : def_id, span : item. span , direct : true , path_len : len } ;
1041+ self . creader . update_extern_crate ( cnum, extern_crate, & mut FnvHashSet ( ) ) ;
1042+
1043+ self . cstore . add_extern_mod_stmt_cnum ( info. id , cnum) ;
1044+ }
1045+ }
1046+
1047+ fn load_macros ( & mut self , extern_crate : & ast:: Item , allows_macros : bool ) -> Vec < LoadedMacro > {
1048+ macro_import:: load_macros ( self , extern_crate, allows_macros)
1049+ }
10851050}
0 commit comments