@@ -916,51 +916,46 @@ impl<'a> Resolver<'a> {
916
916
err. emit ( ) ;
917
917
}
918
918
919
- crate fn report_privacy_error ( & self , privacy_error : & PrivacyError < ' _ > ) {
920
- let PrivacyError { ident, binding, .. } = * privacy_error;
921
- let session = & self . session ;
922
- let mk_struct_span_error = |is_constructor| {
923
- let mut descr = binding. res ( ) . descr ( ) . to_string ( ) ;
924
- if is_constructor {
925
- descr += " constructor" ;
926
- }
927
- if binding. is_import ( ) {
928
- descr += " import" ;
929
- }
930
-
931
- let mut err =
932
- struct_span_err ! ( session, ident. span, E0603 , "{} `{}` is private" , descr, ident) ;
933
-
934
- err. span_label ( ident. span , & format ! ( "this {} is private" , descr) ) ;
935
- err. span_note (
936
- session. source_map ( ) . def_span ( binding. span ) ,
937
- & format ! ( "the {} `{}` is defined here" , descr, ident) ,
938
- ) ;
939
-
940
- err
941
- } ;
942
-
943
- let mut err = if let NameBindingKind :: Res (
919
+ /// If the binding refers to a tuple struct constructor with fields,
920
+ /// returns the span of its fields.
921
+ fn ctor_fields_span ( & self , binding : & NameBinding < ' _ > ) -> Option < Span > {
922
+ if let NameBindingKind :: Res (
944
923
Res :: Def ( DefKind :: Ctor ( CtorOf :: Struct , CtorKind :: Fn ) , ctor_def_id) ,
945
924
_,
946
925
) = binding. kind
947
926
{
948
927
let def_id = ( & * self ) . parent ( ctor_def_id) . expect ( "no parent for a constructor" ) ;
949
928
if let Some ( fields) = self . field_names . get ( & def_id) {
950
- let mut err = mk_struct_span_error ( true ) ;
951
929
let first_field = fields. first ( ) . expect ( "empty field list in the map" ) ;
952
- err. span_label (
953
- fields. iter ( ) . fold ( first_field. span , |acc, field| acc. to ( field. span ) ) ,
954
- "a constructor is private if any of the fields is private" ,
955
- ) ;
956
- err
957
- } else {
958
- mk_struct_span_error ( false )
930
+ return Some ( fields. iter ( ) . fold ( first_field. span , |acc, field| acc. to ( field. span ) ) ) ;
959
931
}
960
- } else {
961
- mk_struct_span_error ( false )
962
- } ;
932
+ }
933
+ None
934
+ }
935
+
936
+ crate fn report_privacy_error ( & self , privacy_error : & PrivacyError < ' _ > ) {
937
+ let PrivacyError { ident, binding, .. } = * privacy_error;
938
+
939
+ let ctor_fields_span = self . ctor_fields_span ( binding) ;
940
+ let mut descr = binding. res ( ) . descr ( ) . to_string ( ) ;
941
+ if ctor_fields_span. is_some ( ) {
942
+ descr += " constructor" ;
943
+ }
944
+ if binding. is_import ( ) {
945
+ descr += " import" ;
946
+ }
963
947
948
+ let mut err =
949
+ struct_span_err ! ( self . session, ident. span, E0603 , "{} `{}` is private" , descr, ident) ;
950
+ err. span_label ( ident. span , & format ! ( "this {} is private" , descr) ) ;
951
+ if let Some ( span) = ctor_fields_span {
952
+ err. span_label ( span, "a constructor is private if any of the fields is private" ) ;
953
+ }
954
+
955
+ err. span_note (
956
+ self . session . source_map ( ) . def_span ( binding. span ) ,
957
+ & format ! ( "the {} `{}` is defined here" , descr, ident) ,
958
+ ) ;
964
959
err. emit ( ) ;
965
960
}
966
961
}
0 commit comments