2727extern crate rustc;
2828extern crate rustc_front;
2929
30- use self :: FieldName :: * ;
31-
3230use std:: cmp;
3331use std:: mem:: replace;
3432
@@ -384,11 +382,6 @@ struct PrivacyVisitor<'a, 'tcx: 'a> {
384382 in_foreign : bool ,
385383}
386384
387- enum FieldName {
388- UnnamedField ( usize ) , // index
389- NamedField ( ast:: Name ) ,
390- }
391-
392385impl < ' a , ' tcx > PrivacyVisitor < ' a , ' tcx > {
393386 fn item_is_visible ( & self , did : DefId ) -> bool {
394387 let visibility = match self . tcx . map . as_local_node_id ( did) {
@@ -407,30 +400,12 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> {
407400 }
408401
409402 // Checks that a field is in scope.
410- fn check_field ( & mut self ,
411- span : Span ,
412- def : ty:: AdtDef < ' tcx > ,
413- v : ty:: VariantDef < ' tcx > ,
414- name : FieldName ) {
415- let field = match name {
416- NamedField ( f_name) => v. field_named ( f_name) ,
417- UnnamedField ( idx) => & v. fields [ idx]
418- } ;
419- if field. vis == hir:: Public || self . private_accessible ( def. did ) {
420- return ;
403+ fn check_field ( & mut self , span : Span , def : ty:: AdtDef < ' tcx > , field : ty:: FieldDef < ' tcx > ) {
404+ if def. adt_kind ( ) == ty:: AdtKind :: Struct &&
405+ field. vis != hir:: Public && !self . private_accessible ( def. did ) {
406+ span_err ! ( self . tcx. sess, span, E0451 , "field `{}` of struct `{}` is private" ,
407+ field. name, self . tcx. item_path_str( def. did) ) ;
421408 }
422-
423- let struct_desc = match def. adt_kind ( ) {
424- ty:: AdtKind :: Struct =>
425- format ! ( "struct `{}`" , self . tcx. item_path_str( def. did) ) ,
426- // struct variant fields have inherited visibility
427- ty:: AdtKind :: Enum => return
428- } ;
429- let msg = match name {
430- NamedField ( name) => format ! ( "field `{}` of {} is private" , name, struct_desc) ,
431- UnnamedField ( idx) => format ! ( "field #{} of {} is private" , idx, struct_desc) ,
432- } ;
433- span_err ! ( self . tcx. sess, span, E0451 , "{}" , msg) ;
434409 }
435410
436411 // Checks that a method is in scope.
@@ -476,7 +451,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
476451 // Rather than computing the set of unmentioned fields
477452 // (i.e. `all_fields - fields`), just check them all.
478453 for field in & variant. fields {
479- self . check_field ( expr. span , adt, variant , NamedField ( field. name ) ) ;
454+ self . check_field ( expr. span , adt, field) ;
480455 }
481456 }
482457 hir:: ExprPath ( ..) => {
@@ -518,8 +493,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
518493 let def = self . tcx . def_map . borrow ( ) . get ( & pattern. id ) . unwrap ( ) . full_def ( ) ;
519494 let variant = adt. variant_of_def ( def) ;
520495 for field in fields {
521- self . check_field ( pattern. span , adt, variant,
522- NamedField ( field. node . name ) ) ;
496+ self . check_field ( pattern. span , adt, variant. field_named ( field. node . name ) ) ;
523497 }
524498 }
525499
@@ -532,10 +506,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for PrivacyVisitor<'a, 'tcx> {
532506 if let PatKind :: Wild = field. node {
533507 continue
534508 }
535- self . check_field ( field. span ,
536- def,
537- def. struct_variant ( ) ,
538- UnnamedField ( i) ) ;
509+ self . check_field ( field. span , def, & def. struct_variant ( ) . fields [ i] ) ;
539510 }
540511 }
541512 ty:: TyEnum ( ..) => {
0 commit comments