Make span a bit better
This commit is contained in:
parent
00d54c879b
commit
8ed2dc0bce
3 changed files with 32 additions and 41 deletions
|
@ -1608,11 +1608,15 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
struct_span_err!(self.tcx.sess, ident.span, E0603, "{} `{}` is private", descr, ident);
|
||||
err.span_label(ident.span, &format!("private {}", descr));
|
||||
|
||||
let mut non_exhaustive = None;
|
||||
// If an ADT is foreign and marked as `non_exhaustive`, then that's
|
||||
// probably why we have the privacy error.
|
||||
// Otherwise, point out if the struct has any private fields.
|
||||
if let Some(def_id) = res.opt_def_id()
|
||||
&& !def_id.is_local()
|
||||
&& let Some(attr) = self.tcx.get_attr(def_id, sym::non_exhaustive)
|
||||
{
|
||||
err.span_label(attr.span, format!("the {nonimport_descr} is `#[non_exhaustive]`"));
|
||||
non_exhaustive = Some(attr.span);
|
||||
} else if let Some(span) = ctor_fields_span {
|
||||
err.span_label(span, "a constructor is private if any of the fields is private");
|
||||
if let Res::Def(_, d) = res && let Some(fields) = self.field_visibility_spans.get(&d) {
|
||||
|
@ -1662,6 +1666,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||
if !first && binding.vis.is_public() {
|
||||
note_span.push_span_label(def_span, "consider importing it directly");
|
||||
}
|
||||
// Final step in the import chain, point out if the ADT is `non_exhaustive`
|
||||
// which is probably why this privacy violation occurred.
|
||||
if next_binding.is_none() && let Some(span) = non_exhaustive {
|
||||
note_span.push_span_label(
|
||||
span,
|
||||
format!("cannot be constructed because it is `#[non_exhaustive]`"),
|
||||
);
|
||||
}
|
||||
err.span_note(note_span, &msg);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue