@@ -27,8 +27,17 @@ tag scope {
27
27
scope_arm ( ast. arm ) ;
28
28
}
29
29
30
+ // This indicates whether we're searching up the scope chain
31
+ // or whether we've found a path component and started following
32
+ // it back down, which has an effect on export visibility
33
+ tag search_direction {
34
+ up;
35
+ down;
36
+ }
37
+
30
38
type env = rec ( list[ scope] scopes ,
31
- session . session sess) ;
39
+ session . session sess,
40
+ search_direction direction) ;
32
41
33
42
tag namespace {
34
43
ns_value;
@@ -148,7 +157,8 @@ fn find_final_def(&env e, import_map index,
148
157
auto len = _vec. len [ ident] ( idents) ;
149
158
auto rest_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
150
159
auto empty_e = rec ( scopes = nil[ scope] ,
151
- sess = e. sess ) ;
160
+ sess = e. sess ,
161
+ direction = down) ;
152
162
auto tmp_e = update_env_for_item ( empty_e, i) ;
153
163
auto next_i = rest_idents. ( 0 ) ;
154
164
auto next_ = lookup_name_wrapped ( tmp_e, next_i, ns) ;
@@ -172,7 +182,9 @@ fn find_final_def(&env e, import_map index,
172
182
-> def_wrap {
173
183
auto len = _vec. len [ ident] ( idents) ;
174
184
auto rest_idents = _vec. slice [ ident] ( idents, 1 u, len) ;
175
- auto empty_e = rec ( scopes = nil[ scope] , sess = e. sess ) ;
185
+ auto empty_e = rec ( scopes = nil[ scope] ,
186
+ sess = e. sess ,
187
+ direction = down) ;
176
188
auto tmp_e = update_env_for_external_mod ( empty_e, mod_id, idents) ;
177
189
auto next_i = rest_idents. ( 0 ) ;
178
190
auto next_ = lookup_name_wrapped ( tmp_e, next_i, ns) ;
@@ -347,16 +359,50 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns)
347
359
fail;
348
360
}
349
361
350
- fn check_mod ( ast . ident i, ast. _mod m , namespace ns)
362
+ fn check_mod ( & env e , ast . ident i, ast. _mod m , namespace ns)
351
363
-> option. t[ def_wrap ] {
364
+
365
+ fn visible ( & env e, ast . ident i, ast. _mod m ) -> bool {
366
+
367
+ alt ( e. direction ) {
368
+ case ( up) {
369
+ ret true ;
370
+ }
371
+ case ( down) {
372
+ // fall through
373
+ }
374
+ }
375
+
376
+ auto count = 0 ;
377
+ for ( @ast. view_item vi in m. view_items) {
378
+ alt ( vi. node ) {
379
+ case ( ast. view_item_export ( ?id) ) {
380
+ if ( _str. eq ( i, id) ) {
381
+ ret true ;
382
+ }
383
+ count += 1 ;
384
+ }
385
+ case ( _) { /* fall through */ }
386
+ }
387
+ }
388
+ // If there are no declared exports then everything is exported
389
+ if ( count == 0 ) {
390
+ ret true ;
391
+ } else {
392
+ ret false ;
393
+ }
394
+ }
395
+
352
396
alt ( m. index . find ( i) ) {
353
397
case ( some[ ast. mod_index_entry ] ( ?ent) ) {
354
398
alt ( ent) {
355
399
case ( ast. mie_view_item ( ?view_item) ) {
356
400
ret some ( found_def_view ( view_item) ) ;
357
401
}
358
402
case ( ast. mie_item ( ?item) ) {
359
- ret some ( found_def_item ( item, ns) ) ;
403
+ if ( visible ( e, i, m) ) {
404
+ ret some ( found_def_item ( item, ns) ) ;
405
+ }
360
406
}
361
407
case ( ast. mie_tag_variant ( ?item, ?variant_idx) ) {
362
408
alt ( item. node ) {
@@ -453,12 +499,12 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns)
453
499
}
454
500
}
455
501
456
- fn in_scope ( & session . session sess , ast. ident identifier , & scope s,
502
+ fn in_scope ( & env e , ast. ident identifier , & scope s,
457
503
namespace ns) -> option. t[ def_wrap ] {
458
504
alt ( s) {
459
505
460
506
case ( scope_crate ( ?c) ) {
461
- ret check_mod ( identifier, c. node . module , ns) ;
507
+ ret check_mod ( e , identifier, c. node . module , ns) ;
462
508
}
463
509
464
510
case ( scope_item ( ?it) ) {
@@ -494,7 +540,7 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns)
494
540
}
495
541
}
496
542
case ( ast. item_mod ( _, ?m, _) ) {
497
- ret check_mod ( identifier, m, ns) ;
543
+ ret check_mod ( e , identifier, m, ns) ;
498
544
}
499
545
case ( ast. item_native_mod ( _, ?m, _) ) {
500
546
ret check_native_mod ( identifier, m) ;
@@ -522,7 +568,7 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns)
522
568
}
523
569
524
570
case ( scope_external_mod ( ?mod_id, ?path) ) {
525
- ret lookup_external_def ( sess, mod_id. _0 , path) ;
571
+ ret lookup_external_def ( e . sess , mod_id. _0 , path) ;
526
572
}
527
573
528
574
case ( scope_loop ( ?d) ) {
@@ -558,7 +604,7 @@ fn lookup_name_wrapped(&env e, ast.ident i, namespace ns)
558
604
ret none[ tup ( @env, def_wrap) ] ;
559
605
}
560
606
case ( cons[ scope] ( ?hd, ?tl) ) {
561
- auto x = in_scope ( e. sess , i, hd, ns) ;
607
+ auto x = in_scope ( e, i, hd, ns) ;
562
608
alt ( x) {
563
609
case ( some[ def_wrap] ( ?x) ) {
564
610
ret some ( tup ( @e, x) ) ;
@@ -737,7 +783,8 @@ fn resolve_imports(session.session sess, @ast.crate crate) -> @ast.crate {
737
783
with * fld ) ;
738
784
739
785
auto e = rec ( scopes = nil[ scope] ,
740
- sess = sess) ;
786
+ sess = sess,
787
+ direction = up) ;
741
788
742
789
ret fold. fold_crate [ env] ( e, fld, crate ) ;
743
790
}
@@ -761,7 +808,8 @@ fn resolve_crate(session.session sess, @ast.crate crate) -> @ast.crate {
761
808
with * fld ) ;
762
809
763
810
auto e = rec ( scopes = nil[ scope] ,
764
- sess = sess) ;
811
+ sess = sess,
812
+ direction = up) ;
765
813
766
814
ret fold. fold_crate [ env] ( e, fld, new_crate) ;
767
815
}
0 commit comments