Consider inner modules to be local in the non_local_definitions lint

This commit is contained in:
Urgau 2024-04-26 21:14:37 +02:00
parent e27af2917b
commit 21c688af86
2 changed files with 49 additions and 5 deletions

View File

@ -356,7 +356,7 @@ fn path_has_local_parent(
}
/// Given a def id and a parent impl def id, this checks if the parent
/// def id correspond to the def id of the parent impl definition.
/// def id (modulo modules) correspond to the def id of the parent impl definition.
#[inline]
fn did_has_local_parent(
did: DefId,
@ -364,8 +364,14 @@ fn did_has_local_parent(
impl_parent: DefId,
impl_parent_parent: Option<DefId>,
) -> bool {
did.is_local() && {
let res_parent = tcx.parent(did);
res_parent == impl_parent || Some(res_parent) == impl_parent_parent
}
did.is_local()
&& if let Some(did_parent) = tcx.opt_parent(did) {
did_parent == impl_parent
|| Some(did_parent) == impl_parent_parent
|| !did_parent.is_crate_root()
&& tcx.def_kind(did_parent) == DefKind::Mod
&& did_has_local_parent(did_parent, tcx, impl_parent, impl_parent_parent)
} else {
false
}
}

View File

@ -0,0 +1,38 @@
//! This test checks that module are treated as if they were local
//!
//! https://github.com/rust-lang/rust/issues/124396
//@ check-pass
trait JoinTo {}
fn simple_one() {
mod posts {
#[allow(non_camel_case_types)]
pub struct table {}
}
impl JoinTo for posts::table {}
}
fn simple_two() {
mod posts {
pub mod posts {
#[allow(non_camel_case_types)]
pub struct table {}
}
}
impl JoinTo for posts::posts::table {}
}
struct Global;
fn trait_() {
mod posts {
pub trait AdjecentTo {}
}
impl posts::AdjecentTo for Global {}
}
fn main() {}