|  | use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext}; | 
|  |  | 
|  | // Diagnostic: private-field | 
|  | // | 
|  | // This diagnostic is triggered if the accessed field is not visible from the current module. | 
|  | pub(crate) fn private_field(ctx: &DiagnosticsContext<'_>, d: &hir::PrivateField) -> Diagnostic { | 
|  | // FIXME: add quickfix | 
|  | Diagnostic::new_with_syntax_node_ptr( | 
|  | ctx, | 
|  | DiagnosticCode::RustcHardError("E0616"), | 
|  | format!( | 
|  | "field `{}` of `{}` is private", | 
|  | d.field.name(ctx.sema.db).display(ctx.sema.db, ctx.edition), | 
|  | d.field.parent_def(ctx.sema.db).name(ctx.sema.db).display(ctx.sema.db, ctx.edition) | 
|  | ), | 
|  | d.expr.map(|it| it.into()), | 
|  | ) | 
|  | .stable() | 
|  | } | 
|  |  | 
|  | #[cfg(test)] | 
|  | mod tests { | 
|  | use crate::tests::check_diagnostics; | 
|  |  | 
|  | #[test] | 
|  | fn private_field() { | 
|  | check_diagnostics( | 
|  | r#" | 
|  | mod module { pub struct Struct { field: u32 } } | 
|  | fn main(s: module::Struct) { | 
|  | s.field; | 
|  | //^^^^^^^ error: field `field` of `Struct` is private | 
|  | } | 
|  | "#, | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn private_tuple_field() { | 
|  | check_diagnostics( | 
|  | r#" | 
|  | mod module { pub struct Struct(u32); } | 
|  | fn main(s: module::Struct) { | 
|  | s.0; | 
|  | //^^^ error: field `0` of `Struct` is private | 
|  | } | 
|  | "#, | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn private_but_shadowed_in_deref() { | 
|  | check_diagnostics( | 
|  | r#" | 
|  | //- minicore: deref | 
|  | mod module { | 
|  | pub struct Struct { field: Inner } | 
|  | pub struct Inner { pub field: u32 } | 
|  | impl core::ops::Deref for Struct { | 
|  | type Target = Inner; | 
|  | fn deref(&self) -> &Inner { &self.field } | 
|  | } | 
|  | } | 
|  | fn main(s: module::Struct) { | 
|  | s.field; | 
|  | } | 
|  | "#, | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn block_module_madness() { | 
|  | check_diagnostics( | 
|  | r#" | 
|  | fn main() { | 
|  | let strukt = { | 
|  | use crate as ForceParentBlockDefMap; | 
|  | { | 
|  | pub struct Struct { | 
|  | field: (), | 
|  | } | 
|  | Struct { field: () } | 
|  | } | 
|  | }; | 
|  | strukt.field; | 
|  | } | 
|  | "#, | 
|  | ); | 
|  | } | 
|  |  | 
|  | #[test] | 
|  | fn block_module_madness2() { | 
|  | check_diagnostics( | 
|  | r#" | 
|  | fn main() { | 
|  | use crate as ForceParentBlockDefMap; | 
|  | let strukt = { | 
|  | use crate as ForceParentBlockDefMap; | 
|  | { | 
|  | pub struct Struct { | 
|  | field: (), | 
|  | } | 
|  | { | 
|  | use crate as ForceParentBlockDefMap; | 
|  | { | 
|  | Struct { field: () } | 
|  | } | 
|  | } | 
|  | } | 
|  | }; | 
|  | strukt.field; | 
|  | } | 
|  | "#, | 
|  | ); | 
|  | } | 
|  | } |