ide_diagnostics/handlers/
private_field.rsuse crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
pub(crate) fn private_field(ctx: &DiagnosticsContext<'_>, d: &hir::PrivateField) -> Diagnostic {
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()),
)
}
#[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;
}
"#,
);
}
}