12
12
13
13
use cstore:: { self , CStore , CrateSource , MetadataBlob } ;
14
14
use loader:: { self , CratePaths } ;
15
+ use macro_import;
15
16
use schema:: CrateRoot ;
16
17
17
18
use rustc:: hir:: def_id:: { CrateNum , DefIndex } ;
18
19
use rustc:: hir:: svh:: Svh ;
19
- use rustc:: dep_graph:: { DepGraph , DepNode } ;
20
20
use rustc:: session:: { config, Session } ;
21
21
use rustc:: session:: config:: PanicStrategy ;
22
22
use rustc:: session:: search_paths:: PathKind ;
23
+ use rustc:: middle;
23
24
use rustc:: middle:: cstore:: { CrateStore , validate_crate_name, ExternCrate } ;
24
25
use rustc:: util:: nodemap:: { FnvHashMap , FnvHashSet } ;
25
26
use rustc:: hir:: map as hir_map;
@@ -31,20 +32,18 @@ use std::rc::Rc;
31
32
use std:: fs;
32
33
33
34
use syntax:: ast;
35
+ use syntax:: ext:: base:: LoadedMacro ;
34
36
use syntax:: abi:: Abi ;
35
37
use syntax:: parse;
36
38
use syntax:: attr;
37
39
use syntax:: parse:: token:: InternedString ;
38
- use syntax:: visit;
39
40
use syntax_pos:: { self , Span , mk_sp} ;
40
41
use log;
41
42
42
- struct LocalCrateReader < ' a > {
43
- sess : & ' a Session ,
43
+ pub struct CrateLoader < ' a > {
44
+ pub sess : & ' a Session ,
45
+ pub creader : CrateReader < ' a > ,
44
46
cstore : & ' a CStore ,
45
- creader : CrateReader < ' a > ,
46
- krate : & ' a ast:: Crate ,
47
- definitions : & ' a hir_map:: Definitions ,
48
47
}
49
48
50
49
pub struct CrateReader < ' a > {
@@ -56,13 +55,6 @@ pub struct CrateReader<'a> {
56
55
local_crate_config : ast:: CrateConfig ,
57
56
}
58
57
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
-
66
58
fn dump_crates ( cstore : & CStore ) {
67
59
info ! ( "resolved crates:" ) ;
68
60
cstore. iter_crate_data_origins ( |_, data, opt_source| {
@@ -918,98 +910,22 @@ impl ExtensionCrate {
918
910
}
919
911
}
920
912
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 {
929
917
sess : sess,
930
918
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
+ } ;
957
921
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) ;
962
925
}
963
926
}
964
- }
965
927
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
1013
929
}
1014
930
1015
931
fn process_foreign_mod ( & mut self , i : & ast:: Item , fm : & ast:: ForeignMod ) {
@@ -1073,13 +989,62 @@ impl<'a> LocalCrateReader<'a> {
1073
989
}
1074
990
}
1075
991
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
+ }
1085
1050
}
0 commit comments