Skip to content

Commit 7819335

Browse files
committed
resolve: Simplify fn report_privacy_error
by factoring out `fn ctor_fields_span` into a separate function
1 parent 823ff8c commit 7819335

File tree

1 file changed

+31
-36
lines changed

1 file changed

+31
-36
lines changed

src/librustc_resolve/diagnostics.rs

+31-36
Original file line numberDiff line numberDiff line change
@@ -917,51 +917,46 @@ impl<'a> Resolver<'a> {
917917
err.emit();
918918
}
919919

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

949+
let mut err =
950+
struct_span_err!(self.session, ident.span, E0603, "{} `{}` is private", descr, ident);
951+
err.span_label(ident.span, &format!("this {} is private", descr));
952+
if let Some(span) = ctor_fields_span {
953+
err.span_label(span, "a constructor is private if any of the fields is private");
954+
}
955+
956+
err.span_note(
957+
self.session.source_map().def_span(binding.span),
958+
&format!("the {} `{}` is defined here", descr, ident),
959+
);
965960
err.emit();
966961
}
967962
}

0 commit comments

Comments
 (0)