@@ -23,9 +23,9 @@ use rustc_hir::def::{self, *};
23
23
use rustc_hir:: def_id:: { CRATE_DEF_ID , DefId , LocalDefId } ;
24
24
use rustc_index:: bit_set:: DenseBitSet ;
25
25
use rustc_metadata:: creader:: LoadedMacro ;
26
- use rustc_middle:: bug;
27
26
use rustc_middle:: metadata:: ModChild ;
28
27
use rustc_middle:: ty:: { Feed , Visibility } ;
28
+ use rustc_middle:: { bug, span_bug} ;
29
29
use rustc_span:: hygiene:: { ExpnId , LocalExpnId , MacroKind } ;
30
30
use rustc_span:: { Ident , Span , Symbol , kw, sym} ;
31
31
use thin_vec:: ThinVec ;
@@ -46,30 +46,59 @@ type Res = def::Res<NodeId>;
46
46
impl < ' ra , ' tcx > Resolver < ' ra , ' tcx > {
47
47
/// Defines `name` in namespace `ns` of module `parent` to be `def` if it is not yet defined;
48
48
/// otherwise, reports an error.
49
- pub ( crate ) fn define_binding (
49
+ pub ( crate ) fn define_binding_local (
50
50
& mut self ,
51
51
parent : Module < ' ra > ,
52
52
ident : Ident ,
53
53
ns : Namespace ,
54
54
binding : NameBinding < ' ra > ,
55
55
) {
56
- if let Err ( old_binding) = self . try_define ( parent, ident, ns, binding, false ) {
56
+ if let Err ( old_binding) = self . try_define_local ( parent, ident, ns, binding, false ) {
57
57
self . report_conflict ( parent, ident, ns, old_binding, binding) ;
58
58
}
59
59
}
60
60
61
- fn define (
61
+ fn define_local (
62
62
& mut self ,
63
63
parent : Module < ' ra > ,
64
64
ident : Ident ,
65
65
ns : Namespace ,
66
66
res : Res ,
67
- vis : Visibility < impl Into < DefId > > ,
67
+ vis : Visibility ,
68
68
span : Span ,
69
69
expn_id : LocalExpnId ,
70
70
) {
71
71
let binding = self . arenas . new_res_binding ( res, vis. to_def_id ( ) , span, expn_id) ;
72
- self . define_binding ( parent, ident, ns, binding)
72
+ self . define_binding_local ( parent, ident, ns, binding) ;
73
+ }
74
+
75
+ fn define_extern (
76
+ & self ,
77
+ parent : Module < ' ra > ,
78
+ ident : Ident ,
79
+ ns : Namespace ,
80
+ res : Res ,
81
+ vis : Visibility < DefId > ,
82
+ span : Span ,
83
+ expn_id : LocalExpnId ,
84
+ ) {
85
+ let binding = self . arenas . new_res_binding ( res, vis, span, expn_id) ;
86
+ // Even if underscore names cannot be looked up, we still need to add them to modules,
87
+ // because they can be fetched by glob imports from those modules, and bring traits
88
+ // into scope both directly and through glob imports.
89
+ let key = BindingKey :: new_disambiguated ( ident, ns, || {
90
+ parent. underscore_disambiguator . update ( |d| d + 1 ) ;
91
+ parent. underscore_disambiguator . get ( )
92
+ } ) ;
93
+ if self
94
+ . resolution_or_default ( parent, key)
95
+ . borrow_mut ( )
96
+ . non_glob_binding
97
+ . replace ( binding)
98
+ . is_some ( )
99
+ {
100
+ span_bug ! ( span, "an external binding was already defined" ) ;
101
+ }
73
102
}
74
103
75
104
/// Walks up the tree of definitions starting at `def_id`,
@@ -192,7 +221,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
192
221
visitor. parent_scope . macro_rules
193
222
}
194
223
195
- pub ( crate ) fn build_reduced_graph_external ( & mut self , module : Module < ' ra > ) {
224
+ pub ( crate ) fn build_reduced_graph_external ( & self , module : Module < ' ra > ) {
196
225
for child in self . tcx . module_children ( module. def_id ( ) ) {
197
226
let parent_scope = ParentScope :: module ( module, self ) ;
198
227
self . build_reduced_graph_for_external_crate_res ( child, parent_scope)
@@ -201,7 +230,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
201
230
202
231
/// Builds the reduced graph for a single item in an external crate.
203
232
fn build_reduced_graph_for_external_crate_res (
204
- & mut self ,
233
+ & self ,
205
234
child : & ModChild ,
206
235
parent_scope : ParentScope < ' ra > ,
207
236
) {
@@ -232,7 +261,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
232
261
_,
233
262
)
234
263
| Res :: PrimTy ( ..)
235
- | Res :: ToolMod => self . define ( parent, ident, TypeNS , res, vis, span, expansion) ,
264
+ | Res :: ToolMod => self . define_extern ( parent, ident, TypeNS , res, vis, span, expansion) ,
236
265
Res :: Def (
237
266
DefKind :: Fn
238
267
| DefKind :: AssocFn
@@ -241,9 +270,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
241
270
| DefKind :: AssocConst
242
271
| DefKind :: Ctor ( ..) ,
243
272
_,
244
- ) => self . define ( parent, ident, ValueNS , res, vis, span, expansion) ,
273
+ ) => self . define_extern ( parent, ident, ValueNS , res, vis, span, expansion) ,
245
274
Res :: Def ( DefKind :: Macro ( ..) , _) | Res :: NonMacroAttr ( ..) => {
246
- self . define ( parent, ident, MacroNS , res, vis, span, expansion)
275
+ self . define_extern ( parent, ident, MacroNS , res, vis, span, expansion)
247
276
}
248
277
Res :: Def (
249
278
DefKind :: TyParam
@@ -711,7 +740,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
711
740
let expansion = parent_scope. expansion ;
712
741
713
742
// Define a name in the type namespace if it is not anonymous.
714
- self . r . define ( parent, ident, TypeNS , adt_res, adt_vis, adt_span, expansion) ;
743
+ self . r . define_local ( parent, ident, TypeNS , adt_res, adt_vis, adt_span, expansion) ;
715
744
self . r . feed_visibility ( feed, adt_vis) ;
716
745
let def_id = feed. key ( ) ;
717
746
@@ -763,7 +792,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
763
792
}
764
793
765
794
ItemKind :: Mod ( _, ident, ref mod_kind) => {
766
- self . r . define ( parent, ident, TypeNS , res, vis, sp, expansion) ;
795
+ self . r . define_local ( parent, ident, TypeNS , res, vis, sp, expansion) ;
767
796
768
797
if let ast:: ModKind :: Loaded ( _, _, _, Err ( _) ) = mod_kind {
769
798
self . r . mods_with_parse_errors . insert ( def_id) ;
@@ -782,10 +811,10 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
782
811
ItemKind :: Const ( box ConstItem { ident, .. } )
783
812
| ItemKind :: Delegation ( box Delegation { ident, .. } )
784
813
| ItemKind :: Static ( box StaticItem { ident, .. } ) => {
785
- self . r . define ( parent, ident, ValueNS , res, vis, sp, expansion) ;
814
+ self . r . define_local ( parent, ident, ValueNS , res, vis, sp, expansion) ;
786
815
}
787
816
ItemKind :: Fn ( box Fn { ident, .. } ) => {
788
- self . r . define ( parent, ident, ValueNS , res, vis, sp, expansion) ;
817
+ self . r . define_local ( parent, ident, ValueNS , res, vis, sp, expansion) ;
789
818
790
819
// Functions introducing procedural macros reserve a slot
791
820
// in the macro namespace as well (see #52225).
@@ -794,11 +823,11 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
794
823
795
824
// These items live in the type namespace.
796
825
ItemKind :: TyAlias ( box TyAlias { ident, .. } ) | ItemKind :: TraitAlias ( ident, ..) => {
797
- self . r . define ( parent, ident, TypeNS , res, vis, sp, expansion) ;
826
+ self . r . define_local ( parent, ident, TypeNS , res, vis, sp, expansion) ;
798
827
}
799
828
800
829
ItemKind :: Enum ( ident, _, _) | ItemKind :: Trait ( box ast:: Trait { ident, .. } ) => {
801
- self . r . define ( parent, ident, TypeNS , res, vis, sp, expansion) ;
830
+ self . r . define_local ( parent, ident, TypeNS , res, vis, sp, expansion) ;
802
831
803
832
self . parent_scope . module = self . r . new_local_module (
804
833
Some ( parent) ,
@@ -850,7 +879,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
850
879
let feed = self . r . feed ( ctor_node_id) ;
851
880
let ctor_def_id = feed. key ( ) ;
852
881
let ctor_res = self . res ( ctor_def_id) ;
853
- self . r . define ( parent, ident, ValueNS , ctor_res, ctor_vis, sp, expansion) ;
882
+ self . r . define_local ( parent, ident, ValueNS , ctor_res, ctor_vis, sp, expansion) ;
854
883
self . r . feed_visibility ( feed, ctor_vis) ;
855
884
// We need the field visibility spans also for the constructor for E0603.
856
885
self . insert_field_visibilities_local ( ctor_def_id. to_def_id ( ) , vdata. fields ( ) ) ;
@@ -974,7 +1003,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
974
1003
) ;
975
1004
}
976
1005
}
977
- self . r . define_binding ( parent, ident, TypeNS , imported_binding) ;
1006
+ self . r . define_binding_local ( parent, ident, TypeNS , imported_binding) ;
978
1007
}
979
1008
980
1009
/// Constructs the reduced graph for one foreign item.
@@ -991,7 +1020,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
991
1020
let parent = self . parent_scope . module ;
992
1021
let expansion = self . parent_scope . expansion ;
993
1022
let vis = self . resolve_visibility ( & item. vis ) ;
994
- self . r . define ( parent, ident, ns, self . res ( def_id) , vis, item. span , expansion) ;
1023
+ self . r . define_local ( parent, ident, ns, self . res ( def_id) , vis, item. span , expansion) ;
995
1024
self . r . feed_visibility ( feed, vis) ;
996
1025
}
997
1026
@@ -1074,7 +1103,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1074
1103
if let Some ( span) = import_all {
1075
1104
let import = macro_use_import ( self , span, false ) ;
1076
1105
self . r . potentially_unused_imports . push ( import) ;
1077
- module. for_each_child ( self , |this, ident, ns, binding| {
1106
+ module. for_each_child_mut ( self , |this, ident, ns, binding| {
1078
1107
if ns == MacroNS {
1079
1108
let import = if this. r . is_accessible_from ( binding. vis , this. parent_scope . module )
1080
1109
{
@@ -1239,7 +1268,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1239
1268
} ) ;
1240
1269
self . r . import_use_map . insert ( import, Used :: Other ) ;
1241
1270
let import_binding = self . r . import ( binding, import) ;
1242
- self . r . define_binding ( self . r . graph_root , ident, MacroNS , import_binding) ;
1271
+ self . r . define_binding_local ( self . r . graph_root , ident, MacroNS , import_binding) ;
1243
1272
} else {
1244
1273
self . r . check_reserved_macro_name ( ident, res) ;
1245
1274
self . insert_unused_macro ( ident, def_id, item. id ) ;
@@ -1267,7 +1296,7 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1267
1296
if !vis. is_public ( ) {
1268
1297
self . insert_unused_macro ( ident, def_id, item. id ) ;
1269
1298
}
1270
- self . r . define ( module, ident, MacroNS , res, vis, span, expansion) ;
1299
+ self . r . define_local ( module, ident, MacroNS , res, vis, span, expansion) ;
1271
1300
self . r . feed_visibility ( feed, vis) ;
1272
1301
self . parent_scope . macro_rules
1273
1302
}
@@ -1403,7 +1432,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1403
1432
if ctxt == AssocCtxt :: Trait {
1404
1433
let parent = self . parent_scope . module ;
1405
1434
let expansion = self . parent_scope . expansion ;
1406
- self . r . define ( parent, ident, ns, self . res ( def_id) , vis, item. span , expansion) ;
1435
+ self . r . define_local ( parent, ident, ns, self . res ( def_id) , vis, item. span , expansion) ;
1407
1436
} else if !matches ! ( & item. kind, AssocItemKind :: Delegation ( deleg) if deleg. from_glob)
1408
1437
&& ident. name != kw:: Underscore
1409
1438
{
@@ -1491,7 +1520,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1491
1520
let feed = self . r . feed ( variant. id ) ;
1492
1521
let def_id = feed. key ( ) ;
1493
1522
let vis = self . resolve_visibility ( & variant. vis ) ;
1494
- self . r . define ( parent, ident, TypeNS , self . res ( def_id) , vis, variant. span , expn_id) ;
1523
+ self . r . define_local ( parent, ident, TypeNS , self . res ( def_id) , vis, variant. span , expn_id) ;
1495
1524
self . r . feed_visibility ( feed, vis) ;
1496
1525
1497
1526
// If the variant is marked as non_exhaustive then lower the visibility to within the crate.
@@ -1507,7 +1536,7 @@ impl<'a, 'ra, 'tcx> Visitor<'a> for BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
1507
1536
let feed = self . r . feed ( ctor_node_id) ;
1508
1537
let ctor_def_id = feed. key ( ) ;
1509
1538
let ctor_res = self . res ( ctor_def_id) ;
1510
- self . r . define ( parent, ident, ValueNS , ctor_res, ctor_vis, variant. span , expn_id) ;
1539
+ self . r . define_local ( parent, ident, ValueNS , ctor_res, ctor_vis, variant. span , expn_id) ;
1511
1540
self . r . feed_visibility ( feed, ctor_vis) ;
1512
1541
}
1513
1542
0 commit comments