@@ -26,21 +26,22 @@ import syntax::ast::{expr_binary, expr_break, expr_cast, expr_field, expr_fn};
26
26
import syntax:: ast:: { expr_fn_block, expr_index, expr_loop} ;
27
27
import syntax:: ast:: { expr_path, expr_struct, expr_unary, fn_decl} ;
28
28
import syntax:: ast:: { foreign_item, foreign_item_fn, ge, gt, ident, trait_ref} ;
29
- import syntax:: ast:: { impure_fn, item, item_class, item_const} ;
29
+ import syntax:: ast:: { impure_fn, inherited , item, item_class, item_const} ;
30
30
import syntax:: ast:: { item_enum, item_fn, item_mac, item_foreign_mod} ;
31
31
import syntax:: ast:: { item_impl, item_mod, item_trait, item_ty, le, local} ;
32
32
import syntax:: ast:: { local_crate, lt, method, mul, ne, neg, node_id, pat} ;
33
33
import syntax:: ast:: { pat_enum, pat_ident, path, prim_ty, pat_box, pat_uniq} ;
34
34
import syntax:: ast:: { pat_lit, pat_range, pat_rec, pat_struct, pat_tup} ;
35
- import syntax:: ast:: { pat_wild, provided, required, rem, self_ty_, shl} ;
36
- import syntax:: ast:: { stmt_decl, struct_field, struct_variant_kind} ;
35
+ import syntax:: ast:: { pat_wild, private, provided, public, required, rem} ;
36
+ import syntax:: ast:: { self_ty_} ;
37
+ import syntax:: ast:: { shl, stmt_decl, struct_field, struct_variant_kind} ;
37
38
import syntax:: ast:: { sty_static, subtract, tuple_variant_kind, ty} ;
38
39
import syntax:: ast:: { ty_bool, ty_char, ty_f, ty_f32, ty_f64, ty_float, ty_i} ;
39
40
import syntax:: ast:: { ty_i16, ty_i32, ty_i64, ty_i8, ty_int, ty_param} ;
40
41
import syntax:: ast:: { ty_path, ty_str, ty_u, ty_u16, ty_u32, ty_u64, ty_u8} ;
41
42
import syntax:: ast:: { ty_uint, variant, view_item, view_item_export} ;
42
43
import syntax:: ast:: { view_item_import, view_item_use, view_path_glob} ;
43
- import syntax:: ast:: { view_path_list, view_path_simple} ;
44
+ import syntax:: ast:: { view_path_list, view_path_simple, visibility } ;
44
45
import syntax:: ast_util:: { def_id_of_def, dummy_sp, local_def, new_def_hash} ;
45
46
import syntax:: ast_util:: { path_to_ident, walk_pat, trait_method_to_ty_method} ;
46
47
import syntax:: attr:: { attr_metas, contains_name} ;
@@ -475,14 +476,26 @@ fn unused_import_lint_level(session: session) -> level {
475
476
return allow;
476
477
}
477
478
479
+ enum Privacy {
480
+ Private ,
481
+ Public
482
+ }
483
+
484
+ // Records a possibly-private definition.
485
+ struct Definition {
486
+ privacy : Privacy ;
487
+ def: def;
488
+ }
489
+
478
490
// Records the definitions (at most one for each namespace) that a name is
479
491
// bound to.
480
492
struct NameBindings {
481
- let mut module_def : ModuleDef ; //< Meaning in the module namespace.
482
- let mut type_def: option < def > ; //< Meaning in the type namespace.
483
- let mut value_def: option < def > ; //< Meaning in the value namespace.
493
+ let mut module_def : ModuleDef ; //< Meaning in module namespace.
494
+ let mut type_def: option < Definition > ; //< Meaning in type namespace.
495
+ let mut value_def: option < Definition > ; //< Meaning in value namespace.
484
496
485
497
// For error reporting
498
+ // XXX: Merge me into Definition.
486
499
let mut module_span: option < span > ;
487
500
let mut type_span: option < span > ;
488
501
let mut value_span: option < span > ;
@@ -507,14 +520,14 @@ struct NameBindings {
507
520
}
508
521
509
522
/// Records a type definition.
510
- fn define_type ( def : def , sp : span ) {
511
- self . type_def = some ( def) ;
523
+ fn define_type ( privacy : Privacy , def : def , sp : span ) {
524
+ self . type_def = some ( Definition { privacy : privacy , def : def } ) ;
512
525
self . type_span = some ( sp) ;
513
526
}
514
527
515
528
/// Records a value definition.
516
- fn define_value ( def : def , sp : span ) {
517
- self . value_def = some ( def) ;
529
+ fn define_value ( privacy : Privacy , def : def , sp : span ) {
530
+ self . value_def = some ( Definition { privacy : privacy , def : def } ) ;
518
531
self . value_span = some ( sp) ;
519
532
}
520
533
@@ -550,16 +563,22 @@ struct NameBindings {
550
563
}
551
564
}
552
565
553
- fn def_for_namespace(namespace: Namespace) -> option<def > {
566
+ fn def_for_namespace(namespace: Namespace) -> option<Definition > {
554
567
match namespace {
555
568
TypeNS => return self.type_def,
556
569
ValueNS => return self.value_def,
557
570
ModuleNS => match self.module_def {
558
571
NoModuleDef => return none,
559
- ModuleDef(module_) => match module_.def_id {
560
- none => return none,
561
- some(def_id) => return some(def_mod(def_id))
562
- }
572
+ ModuleDef(module_) =>
573
+ match module_.def_id {
574
+ none => return none,
575
+ some(def_id) => {
576
+ return some(Definition {
577
+ privacy: Public,
578
+ def: def_mod(def_id)
579
+ });
580
+ }
581
+ }
563
582
}
564
583
}
565
584
}
@@ -762,6 +781,13 @@ struct Resolver {
762
781
} ) ) ;
763
782
}
764
783
784
+ fn visibility_to_privacy( visibility: visibility) -> Privacy {
785
+ match visibility {
786
+ inherited | public => Public,
787
+ privacy => Private
788
+ }
789
+ }
790
+
765
791
/// Returns the current module tracked by the reduced graph parent.
766
792
fn get_module_from_parent( reduced_graph_parent: ReducedGraphParent )
767
793
-> @Module {
@@ -915,15 +941,18 @@ struct Resolver {
915
941
let ( name_bindings, _) = self . add_child ( atom, parent,
916
942
~[ ValueNS ] , sp) ;
917
943
918
- ( * name_bindings) . define_value ( def_const ( local_def ( item. id ) ) ,
919
- sp) ;
944
+ ( * name_bindings) . define_value
945
+ ( self . visibility_to_privacy ( item. vis ) ,
946
+ def_const ( local_def ( item. id ) ) ,
947
+ sp) ;
920
948
}
921
949
item_fn( decl, _, _) => {
922
950
let ( name_bindings, new_parent) = self . add_child ( atom, parent,
923
951
~[ ValueNS ] , sp) ;
924
952
925
953
let def = def_fn ( local_def ( item. id ) , decl. purity ) ;
926
- ( * name_bindings) . define_value ( def, sp) ;
954
+ ( * name_bindings) . define_value
955
+ ( self . visibility_to_privacy ( item. vis ) , def, sp) ;
927
956
visit_item ( item, new_parent, visitor) ;
928
957
}
929
958
@@ -932,15 +961,21 @@ struct Resolver {
932
961
let ( name_bindings, _) = self . add_child ( atom, parent,
933
962
~[ TypeNS ] , sp) ;
934
963
935
- ( * name_bindings) . define_type ( def_ty ( local_def ( item. id ) ) , sp) ;
964
+ ( * name_bindings) . define_type
965
+ ( self . visibility_to_privacy ( item. vis ) ,
966
+ def_ty ( local_def ( item. id ) ) ,
967
+ sp) ;
936
968
}
937
969
938
970
item_enum( enum_definition, _) => {
939
971
940
972
let ( name_bindings, new_parent) = self . add_child ( atom, parent,
941
973
~[ TypeNS ] , sp) ;
942
974
943
- ( * name_bindings) . define_type ( def_ty ( local_def ( item. id ) ) , sp) ;
975
+ ( * name_bindings) . define_type
976
+ ( self . visibility_to_privacy ( item. vis ) ,
977
+ def_ty ( local_def ( item. id ) ) ,
978
+ sp) ;
944
979
945
980
for enum_definition. variants. each |variant| {
946
981
self . build_reduced_graph_for_variant ( variant,
@@ -958,22 +993,26 @@ struct Resolver {
958
993
let ( name_bindings, new_parent) =
959
994
self . add_child ( atom, parent, ~[ TypeNS ] , sp) ;
960
995
961
- ( * name_bindings) . define_type ( def_ty (
962
- local_def ( item. id ) ) , sp) ;
996
+ ( * name_bindings) . define_type
997
+ ( self . visibility_to_privacy ( item. vis ) ,
998
+ def_ty ( local_def ( item. id ) ) ,
999
+ sp) ;
963
1000
new_parent
964
1001
}
965
1002
some( ctor) => {
966
1003
let ( name_bindings, new_parent) =
967
1004
self . add_child ( atom, parent, ~[ ValueNS , TypeNS ] ,
968
1005
sp) ;
969
1006
970
- ( * name_bindings) . define_type ( def_ty (
971
- local_def ( item. id ) ) , sp) ;
1007
+ let privacy = self . visibility_to_privacy ( item. vis ) ;
1008
+
1009
+ ( * name_bindings) . define_type
1010
+ ( privacy, def_ty ( local_def ( item. id ) ) , sp) ;
972
1011
973
1012
let purity = ctor. node . dec . purity ;
974
1013
let ctor_def = def_fn ( local_def ( ctor. node . id ) ,
975
1014
purity) ;
976
- ( * name_bindings) . define_value ( ctor_def, sp) ;
1015
+ ( * name_bindings) . define_value ( privacy , ctor_def, sp) ;
977
1016
new_parent
978
1017
}
979
1018
} ;
@@ -1009,7 +1048,8 @@ struct Resolver {
1009
1048
ty_m. span ) ;
1010
1049
let def = def_static_method ( local_def ( ty_m. id ) ,
1011
1050
ty_m. decl . purity ) ;
1012
- ( * method_name_bindings) . define_value ( def, ty_m. span ) ;
1051
+ ( * method_name_bindings) . define_value
1052
+ ( Public , def, ty_m. span ) ;
1013
1053
}
1014
1054
_ => {
1015
1055
( * method_names) . insert ( atom, ( ) ) ;
@@ -1020,7 +1060,10 @@ struct Resolver {
1020
1060
let def_id = local_def ( item. id ) ;
1021
1061
self . trait_info . insert ( def_id, method_names) ;
1022
1062
1023
- ( * name_bindings) . define_type ( def_ty ( def_id) , sp) ;
1063
+ ( * name_bindings) . define_type
1064
+ ( self . visibility_to_privacy ( item. vis ) ,
1065
+ def_ty ( def_id) ,
1066
+ sp) ;
1024
1067
visit_item ( item, new_parent, visitor) ;
1025
1068
}
1026
1069
@@ -1043,18 +1086,21 @@ struct Resolver {
1043
1086
1044
1087
match variant. node . kind {
1045
1088
tuple_variant_kind( _) => {
1046
- ( * child) . define_value ( def_variant ( item_id,
1089
+ ( * child) . define_value ( Public ,
1090
+ def_variant ( item_id,
1047
1091
local_def ( variant. node . id ) ) ,
1048
1092
variant. span ) ;
1049
1093
}
1050
1094
struct_variant_kind( _) => {
1051
- ( * child) . define_type ( def_variant ( item_id,
1095
+ ( * child) . define_type ( Public ,
1096
+ def_variant ( item_id,
1052
1097
local_def ( variant. node . id ) ) ,
1053
1098
variant. span ) ;
1054
1099
self . structs . insert ( local_def ( variant. node . id ) , false ) ;
1055
1100
}
1056
1101
enum_variant_kind( enum_definition) => {
1057
- ( * child) . define_type ( def_ty ( local_def ( variant. node . id ) ) ,
1102
+ ( * child) . define_type ( Public ,
1103
+ def_ty ( local_def ( variant. node . id ) ) ,
1058
1104
variant. span ) ;
1059
1105
for enum_definition. variants. each |variant| {
1060
1106
self . build_reduced_graph_for_variant ( variant, item_id,
@@ -1240,7 +1286,7 @@ struct Resolver {
1240
1286
~[ ValueNS ] , foreign_item. span) ;
1241
1287
1242
1288
let def = def_fn( local_def( foreign_item. id) , fn_decl. purity) ;
1243
- ( * name_bindings) . define_value( def, foreign_item. span) ;
1289
+ ( * name_bindings) . define_value( Public , def, foreign_item. span) ;
1244
1290
1245
1291
do self. with_type_parameter_rib
1246
1292
( HasTypeParameters ( & type_parameters,
@@ -1342,7 +1388,7 @@ struct Resolver {
1342
1388
def_const( def_id) | def_variant( _, def_id) => {
1343
1389
debug ! ( "(building reduced graph for external \
1344
1390
crate) building value %s", final_ident) ;
1345
- ( * child_name_bindings) . define_value( def, dummy_sp( ) ) ;
1391
+ ( * child_name_bindings) . define_value( Public , def, dummy_sp( ) ) ;
1346
1392
}
1347
1393
def_ty( def_id) => {
1348
1394
debug ! ( "(building reduced graph for external \
@@ -1375,17 +1421,17 @@ struct Resolver {
1375
1421
}
1376
1422
}
1377
1423
1378
- child_name_bindings. define_type( def, dummy_sp( ) ) ;
1424
+ child_name_bindings. define_type( Public , def, dummy_sp( ) ) ;
1379
1425
}
1380
1426
def_class( def_id, has_constructor) => {
1381
1427
debug ! ( "(building reduced graph for external \
1382
1428
crate) building type %s (value? %d)",
1383
1429
final_ident,
1384
1430
if has_constructor { 1 } else { 0 } ) ;
1385
- child_name_bindings. define_type( def, dummy_sp( ) ) ;
1431
+ child_name_bindings. define_type( Public , def, dummy_sp( ) ) ;
1386
1432
1387
1433
if has_constructor {
1388
- child_name_bindings. define_value( def, dummy_sp( ) ) ;
1434
+ child_name_bindings. define_value( Public , def, dummy_sp( ) ) ;
1389
1435
}
1390
1436
1391
1437
self . structs. insert( def_id, has_constructor) ;
@@ -3751,14 +3797,18 @@ struct Resolver {
3751
3797
fail ~"resolved name in the value namespace to a set \
3752
3798
of name bindings with no def?!";
3753
3799
}
3754
- some( def @ def_variant( * ) ) => {
3755
- return FoundEnumVariant ( def) ;
3756
- }
3757
- some( def_const( * ) ) => {
3758
- return FoundConst ;
3759
- }
3760
- some( _) => {
3761
- return EnumVariantOrConstNotFound ;
3800
+ some( def) => {
3801
+ match def. def {
3802
+ def @ def_variant( * ) => {
3803
+ return FoundEnumVariant ( def) ;
3804
+ }
3805
+ def_const( * ) => {
3806
+ return FoundConst ;
3807
+ }
3808
+ _ => {
3809
+ return EnumVariantOrConstNotFound ;
3810
+ }
3811
+ }
3762
3812
}
3763
3813
}
3764
3814
}
@@ -3845,11 +3895,11 @@ struct Resolver {
3845
3895
match containing_module. children. find( name) {
3846
3896
some( child_name_bindings) => {
3847
3897
match ( * child_name_bindings) . def_for_namespace( namespace) {
3848
- some( def) => {
3898
+ some( def) if def . privacy == Public => {
3849
3899
// Found it. Stop the search here.
3850
- return ChildNameDefinition ( def) ;
3900
+ return ChildNameDefinition ( def. def ) ;
3851
3901
}
3852
- none => {
3902
+ some ( _ ) | none => {
3853
3903
// Continue.
3854
3904
}
3855
3905
}
@@ -3866,12 +3916,12 @@ struct Resolver {
3866
3916
some( target) => {
3867
3917
match ( * target. bindings)
3868
3918
. def_for_namespace( namespace) {
3869
- some( def) => {
3919
+ some( def) if def . privacy == Public => {
3870
3920
// Found it.
3871
3921
import_resolution. used = true;
3872
- return ImportNameDefinition ( def) ;
3922
+ return ImportNameDefinition ( def. def ) ;
3873
3923
}
3874
- none => {
3924
+ some ( _ ) | none => {
3875
3925
// This can happen with external impls, due to
3876
3926
// the imperfect way we read the metadata.
3877
3927
@@ -4066,7 +4116,7 @@ struct Resolver {
4066
4116
debug!{ "( resolving item path in lexical scope) \
4067
4117
resolved `%s` to item",
4068
4118
* ( * self . atom_table) . atom_to_str( name) } ;
4069
- return some( def) ;
4119
+ return some( def. def ) ;
4070
4120
}
4071
4121
}
4072
4122
}
@@ -4277,12 +4327,18 @@ struct Resolver {
4277
4327
// Look for trait children.
4278
4328
for search_module. children. each |_name, child_name_bindings| {
4279
4329
match child_name_bindings. def_for_namespace( TypeNS ) {
4280
- some( def_ty( trait_def_id) ) => {
4281
- self . add_trait_info_if_containing_method( found_traits,
4282
- trait_def_id,
4283
- name) ;
4330
+ some( def) => {
4331
+ match def. def {
4332
+ def_ty( trait_def_id) => {
4333
+ self . add_trait_info_if_containing_method
4334
+ ( found_traits, trait_def_id, name) ;
4335
+ }
4336
+ _ => {
4337
+ // Continue.
4338
+ }
4339
+ }
4284
4340
}
4285
- some ( _ ) | none => {
4341
+ none => {
4286
4342
// Continue.
4287
4343
}
4288
4344
}
@@ -4298,11 +4354,19 @@ struct Resolver {
4298
4354
}
4299
4355
some( target) => {
4300
4356
match target. bindings. def_for_namespace( TypeNS ) {
4301
- some( def_ty( trait_def_id) ) => {
4302
- self . add_trait_info_if_containing_method
4303
- ( found_traits, trait_def_id, name) ;
4357
+ some( def) => {
4358
+ match def. def {
4359
+ def_ty( trait_def_id) => {
4360
+ self .
4361
+ add_trait_info_if_containing_method
4362
+ ( found_traits, trait_def_id, name) ;
4363
+ }
4364
+ _ => {
4365
+ // Continue.
4366
+ }
4367
+ }
4304
4368
}
4305
- some ( _ ) | none => {
4369
+ none => {
4306
4370
// Continue.
4307
4371
}
4308
4372
}
0 commit comments