@@ -813,8 +813,8 @@ impl Module {
813
813
def : Option < Def > ,
814
814
external : bool ,
815
815
is_public : bool )
816
- -> Module {
817
- Module {
816
+ -> Rc < Module > {
817
+ Rc :: new ( Module {
818
818
parent_link : parent_link,
819
819
def : Cell :: new ( def) ,
820
820
is_public : is_public,
@@ -828,7 +828,7 @@ impl Module {
828
828
pub_glob_count : Cell :: new ( 0 ) ,
829
829
resolved_import_count : Cell :: new ( 0 ) ,
830
830
populated : Cell :: new ( !external) ,
831
- }
831
+ } )
832
832
}
833
833
834
834
fn def_id ( & self ) -> Option < DefId > {
@@ -971,19 +971,27 @@ impl NameBinding {
971
971
}
972
972
}
973
973
974
- fn and_then < T , F : Fn ( & NsDef ) -> Option < T > > ( & self , f : F ) -> Option < T > {
975
- self . borrow ( ) . as_ref ( ) . and_then ( f )
974
+ fn borrow ( & self ) -> :: std :: cell :: Ref < Option < NsDef > > {
975
+ self . 0 . borrow ( )
976
976
}
977
977
978
- fn borrow ( & self ) -> :: std:: cell:: Ref < Option < NsDef > > { self . 0 . borrow ( ) }
979
-
980
978
// Lifted versions of the NsDef methods and fields
981
- fn def ( & self ) -> Option < Def > { self . and_then ( NsDef :: def) }
982
- fn module ( & self ) -> Option < Rc < Module > > { self . and_then ( NsDef :: module) }
983
- fn span ( & self ) -> Option < Span > { self . and_then ( |def| def. span ) }
984
- fn modifiers ( & self ) -> Option < DefModifiers > { self . and_then ( |def| Some ( def. modifiers ) ) }
979
+ fn def ( & self ) -> Option < Def > {
980
+ self . borrow ( ) . as_ref ( ) . and_then ( NsDef :: def)
981
+ }
982
+ fn module ( & self ) -> Option < Rc < Module > > {
983
+ self . borrow ( ) . as_ref ( ) . and_then ( NsDef :: module)
984
+ }
985
+ fn span ( & self ) -> Option < Span > {
986
+ self . borrow ( ) . as_ref ( ) . and_then ( |def| def. span )
987
+ }
988
+ fn modifiers ( & self ) -> Option < DefModifiers > {
989
+ self . borrow ( ) . as_ref ( ) . and_then ( |def| Some ( def. modifiers ) )
990
+ }
985
991
986
- fn defined ( & self ) -> bool { self . borrow ( ) . is_some ( ) }
992
+ fn defined ( & self ) -> bool {
993
+ self . borrow ( ) . is_some ( )
994
+ }
987
995
988
996
fn defined_with ( & self , modifiers : DefModifiers ) -> bool {
989
997
self . modifiers ( ) . map ( |m| m. contains ( modifiers) ) . unwrap_or ( false )
@@ -1030,14 +1038,8 @@ impl NameBindings {
1030
1038
}
1031
1039
1032
1040
/// Creates a new module in this set of name bindings.
1033
- fn define_module ( & self ,
1034
- parent_link : ParentLink ,
1035
- def : Option < Def > ,
1036
- external : bool ,
1037
- is_public : bool ,
1038
- sp : Span ) {
1039
- let module = Module :: new ( parent_link, def, external, is_public) ;
1040
- self . type_ns . set ( NsDef :: create_from_module ( Rc :: new ( module) , Some ( sp) ) ) ;
1041
+ fn define_module ( & self , module : Rc < Module > , sp : Span ) {
1042
+ self . type_ns . set ( NsDef :: create_from_module ( module, Some ( sp) ) ) ;
1041
1043
}
1042
1044
1043
1045
/// Records a type definition.
@@ -1051,20 +1053,6 @@ impl NameBindings {
1051
1053
debug ! ( "defining value for def {:?} with modifiers {:?}" , def, modifiers) ;
1052
1054
self . value_ns . set ( NsDef :: create_from_def ( def, modifiers, Some ( sp) ) ) ;
1053
1055
}
1054
-
1055
- /// Returns the module node if applicable.
1056
- fn get_module_if_available ( & self ) -> Option < Rc < Module > > { self . type_ns . module ( ) }
1057
-
1058
- /// Returns the module node. Panics if this node does not have a module
1059
- /// definition.
1060
- fn get_module ( & self ) -> Rc < Module > {
1061
- match self . get_module_if_available ( ) {
1062
- None => {
1063
- panic ! ( "get_module called on a node with no module definition!" )
1064
- }
1065
- Some ( module_def) => module_def,
1066
- }
1067
- }
1068
1056
}
1069
1057
1070
1058
/// Interns the names of the primitive types.
@@ -1106,7 +1094,7 @@ pub struct Resolver<'a, 'tcx: 'a> {
1106
1094
1107
1095
ast_map : & ' a hir_map:: Map < ' tcx > ,
1108
1096
1109
- graph_root : NameBindings ,
1097
+ graph_root : Rc < Module > ,
1110
1098
1111
1099
trait_item_map : FnvHashMap < ( Name , DefId ) , DefId > ,
1112
1100
@@ -1173,19 +1161,10 @@ enum FallbackChecks {
1173
1161
impl < ' a , ' tcx > Resolver < ' a , ' tcx > {
1174
1162
fn new ( session : & ' a Session ,
1175
1163
ast_map : & ' a hir_map:: Map < ' tcx > ,
1176
- crate_span : Span ,
1177
1164
make_glob_map : MakeGlobMap )
1178
1165
-> Resolver < ' a , ' tcx > {
1179
- let graph_root = NameBindings :: new ( ) ;
1180
-
1181
1166
let root_def_id = ast_map. local_def_id ( CRATE_NODE_ID ) ;
1182
- graph_root. define_module ( NoParentLink ,
1183
- Some ( DefMod ( root_def_id) ) ,
1184
- false ,
1185
- true ,
1186
- crate_span) ;
1187
-
1188
- let current_module = graph_root. get_module ( ) ;
1167
+ let graph_root = Module :: new ( NoParentLink , Some ( DefMod ( root_def_id) ) , false , true ) ;
1189
1168
1190
1169
Resolver {
1191
1170
session : session,
@@ -1194,14 +1173,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1194
1173
1195
1174
// The outermost module has def ID 0; this is not reflected in the
1196
1175
// AST.
1197
- graph_root : graph_root,
1176
+ graph_root : graph_root. clone ( ) ,
1198
1177
1199
1178
trait_item_map : FnvHashMap ( ) ,
1200
1179
structs : FnvHashMap ( ) ,
1201
1180
1202
1181
unresolved_imports : 0 ,
1203
1182
1204
- current_module : current_module ,
1183
+ current_module : graph_root ,
1205
1184
value_ribs : Vec :: new ( ) ,
1206
1185
type_ribs : Vec :: new ( ) ,
1207
1186
label_ribs : Vec :: new ( ) ,
@@ -1441,7 +1420,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1441
1420
DontUseLexicalScope => {
1442
1421
// This is a crate-relative path. We will start the
1443
1422
// resolution process at index zero.
1444
- search_module = self . graph_root . get_module ( ) ;
1423
+ search_module = self . graph_root . clone ( ) ;
1445
1424
start_index = 0 ;
1446
1425
last_private = LastMod ( AllPublic ) ;
1447
1426
}
@@ -1792,7 +1771,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1792
1771
build_reduced_graph:: populate_module_if_necessary ( self , & module_) ;
1793
1772
1794
1773
for ( _, child_node) in module_. children . borrow ( ) . iter ( ) {
1795
- match child_node. get_module_if_available ( ) {
1774
+ match child_node. type_ns . module ( ) {
1796
1775
None => {
1797
1776
// Continue.
1798
1777
}
@@ -1845,7 +1824,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
1845
1824
module_to_string( & * orig_module) ) ;
1846
1825
}
1847
1826
Some ( name_bindings) => {
1848
- match ( * name_bindings) . get_module_if_available ( ) {
1827
+ match name_bindings. type_ns . module ( ) {
1849
1828
None => {
1850
1829
debug ! ( "!!! (with scope) didn't find module for `{}` in `{}`" ,
1851
1830
name,
@@ -3115,7 +3094,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
3115
3094
. map ( |ps| ps. identifier . name )
3116
3095
. collect :: < Vec < _ > > ( ) ;
3117
3096
3118
- let root_module = self . graph_root . get_module ( ) ;
3097
+ let root_module = self . graph_root . clone ( ) ;
3119
3098
3120
3099
let containing_module;
3121
3100
let last_private;
@@ -3278,7 +3257,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
3278
3257
Some ( _) => None ,
3279
3258
None => {
3280
3259
match this. current_module . children . borrow ( ) . get ( last_name) {
3281
- Some ( child) => child. get_module_if_available ( ) ,
3260
+ Some ( child) => child. type_ns . module ( ) ,
3282
3261
None => None ,
3283
3262
}
3284
3263
}
@@ -3883,7 +3862,7 @@ pub fn create_resolver<'a, 'tcx>(session: &'a Session,
3883
3862
make_glob_map : MakeGlobMap ,
3884
3863
callback : Option < Box < Fn ( hir_map:: Node , & mut bool ) -> bool > > )
3885
3864
-> Resolver < ' a , ' tcx > {
3886
- let mut resolver = Resolver :: new ( session, ast_map, krate . span , make_glob_map) ;
3865
+ let mut resolver = Resolver :: new ( session, ast_map, make_glob_map) ;
3887
3866
3888
3867
resolver. callback = callback;
3889
3868
0 commit comments