Auto merge of #111076 - notriddle:notriddle/silence-private-dep-trait-impl-suggestions, r=cjgillot
diagnostics: exclude indirect private deps from trait impl suggest Fixes #88696
This commit is contained in:
commit
ad8304a0d5
21 changed files with 136 additions and 31 deletions
|
@ -365,6 +365,7 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
|||
lib: Library,
|
||||
dep_kind: CrateDepKind,
|
||||
name: Symbol,
|
||||
private_dep: Option<bool>,
|
||||
) -> Result<CrateNum, CrateError> {
|
||||
let _prof_timer = self.sess.prof.generic_activity("metadata_register_crate");
|
||||
|
||||
|
@ -372,8 +373,13 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
|||
let crate_root = metadata.get_root();
|
||||
let host_hash = host_lib.as_ref().map(|lib| lib.metadata.get_root().hash());
|
||||
|
||||
let private_dep =
|
||||
self.sess.opts.externs.get(name.as_str()).is_some_and(|e| e.is_private_dep);
|
||||
let private_dep = self
|
||||
.sess
|
||||
.opts
|
||||
.externs
|
||||
.get(name.as_str())
|
||||
.map_or(private_dep.unwrap_or(false), |e| e.is_private_dep)
|
||||
&& private_dep.unwrap_or(true);
|
||||
|
||||
// Claim this crate number and cache it
|
||||
let cnum = self.cstore.intern_stable_crate_id(&crate_root)?;
|
||||
|
@ -518,15 +524,16 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
|||
if !name.as_str().is_ascii() {
|
||||
return Err(CrateError::NonAsciiName(name));
|
||||
}
|
||||
let (root, hash, host_hash, extra_filename, path_kind) = match dep {
|
||||
let (root, hash, host_hash, extra_filename, path_kind, private_dep) = match dep {
|
||||
Some((root, dep)) => (
|
||||
Some(root),
|
||||
Some(dep.hash),
|
||||
dep.host_hash,
|
||||
Some(&dep.extra_filename[..]),
|
||||
PathKind::Dependency,
|
||||
Some(dep.is_private),
|
||||
),
|
||||
None => (None, None, None, None, PathKind::Crate),
|
||||
None => (None, None, None, None, PathKind::Crate, None),
|
||||
};
|
||||
let result = if let Some(cnum) = self.existing_match(name, hash, path_kind) {
|
||||
(LoadResult::Previous(cnum), None)
|
||||
|
@ -562,10 +569,13 @@ impl<'a, 'tcx> CrateLoader<'a, 'tcx> {
|
|||
dep_kind = CrateDepKind::MacrosOnly;
|
||||
}
|
||||
data.update_dep_kind(|data_dep_kind| cmp::max(data_dep_kind, dep_kind));
|
||||
if let Some(private_dep) = private_dep {
|
||||
data.update_and_private_dep(private_dep);
|
||||
}
|
||||
Ok(cnum)
|
||||
}
|
||||
(LoadResult::Loaded(library), host_library) => {
|
||||
self.register_crate(host_library, root, library, dep_kind, name)
|
||||
self.register_crate(host_library, root, library, dep_kind, name, private_dep)
|
||||
}
|
||||
_ => panic!(),
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ use rustc_data_structures::captures::Captures;
|
|||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_data_structures::owned_slice::OwnedSlice;
|
||||
use rustc_data_structures::svh::Svh;
|
||||
use rustc_data_structures::sync::{AppendOnlyVec, Lock, Lrc, OnceCell};
|
||||
use rustc_data_structures::sync::{AppendOnlyVec, AtomicBool, Lock, Lrc, OnceCell};
|
||||
use rustc_data_structures::unhash::UnhashMap;
|
||||
use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind};
|
||||
use rustc_expand::proc_macro::{AttrProcMacro, BangProcMacro, DeriveProcMacro};
|
||||
|
@ -40,6 +40,7 @@ use proc_macro::bridge::client::ProcMacro;
|
|||
use std::iter::TrustedLen;
|
||||
use std::num::NonZeroUsize;
|
||||
use std::path::Path;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::{io, iter, mem};
|
||||
|
||||
pub(super) use cstore_impl::provide;
|
||||
|
@ -112,9 +113,10 @@ pub(crate) struct CrateMetadata {
|
|||
dep_kind: Lock<CrateDepKind>,
|
||||
/// Filesystem location of this crate.
|
||||
source: Lrc<CrateSource>,
|
||||
/// Whether or not this crate should be consider a private dependency
|
||||
/// for purposes of the 'exported_private_dependencies' lint
|
||||
private_dep: bool,
|
||||
/// Whether or not this crate should be consider a private dependency.
|
||||
/// Used by the 'exported_private_dependencies' lint, and for determining
|
||||
/// whether to emit suggestions that reference this crate.
|
||||
private_dep: AtomicBool,
|
||||
/// The hash for the host proc macro. Used to support `-Z dual-proc-macro`.
|
||||
host_hash: Option<Svh>,
|
||||
|
||||
|
@ -701,12 +703,13 @@ impl MetadataBlob {
|
|||
writeln!(out, "=External Dependencies=")?;
|
||||
|
||||
for (i, dep) in root.crate_deps.decode(self).enumerate() {
|
||||
let CrateDep { name, extra_filename, hash, host_hash, kind } = dep;
|
||||
let CrateDep { name, extra_filename, hash, host_hash, kind, is_private } = dep;
|
||||
let number = i + 1;
|
||||
|
||||
writeln!(
|
||||
out,
|
||||
"{number} {name}{extra_filename} hash {hash} host_hash {host_hash:?} kind {kind:?}"
|
||||
"{number} {name}{extra_filename} hash {hash} host_hash {host_hash:?} kind {kind:?} {privacy}",
|
||||
privacy = if is_private { "private" } else { "public" }
|
||||
)?;
|
||||
}
|
||||
write!(out, "\n")?;
|
||||
|
@ -1624,7 +1627,7 @@ impl CrateMetadata {
|
|||
dependencies,
|
||||
dep_kind: Lock::new(dep_kind),
|
||||
source: Lrc::new(source),
|
||||
private_dep,
|
||||
private_dep: AtomicBool::new(private_dep),
|
||||
host_hash,
|
||||
extern_crate: Lock::new(None),
|
||||
hygiene_context: Default::default(),
|
||||
|
@ -1672,6 +1675,10 @@ impl CrateMetadata {
|
|||
self.dep_kind.with_lock(|dep_kind| *dep_kind = f(*dep_kind))
|
||||
}
|
||||
|
||||
pub(crate) fn update_and_private_dep(&self, private_dep: bool) {
|
||||
self.private_dep.fetch_and(private_dep, Ordering::SeqCst);
|
||||
}
|
||||
|
||||
pub(crate) fn required_panic_strategy(&self) -> Option<PanicStrategy> {
|
||||
self.root.required_panic_strategy
|
||||
}
|
||||
|
|
|
@ -285,7 +285,13 @@ provide! { tcx, def_id, other, cdata,
|
|||
is_ctfe_mir_available => { cdata.is_ctfe_mir_available(def_id.index) }
|
||||
|
||||
dylib_dependency_formats => { cdata.get_dylib_dependency_formats(tcx) }
|
||||
is_private_dep => { cdata.private_dep }
|
||||
is_private_dep => {
|
||||
// Parallel compiler needs to synchronize type checking and linting (which use this flag)
|
||||
// so that they happen strictly crate loading. Otherwise, the full list of available
|
||||
// impls aren't loaded yet.
|
||||
use std::sync::atomic::Ordering;
|
||||
cdata.private_dep.load(Ordering::Acquire)
|
||||
}
|
||||
is_panic_runtime => { cdata.root.panic_runtime }
|
||||
is_compiler_builtins => { cdata.root.compiler_builtins }
|
||||
has_global_allocator => { cdata.root.has_global_allocator }
|
||||
|
|
|
@ -1883,6 +1883,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
|
|||
host_hash: self.tcx.crate_host_hash(cnum),
|
||||
kind: self.tcx.dep_kind(cnum),
|
||||
extra_filename: self.tcx.extra_filename(cnum).clone(),
|
||||
is_private: self.tcx.is_private_dep(cnum),
|
||||
};
|
||||
(cnum, dep)
|
||||
})
|
||||
|
|
|
@ -322,6 +322,7 @@ pub(crate) struct CrateDep {
|
|||
pub host_hash: Option<Svh>,
|
||||
pub kind: CrateDepKind,
|
||||
pub extra_filename: String,
|
||||
pub is_private: bool,
|
||||
}
|
||||
|
||||
#[derive(MetadataEncodable, MetadataDecodable)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue