Auto merge of #92064 - matthiaskrgr:rollup-tgj2pai, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #91858 (pass -Wl,-z,origin to set DF_ORIGIN when using rpath) - #91923 (Remove `in_band_lifetimes` from `rustc_query_impl`) - #91925 (Remove `in_band_lifetimes` from `rustc_privacy`) - #91977 (Clean up search code and unify function returned values) - #92018 (Fix typo in "new region bound" suggestion) - #92022 (Eliminate duplicate codes of expected_found_bool) - #92032 (hir: Do not introduce dummy type names for `extern` blocks in def paths) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
d3848cb659
33 changed files with 186 additions and 195 deletions
|
@ -23,9 +23,12 @@ pub fn get_rpath_flags(config: &mut RPathConfig<'_>) -> Vec<String> {
|
||||||
let rpaths = get_rpaths(config);
|
let rpaths = get_rpaths(config);
|
||||||
let mut flags = rpaths_to_flags(&rpaths);
|
let mut flags = rpaths_to_flags(&rpaths);
|
||||||
|
|
||||||
// Use DT_RUNPATH instead of DT_RPATH if available
|
|
||||||
if config.linker_is_gnu {
|
if config.linker_is_gnu {
|
||||||
|
// Use DT_RUNPATH instead of DT_RPATH if available
|
||||||
flags.push("-Wl,--enable-new-dtags".to_owned());
|
flags.push("-Wl,--enable-new-dtags".to_owned());
|
||||||
|
|
||||||
|
// Set DF_ORIGIN for substitute $ORIGIN
|
||||||
|
flags.push("-Wl,-z,origin".to_owned());
|
||||||
}
|
}
|
||||||
|
|
||||||
flags
|
flags
|
||||||
|
|
|
@ -267,6 +267,8 @@ pub enum DefPathData {
|
||||||
// Different kinds of items and item-like things:
|
// Different kinds of items and item-like things:
|
||||||
/// An impl.
|
/// An impl.
|
||||||
Impl,
|
Impl,
|
||||||
|
/// An `extern` block.
|
||||||
|
ForeignMod,
|
||||||
/// Something in the type namespace.
|
/// Something in the type namespace.
|
||||||
TypeNs(Symbol),
|
TypeNs(Symbol),
|
||||||
/// Something in the value namespace.
|
/// Something in the value namespace.
|
||||||
|
@ -469,7 +471,9 @@ impl DefPathData {
|
||||||
match *self {
|
match *self {
|
||||||
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
|
TypeNs(name) | ValueNs(name) | MacroNs(name) | LifetimeNs(name) => Some(name),
|
||||||
|
|
||||||
Impl | CrateRoot | Misc | ClosureExpr | Ctor | AnonConst | ImplTrait => None,
|
Impl | ForeignMod | CrateRoot | Misc | ClosureExpr | Ctor | AnonConst | ImplTrait => {
|
||||||
|
None
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,6 +486,7 @@ impl DefPathData {
|
||||||
// Note that this does not show up in user print-outs.
|
// Note that this does not show up in user print-outs.
|
||||||
CrateRoot => DefPathDataName::Anon { namespace: kw::Crate },
|
CrateRoot => DefPathDataName::Anon { namespace: kw::Crate },
|
||||||
Impl => DefPathDataName::Anon { namespace: kw::Impl },
|
Impl => DefPathDataName::Anon { namespace: kw::Impl },
|
||||||
|
ForeignMod => DefPathDataName::Anon { namespace: kw::Extern },
|
||||||
Misc => DefPathDataName::Anon { namespace: sym::misc },
|
Misc => DefPathDataName::Anon { namespace: sym::misc },
|
||||||
ClosureExpr => DefPathDataName::Anon { namespace: sym::closure },
|
ClosureExpr => DefPathDataName::Anon { namespace: sym::closure },
|
||||||
Ctor => DefPathDataName::Anon { namespace: sym::constructor },
|
Ctor => DefPathDataName::Anon { namespace: sym::constructor },
|
||||||
|
|
|
@ -37,7 +37,7 @@ use crate::traits::{Obligation, PredicateObligations};
|
||||||
use rustc_data_structures::sso::SsoHashMap;
|
use rustc_data_structures::sso::SsoHashMap;
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
use rustc_middle::traits::ObligationCause;
|
use rustc_middle::traits::ObligationCause;
|
||||||
use rustc_middle::ty::error::TypeError;
|
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||||
use rustc_middle::ty::relate::{self, Relate, RelateResult, TypeRelation};
|
use rustc_middle::ty::relate::{self, Relate, RelateResult, TypeRelation};
|
||||||
use rustc_middle::ty::subst::SubstsRef;
|
use rustc_middle::ty::subst::SubstsRef;
|
||||||
use rustc_middle::ty::{self, InferConst, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
use rustc_middle::ty::{self, InferConst, ToPredicate, Ty, TyCtxt, TypeFoldable};
|
||||||
|
@ -790,7 +790,7 @@ pub fn const_unification_error<'tcx>(
|
||||||
a_is_expected: bool,
|
a_is_expected: bool,
|
||||||
(a, b): (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>),
|
(a, b): (&'tcx ty::Const<'tcx>, &'tcx ty::Const<'tcx>),
|
||||||
) -> TypeError<'tcx> {
|
) -> TypeError<'tcx> {
|
||||||
TypeError::ConstMismatch(ty::relate::expected_found_bool(a_is_expected, a, b))
|
TypeError::ConstMismatch(ExpectedFound::new(a_is_expected, a, b))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn int_unification_error<'tcx>(
|
fn int_unification_error<'tcx>(
|
||||||
|
@ -798,7 +798,7 @@ fn int_unification_error<'tcx>(
|
||||||
v: (ty::IntVarValue, ty::IntVarValue),
|
v: (ty::IntVarValue, ty::IntVarValue),
|
||||||
) -> TypeError<'tcx> {
|
) -> TypeError<'tcx> {
|
||||||
let (a, b) = v;
|
let (a, b) = v;
|
||||||
TypeError::IntMismatch(ty::relate::expected_found_bool(a_is_expected, a, b))
|
TypeError::IntMismatch(ExpectedFound::new(a_is_expected, a, b))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn float_unification_error<'tcx>(
|
fn float_unification_error<'tcx>(
|
||||||
|
@ -806,7 +806,7 @@ fn float_unification_error<'tcx>(
|
||||||
v: (ty::FloatVarValue, ty::FloatVarValue),
|
v: (ty::FloatVarValue, ty::FloatVarValue),
|
||||||
) -> TypeError<'tcx> {
|
) -> TypeError<'tcx> {
|
||||||
let (ty::FloatVarValue(a), ty::FloatVarValue(b)) = v;
|
let (ty::FloatVarValue(a), ty::FloatVarValue(b)) = v;
|
||||||
TypeError::FloatMismatch(ty::relate::expected_found_bool(a_is_expected, a, b))
|
TypeError::FloatMismatch(ExpectedFound::new(a_is_expected, a, b))
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ConstInferUnifier<'cx, 'tcx> {
|
struct ConstInferUnifier<'cx, 'tcx> {
|
||||||
|
|
|
@ -275,7 +275,7 @@ pub fn unexpected_hidden_region_diagnostic(
|
||||||
fn_returns,
|
fn_returns,
|
||||||
hidden_region.to_string(),
|
hidden_region.to_string(),
|
||||||
None,
|
None,
|
||||||
format!("captures {}", hidden_region),
|
format!("captures `{}`", hidden_region),
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1030,8 +1030,8 @@ impl<'tcx> LateContext<'tcx> {
|
||||||
) -> Result<Self::Path, Self::Error> {
|
) -> Result<Self::Path, Self::Error> {
|
||||||
let mut path = print_prefix(self)?;
|
let mut path = print_prefix(self)?;
|
||||||
|
|
||||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||||
if let DefPathData::Ctor = disambiguated_data.data {
|
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||||
return Ok(path);
|
return Ok(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1740,31 +1740,27 @@ impl<F: fmt::Write> Printer<'tcx> for FmtPrinter<'_, 'tcx, F> {
|
||||||
) -> Result<Self::Path, Self::Error> {
|
) -> Result<Self::Path, Self::Error> {
|
||||||
self = print_prefix(self)?;
|
self = print_prefix(self)?;
|
||||||
|
|
||||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||||
if let DefPathData::Ctor = disambiguated_data.data {
|
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||||
return Ok(self);
|
return Ok(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(eddyb) `name` should never be empty, but it
|
|
||||||
// currently is for `extern { ... }` "foreign modules".
|
|
||||||
let name = disambiguated_data.data.name();
|
let name = disambiguated_data.data.name();
|
||||||
if name != DefPathDataName::Named(kw::Empty) {
|
if !self.empty_path {
|
||||||
if !self.empty_path {
|
write!(self, "::")?;
|
||||||
write!(self, "::")?;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let DefPathDataName::Named(name) = name {
|
|
||||||
if Ident::with_dummy_span(name).is_raw_guess() {
|
|
||||||
write!(self, "r#")?;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let verbose = self.tcx.sess.verbose();
|
|
||||||
disambiguated_data.fmt_maybe_verbose(&mut self, verbose)?;
|
|
||||||
|
|
||||||
self.empty_path = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let DefPathDataName::Named(name) = name {
|
||||||
|
if Ident::with_dummy_span(name).is_raw_guess() {
|
||||||
|
write!(self, "r#")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let verbose = self.tcx.sess.verbose();
|
||||||
|
disambiguated_data.fmt_maybe_verbose(&mut self, verbose)?;
|
||||||
|
|
||||||
|
self.empty_path = false;
|
||||||
|
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -836,13 +836,5 @@ pub fn expected_found<R, T>(relation: &mut R, a: T, b: T) -> ExpectedFound<T>
|
||||||
where
|
where
|
||||||
R: TypeRelation<'tcx>,
|
R: TypeRelation<'tcx>,
|
||||||
{
|
{
|
||||||
expected_found_bool(relation.a_is_expected(), a, b)
|
ExpectedFound::new(relation.a_is_expected(), a, b)
|
||||||
}
|
|
||||||
|
|
||||||
pub fn expected_found_bool<T>(a_is_expected: bool, a: T, b: T) -> ExpectedFound<T> {
|
|
||||||
if a_is_expected {
|
|
||||||
ExpectedFound { expected: a, found: b }
|
|
||||||
} else {
|
|
||||||
ExpectedFound { expected: b, found: a }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||||
#![feature(in_band_lifetimes)]
|
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![feature(control_flow_enum)]
|
#![feature(control_flow_enum)]
|
||||||
#![feature(try_blocks)]
|
#![feature(try_blocks)]
|
||||||
|
@ -310,7 +309,7 @@ struct PubRestrictedVisitor<'tcx> {
|
||||||
has_pub_restricted: bool,
|
has_pub_restricted: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitor<'tcx> for PubRestrictedVisitor<'tcx> {
|
impl<'tcx> Visitor<'tcx> for PubRestrictedVisitor<'tcx> {
|
||||||
type Map = Map<'tcx>;
|
type Map = Map<'tcx>;
|
||||||
|
|
||||||
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map> {
|
fn nested_visit_map(&mut self) -> NestedVisitorMap<Self::Map> {
|
||||||
|
@ -432,7 +431,7 @@ struct ReachEverythingInTheInterfaceVisitor<'a, 'tcx> {
|
||||||
ev: &'a mut EmbargoVisitor<'tcx>,
|
ev: &'a mut EmbargoVisitor<'tcx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmbargoVisitor<'tcx> {
|
impl<'tcx> EmbargoVisitor<'tcx> {
|
||||||
fn get(&self, def_id: LocalDefId) -> Option<AccessLevel> {
|
fn get(&self, def_id: LocalDefId) -> Option<AccessLevel> {
|
||||||
self.access_levels.map.get(&def_id).copied()
|
self.access_levels.map.get(&def_id).copied()
|
||||||
}
|
}
|
||||||
|
@ -674,7 +673,7 @@ impl EmbargoVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Visitor<'tcx> for EmbargoVisitor<'tcx> {
|
impl<'tcx> Visitor<'tcx> for EmbargoVisitor<'tcx> {
|
||||||
type Map = Map<'tcx>;
|
type Map = Map<'tcx>;
|
||||||
|
|
||||||
/// We want to visit items in the context of their containing
|
/// We want to visit items in the context of their containing
|
||||||
|
@ -944,7 +943,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ReachEverythingInTheInterfaceVisitor<'_, 'tcx> {
|
impl ReachEverythingInTheInterfaceVisitor<'_, '_> {
|
||||||
fn generics(&mut self) -> &mut Self {
|
fn generics(&mut self) -> &mut Self {
|
||||||
for param in &self.ev.tcx.generics_of(self.item_def_id).params {
|
for param in &self.ev.tcx.generics_of(self.item_def_id).params {
|
||||||
match param.kind {
|
match param.kind {
|
||||||
|
@ -983,7 +982,7 @@ impl ReachEverythingInTheInterfaceVisitor<'_, 'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DefIdVisitor<'tcx> for ReachEverythingInTheInterfaceVisitor<'_, 'tcx> {
|
impl<'tcx> DefIdVisitor<'tcx> for ReachEverythingInTheInterfaceVisitor<'_, 'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.ev.tcx
|
self.ev.tcx
|
||||||
}
|
}
|
||||||
|
@ -1413,7 +1412,7 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DefIdVisitor<'tcx> for TypePrivacyVisitor<'tcx> {
|
impl<'tcx> DefIdVisitor<'tcx> for TypePrivacyVisitor<'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
|
@ -1800,7 +1799,7 @@ struct SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
||||||
in_assoc_ty: bool,
|
in_assoc_ty: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
impl SearchInterfaceForPrivateItemsVisitor<'_> {
|
||||||
fn generics(&mut self) -> &mut Self {
|
fn generics(&mut self) -> &mut Self {
|
||||||
for param in &self.tcx.generics_of(self.item_def_id).params {
|
for param in &self.tcx.generics_of(self.item_def_id).params {
|
||||||
match param.kind {
|
match param.kind {
|
||||||
|
@ -1921,7 +1920,7 @@ impl SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DefIdVisitor<'tcx> for SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
impl<'tcx> DefIdVisitor<'tcx> for SearchInterfaceForPrivateItemsVisitor<'tcx> {
|
||||||
fn tcx(&self) -> TyCtxt<'tcx> {
|
fn tcx(&self) -> TyCtxt<'tcx> {
|
||||||
self.tcx
|
self.tcx
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,7 +151,7 @@ impl Key for (DefId, DefId) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Key for (ty::Instance<'tcx>, LocalDefId) {
|
impl<'tcx> Key for (ty::Instance<'tcx>, LocalDefId) {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn query_crate_is_local(&self) -> bool {
|
fn query_crate_is_local(&self) -> bool {
|
||||||
true
|
true
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")]
|
||||||
#![feature(crate_visibility_modifier)]
|
#![feature(crate_visibility_modifier)]
|
||||||
#![feature(in_band_lifetimes)]
|
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![feature(min_specialization)]
|
#![feature(min_specialization)]
|
||||||
#![feature(once_cell)]
|
#![feature(once_cell)]
|
||||||
|
|
|
@ -212,7 +212,7 @@ impl<'sess> rustc_middle::ty::OnDiskCache<'sess> for OnDiskCache<'sess> {
|
||||||
/// Cache promotions require invoking queries, which needs to read the serialized data.
|
/// Cache promotions require invoking queries, which needs to read the serialized data.
|
||||||
/// In order to serialize the new on-disk cache, the former on-disk cache file needs to be
|
/// In order to serialize the new on-disk cache, the former on-disk cache file needs to be
|
||||||
/// deleted, hence we won't be able to refer to its memmapped data.
|
/// deleted, hence we won't be able to refer to its memmapped data.
|
||||||
fn drop_serialized_data(&self, tcx: TyCtxt<'tcx>) {
|
fn drop_serialized_data(&self, tcx: TyCtxt<'_>) {
|
||||||
// Load everything into memory so we can write it out to the on-disk
|
// Load everything into memory so we can write it out to the on-disk
|
||||||
// cache. The vast majority of cacheable query results should already
|
// cache. The vast majority of cacheable query results should already
|
||||||
// be in memory, so this should be a cheap operation.
|
// be in memory, so this should be a cheap operation.
|
||||||
|
|
|
@ -31,7 +31,7 @@ impl<'tcx> std::ops::Deref for QueryCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HasDepContext for QueryCtxt<'tcx> {
|
impl<'tcx> HasDepContext for QueryCtxt<'tcx> {
|
||||||
type DepKind = rustc_middle::dep_graph::DepKind;
|
type DepKind = rustc_middle::dep_graph::DepKind;
|
||||||
type DepContext = TyCtxt<'tcx>;
|
type DepContext = TyCtxt<'tcx>;
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ impl HasDepContext for QueryCtxt<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QueryContext for QueryCtxt<'tcx> {
|
impl QueryContext for QueryCtxt<'_> {
|
||||||
fn current_query_job(&self) -> Option<QueryJobId<Self::DepKind>> {
|
fn current_query_job(&self) -> Option<QueryJobId<Self::DepKind>> {
|
||||||
tls::with_related_context(**self, |icx| icx.query)
|
tls::with_related_context(**self, |icx| icx.query)
|
||||||
}
|
}
|
||||||
|
@ -130,7 +130,7 @@ impl<'tcx> QueryCtxt<'tcx> {
|
||||||
|
|
||||||
pub(super) fn encode_query_results(
|
pub(super) fn encode_query_results(
|
||||||
self,
|
self,
|
||||||
encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>,
|
encoder: &mut on_disk_cache::CacheEncoder<'_, 'tcx, opaque::FileEncoder>,
|
||||||
query_result_index: &mut on_disk_cache::EncodedDepNodeIndex,
|
query_result_index: &mut on_disk_cache::EncodedDepNodeIndex,
|
||||||
) -> opaque::FileEncodeResult {
|
) -> opaque::FileEncodeResult {
|
||||||
macro_rules! encode_queries {
|
macro_rules! encode_queries {
|
||||||
|
@ -511,7 +511,7 @@ macro_rules! define_queries_struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QueryEngine<'tcx> for Queries<'tcx> {
|
impl<'tcx> QueryEngine<'tcx> for Queries<'tcx> {
|
||||||
fn as_any(&'tcx self) -> &'tcx dyn std::any::Any {
|
fn as_any(&'tcx self) -> &'tcx dyn std::any::Any {
|
||||||
let this = unsafe { std::mem::transmute::<&Queries<'_>, &Queries<'_>>(self) };
|
let this = unsafe { std::mem::transmute::<&Queries<'_>, &Queries<'_>>(self) };
|
||||||
this as _
|
this as _
|
||||||
|
|
|
@ -295,7 +295,7 @@ fn alloc_self_profile_query_strings_for_query_cache<'tcx, C>(
|
||||||
/// If we are recording only summary data, the ids will point to
|
/// If we are recording only summary data, the ids will point to
|
||||||
/// just the query names. If we are recording query keys too, we
|
/// just the query names. If we are recording query keys too, we
|
||||||
/// allocate the corresponding strings here.
|
/// allocate the corresponding strings here.
|
||||||
pub fn alloc_self_profile_query_strings(tcx: TyCtxt<'tcx>) {
|
pub fn alloc_self_profile_query_strings(tcx: TyCtxt<'_>) {
|
||||||
if !tcx.prof.enabled() {
|
if !tcx.prof.enabled() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
|
||||||
// information we encapsulate into, the better
|
// information we encapsulate into, the better
|
||||||
let def_data = match &i.kind {
|
let def_data = match &i.kind {
|
||||||
ItemKind::Impl { .. } => DefPathData::Impl,
|
ItemKind::Impl { .. } => DefPathData::Impl,
|
||||||
|
ItemKind::ForeignMod(..) => DefPathData::ForeignMod,
|
||||||
ItemKind::Mod(..)
|
ItemKind::Mod(..)
|
||||||
| ItemKind::Trait(..)
|
| ItemKind::Trait(..)
|
||||||
| ItemKind::TraitAlias(..)
|
| ItemKind::TraitAlias(..)
|
||||||
|
@ -99,7 +100,6 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> {
|
||||||
| ItemKind::Struct(..)
|
| ItemKind::Struct(..)
|
||||||
| ItemKind::Union(..)
|
| ItemKind::Union(..)
|
||||||
| ItemKind::ExternCrate(..)
|
| ItemKind::ExternCrate(..)
|
||||||
| ItemKind::ForeignMod(..)
|
|
||||||
| ItemKind::TyAlias(..) => DefPathData::TypeNs(i.ident.name),
|
| ItemKind::TyAlias(..) => DefPathData::TypeNs(i.ident.name),
|
||||||
ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) => {
|
ItemKind::Static(..) | ItemKind::Const(..) | ItemKind::Fn(..) => {
|
||||||
DefPathData::ValueNs(i.ident.name)
|
DefPathData::ValueNs(i.ident.name)
|
||||||
|
|
|
@ -311,8 +311,8 @@ impl<'tcx> Printer<'tcx> for &mut SymbolPrinter<'tcx> {
|
||||||
) -> Result<Self::Path, Self::Error> {
|
) -> Result<Self::Path, Self::Error> {
|
||||||
self = print_prefix(self)?;
|
self = print_prefix(self)?;
|
||||||
|
|
||||||
// Skip `::{{constructor}}` on tuple/unit structs.
|
// Skip `::{{extern}}` blocks and `::{{constructor}}` on tuple/unit structs.
|
||||||
if let DefPathData::Ctor = disambiguated_data.data {
|
if let DefPathData::ForeignMod | DefPathData::Ctor = disambiguated_data.data {
|
||||||
return Ok(self);
|
return Ok(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -771,6 +771,10 @@ impl<'tcx> Printer<'tcx> for &mut SymbolMangler<'tcx> {
|
||||||
disambiguated_data: &DisambiguatedDefPathData,
|
disambiguated_data: &DisambiguatedDefPathData,
|
||||||
) -> Result<Self::Path, Self::Error> {
|
) -> Result<Self::Path, Self::Error> {
|
||||||
let ns = match disambiguated_data.data {
|
let ns = match disambiguated_data.data {
|
||||||
|
// FIXME: It shouldn't be necessary to add anything for extern block segments,
|
||||||
|
// but we add 't' for backward compatibility.
|
||||||
|
DefPathData::ForeignMod => 't',
|
||||||
|
|
||||||
// Uppercase categories are more stable than lowercase ones.
|
// Uppercase categories are more stable than lowercase ones.
|
||||||
DefPathData::TypeNs(_) => 't',
|
DefPathData::TypeNs(_) => 't',
|
||||||
DefPathData::ValueNs(_) => 'v',
|
DefPathData::ValueNs(_) => 'v',
|
||||||
|
|
|
@ -36,8 +36,8 @@ use rustc_infer::infer;
|
||||||
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
|
||||||
use rustc_infer::infer::InferOk;
|
use rustc_infer::infer::InferOk;
|
||||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AllowTwoPhase};
|
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AllowTwoPhase};
|
||||||
|
use rustc_middle::ty::error::ExpectedFound;
|
||||||
use rustc_middle::ty::error::TypeError::{FieldMisMatch, Sorts};
|
use rustc_middle::ty::error::TypeError::{FieldMisMatch, Sorts};
|
||||||
use rustc_middle::ty::relate::expected_found_bool;
|
|
||||||
use rustc_middle::ty::subst::SubstsRef;
|
use rustc_middle::ty::subst::SubstsRef;
|
||||||
use rustc_middle::ty::{self, AdtKind, Ty, TypeFoldable};
|
use rustc_middle::ty::{self, AdtKind, Ty, TypeFoldable};
|
||||||
use rustc_session::parse::feature_err;
|
use rustc_session::parse::feature_err;
|
||||||
|
@ -1493,7 +1493,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
&self.misc(base_expr.span),
|
&self.misc(base_expr.span),
|
||||||
adt_ty,
|
adt_ty,
|
||||||
base_ty,
|
base_ty,
|
||||||
Sorts(expected_found_bool(true, adt_ty, base_ty)),
|
Sorts(ExpectedFound::new(true, adt_ty, base_ty)),
|
||||||
)
|
)
|
||||||
.emit();
|
.emit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1176,6 +1176,7 @@ impl<'a> Builder<'a> {
|
||||||
rustflags.arg("-Zosx-rpath-install-name");
|
rustflags.arg("-Zosx-rpath-install-name");
|
||||||
Some("-Wl,-rpath,@loader_path/../lib")
|
Some("-Wl,-rpath,@loader_path/../lib")
|
||||||
} else if !target.contains("windows") {
|
} else if !target.contains("windows") {
|
||||||
|
rustflags.arg("-Clink-args=-Wl,-z,origin");
|
||||||
Some("-Wl,-rpath,$ORIGIN/../lib")
|
Some("-Wl,-rpath,$ORIGIN/../lib")
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
|
|
@ -8,6 +8,7 @@ use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
use rustc_hir::definitions::DefPathData;
|
||||||
use rustc_hir::Mutability;
|
use rustc_hir::Mutability;
|
||||||
use rustc_metadata::creader::{CStore, LoadedMacro};
|
use rustc_metadata::creader::{CStore, LoadedMacro};
|
||||||
use rustc_middle::ty::{self, TyCtxt};
|
use rustc_middle::ty::{self, TyCtxt};
|
||||||
|
@ -165,9 +166,8 @@ crate fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: ItemType)
|
||||||
let crate_name = cx.tcx.crate_name(did.krate).to_string();
|
let crate_name = cx.tcx.crate_name(did.krate).to_string();
|
||||||
|
|
||||||
let relative = cx.tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
let relative = cx.tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
||||||
// extern blocks have an empty name
|
// Filter out extern blocks
|
||||||
let s = elem.data.to_string();
|
(elem.data != DefPathData::ForeignMod).then(|| elem.data.to_string())
|
||||||
if !s.is_empty() { Some(s) } else { None }
|
|
||||||
});
|
});
|
||||||
let fqn = if let ItemType::Macro = kind {
|
let fqn = if let ItemType::Macro = kind {
|
||||||
// Check to see if it is a macro 2.0 or built-in macro
|
// Check to see if it is a macro 2.0 or built-in macro
|
||||||
|
|
|
@ -176,16 +176,13 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
var ar = [];
|
var ar = [];
|
||||||
for (var entry in results) {
|
for (var entry in results) {
|
||||||
if (hasOwnPropertyRustdoc(results, entry)) {
|
if (hasOwnPropertyRustdoc(results, entry)) {
|
||||||
ar.push(results[entry]);
|
var result = results[entry];
|
||||||
|
result.word = searchWords[result.id];
|
||||||
|
result.item = searchIndex[result.id] || {};
|
||||||
|
ar.push(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
results = ar;
|
results = ar;
|
||||||
var i, len, result;
|
|
||||||
for (i = 0, len = results.length; i < len; ++i) {
|
|
||||||
result = results[i];
|
|
||||||
result.word = searchWords[result.id];
|
|
||||||
result.item = searchIndex[result.id] || {};
|
|
||||||
}
|
|
||||||
// if there are no results then return to default and fail
|
// if there are no results then return to default and fail
|
||||||
if (results.length === 0) {
|
if (results.length === 0) {
|
||||||
return [];
|
return [];
|
||||||
|
@ -258,7 +255,7 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
return 0;
|
return 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
for (i = 0, len = results.length; i < len; ++i) {
|
for (var i = 0, len = results.length; i < len; ++i) {
|
||||||
result = results[i];
|
result = results[i];
|
||||||
|
|
||||||
// this validation does not make sense when searching by types
|
// this validation does not make sense when searching by types
|
||||||
|
@ -344,7 +341,17 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
return MAX_LEV_DISTANCE + 1;
|
return MAX_LEV_DISTANCE + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for type name and type generics (if any).
|
/**
|
||||||
|
* This function checks if the object (`obj`) matches the given type (`val`) and its
|
||||||
|
* generics (if any).
|
||||||
|
*
|
||||||
|
* @param {Object} obj
|
||||||
|
* @param {string} val
|
||||||
|
* @param {boolean} literalSearch
|
||||||
|
*
|
||||||
|
* @return {integer} - Returns a Levenshtein distance to the best match. If there is
|
||||||
|
* no match, returns `MAX_LEV_DISTANCE + 1`.
|
||||||
|
*/
|
||||||
function checkType(obj, val, literalSearch) {
|
function checkType(obj, val, literalSearch) {
|
||||||
var lev_distance = MAX_LEV_DISTANCE + 1;
|
var lev_distance = MAX_LEV_DISTANCE + 1;
|
||||||
var tmp_lev = MAX_LEV_DISTANCE + 1;
|
var tmp_lev = MAX_LEV_DISTANCE + 1;
|
||||||
|
@ -363,24 +370,23 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
elems[obj[GENERICS_DATA][x][NAME]] += 1;
|
elems[obj[GENERICS_DATA][x][NAME]] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
var allFound = true;
|
|
||||||
len = val.generics.length;
|
len = val.generics.length;
|
||||||
for (x = 0; x < len; ++x) {
|
for (x = 0; x < len; ++x) {
|
||||||
firstGeneric = val.generics[x];
|
firstGeneric = val.generics[x];
|
||||||
if (elems[firstGeneric]) {
|
if (elems[firstGeneric]) {
|
||||||
elems[firstGeneric] -= 1;
|
elems[firstGeneric] -= 1;
|
||||||
} else {
|
} else {
|
||||||
allFound = false;
|
// Something wasn't found and this is a literal search so
|
||||||
break;
|
// abort and return a "failing" distance.
|
||||||
|
return MAX_LEV_DISTANCE + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (allFound) {
|
// Everything was found, success!
|
||||||
return true;
|
return 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return MAX_LEV_DISTANCE + 1;
|
||||||
}
|
}
|
||||||
return true;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
// If the type has generics but don't match, then it won't return at this point.
|
// If the type has generics but don't match, then it won't return at this point.
|
||||||
// Otherwise, `checkGenerics` will return 0 and it'll return.
|
// Otherwise, `checkGenerics` will return 0 and it'll return.
|
||||||
|
@ -392,14 +398,15 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (literalSearch) {
|
} else if (literalSearch) {
|
||||||
|
var found = false;
|
||||||
if ((!val.generics || val.generics.length === 0) &&
|
if ((!val.generics || val.generics.length === 0) &&
|
||||||
obj.length > GENERICS_DATA && obj[GENERICS_DATA].length > 0) {
|
obj.length > GENERICS_DATA && obj[GENERICS_DATA].length > 0) {
|
||||||
return obj[GENERICS_DATA].some(
|
found = obj[GENERICS_DATA].some(
|
||||||
function(gen) {
|
function(gen) {
|
||||||
return gen[NAME] === val.name;
|
return gen[NAME] === val.name;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return false;
|
return found ? 0 : MAX_LEV_DISTANCE + 1;
|
||||||
}
|
}
|
||||||
lev_distance = Math.min(levenshtein(obj[NAME], val.name), lev_distance);
|
lev_distance = Math.min(levenshtein(obj[NAME], val.name), lev_distance);
|
||||||
if (lev_distance <= MAX_LEV_DISTANCE) {
|
if (lev_distance <= MAX_LEV_DISTANCE) {
|
||||||
|
@ -430,6 +437,17 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
return Math.min(lev_distance, tmp_lev) + 1;
|
return Math.min(lev_distance, tmp_lev) + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function checks if the object (`obj`) has an argument with the given type (`val`).
|
||||||
|
*
|
||||||
|
* @param {Object} obj
|
||||||
|
* @param {string} val
|
||||||
|
* @param {boolean} literalSearch
|
||||||
|
* @param {integer} typeFilter
|
||||||
|
*
|
||||||
|
* @return {integer} - Returns a Levenshtein distance to the best match. If there is no
|
||||||
|
* match, returns `MAX_LEV_DISTANCE + 1`.
|
||||||
|
*/
|
||||||
function findArg(obj, val, literalSearch, typeFilter) {
|
function findArg(obj, val, literalSearch, typeFilter) {
|
||||||
var lev_distance = MAX_LEV_DISTANCE + 1;
|
var lev_distance = MAX_LEV_DISTANCE + 1;
|
||||||
|
|
||||||
|
@ -441,19 +459,15 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmp = checkType(tmp, val, literalSearch);
|
tmp = checkType(tmp, val, literalSearch);
|
||||||
if (literalSearch) {
|
if (tmp === 0) {
|
||||||
if (tmp) {
|
return 0;
|
||||||
return true;
|
} else if (literalSearch) {
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
lev_distance = Math.min(tmp, lev_distance);
|
lev_distance = Math.min(tmp, lev_distance);
|
||||||
if (lev_distance === 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return literalSearch ? false : lev_distance;
|
return literalSearch ? MAX_LEV_DISTANCE + 1 : lev_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkReturned(obj, val, literalSearch, typeFilter) {
|
function checkReturned(obj, val, literalSearch, typeFilter) {
|
||||||
|
@ -470,19 +484,15 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmp = checkType(tmp, val, literalSearch);
|
tmp = checkType(tmp, val, literalSearch);
|
||||||
if (literalSearch) {
|
if (tmp === 0) {
|
||||||
if (tmp) {
|
return 0;
|
||||||
return true;
|
} else if (literalSearch) {
|
||||||
}
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
lev_distance = Math.min(tmp, lev_distance);
|
lev_distance = Math.min(tmp, lev_distance);
|
||||||
if (lev_distance === 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return literalSearch ? false : lev_distance;
|
return literalSearch ? MAX_LEV_DISTANCE + 1 : lev_distance;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkPath(contains, lastElem, ty) {
|
function checkPath(contains, lastElem, ty) {
|
||||||
|
@ -612,6 +622,44 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
onEach(crateAliases, pushFunc);
|
onEach(crateAliases, pushFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function adds the given result into the provided `res` map if it matches the
|
||||||
|
* following condition:
|
||||||
|
*
|
||||||
|
* * If it is a "literal search" (`isExact`), then `lev` must be 0.
|
||||||
|
* * If it is not a "literal search", `lev` must be <= `MAX_LEV_DISTANCE`.
|
||||||
|
*
|
||||||
|
* The `res` map contains information which will be used to sort the search results:
|
||||||
|
*
|
||||||
|
* * `fullId` is a `string`` used as the key of the object we use for the `res` map.
|
||||||
|
* * `id` is the index in both `searchWords` and `searchIndex` arrays for this element.
|
||||||
|
* * `index` is an `integer`` used to sort by the position of the word in the item's name.
|
||||||
|
* * `lev` is the main metric used to sort the search results.
|
||||||
|
*
|
||||||
|
* @param {boolean} isExact
|
||||||
|
* @param {Object} res
|
||||||
|
* @param {string} fullId
|
||||||
|
* @param {integer} id
|
||||||
|
* @param {integer} index
|
||||||
|
* @param {integer} lev
|
||||||
|
*/
|
||||||
|
function addIntoResults(isExact, res, fullId, id, index, lev) {
|
||||||
|
if (lev === 0 || (!isExact && lev <= MAX_LEV_DISTANCE)) {
|
||||||
|
if (res[fullId] !== undefined) {
|
||||||
|
var result = res[fullId];
|
||||||
|
if (result.dontValidate || result.lev <= lev) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res[fullId] = {
|
||||||
|
id: id,
|
||||||
|
index: index,
|
||||||
|
dontValidate: isExact,
|
||||||
|
lev: lev,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// quoted values mean literal search
|
// quoted values mean literal search
|
||||||
var nSearchWords = searchWords.length;
|
var nSearchWords = searchWords.length;
|
||||||
var i, it;
|
var i, it;
|
||||||
|
@ -634,28 +682,11 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
fullId = ty.id;
|
fullId = ty.id;
|
||||||
|
|
||||||
if (searchWords[i] === val.name
|
if (searchWords[i] === val.name
|
||||||
&& typePassesFilter(typeFilter, searchIndex[i].ty)
|
&& typePassesFilter(typeFilter, searchIndex[i].ty)) {
|
||||||
&& results[fullId] === undefined) {
|
addIntoResults(true, results, fullId, i, -1, 0);
|
||||||
results[fullId] = {
|
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (in_args && results_in_args[fullId] === undefined) {
|
|
||||||
results_in_args[fullId] = {
|
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (returned && results_returned[fullId] === undefined) {
|
|
||||||
results_returned[fullId] = {
|
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
addIntoResults(true, results_in_args, fullId, i, -1, in_args);
|
||||||
|
addIntoResults(true, results_returned, fullId, i, -1, returned);
|
||||||
}
|
}
|
||||||
query.inputs = [val];
|
query.inputs = [val];
|
||||||
query.output = val;
|
query.output = val;
|
||||||
|
@ -684,39 +715,27 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
fullId = ty.id;
|
fullId = ty.id;
|
||||||
|
|
||||||
returned = checkReturned(ty, output, true, NO_TYPE_FILTER);
|
returned = checkReturned(ty, output, true, NO_TYPE_FILTER);
|
||||||
if (output.name === "*" || returned) {
|
if (output.name === "*" || returned === 0) {
|
||||||
in_args = false;
|
in_args = false;
|
||||||
var is_module = false;
|
var is_module = false;
|
||||||
|
|
||||||
if (input === "*") {
|
if (input === "*") {
|
||||||
is_module = true;
|
is_module = true;
|
||||||
} else {
|
} else {
|
||||||
var allFound = true;
|
var firstNonZeroDistance = 0;
|
||||||
for (it = 0, len = inputs.length; allFound && it < len; it++) {
|
for (it = 0, len = inputs.length; it < len; it++) {
|
||||||
allFound = checkType(type, inputs[it], true);
|
var distance = checkType(type, inputs[it], true);
|
||||||
|
if (distance > 0) {
|
||||||
|
firstNonZeroDistance = distance;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
in_args = allFound;
|
in_args = firstNonZeroDistance;
|
||||||
}
|
|
||||||
if (in_args) {
|
|
||||||
results_in_args[fullId] = {
|
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
if (returned) {
|
|
||||||
results_returned[fullId] = {
|
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
addIntoResults(true, results_in_args, fullId, i, -1, in_args);
|
||||||
|
addIntoResults(true, results_returned, fullId, i, -1, returned);
|
||||||
if (is_module) {
|
if (is_module) {
|
||||||
results[fullId] = {
|
addIntoResults(true, results, fullId, i, -1, 0);
|
||||||
id: i,
|
|
||||||
index: -1,
|
|
||||||
dontValidate: true,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -788,41 +807,14 @@ window.initSearch = function(rawSearchIndex) {
|
||||||
lev = 0;
|
lev = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (in_args <= MAX_LEV_DISTANCE) {
|
addIntoResults(false, results_in_args, fullId, j, index, in_args);
|
||||||
if (results_in_args[fullId] === undefined) {
|
addIntoResults(false, results_returned, fullId, j, index, returned);
|
||||||
results_in_args[fullId] = {
|
|
||||||
id: j,
|
|
||||||
index: index,
|
|
||||||
lev: in_args,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
results_in_args[fullId].lev =
|
|
||||||
Math.min(results_in_args[fullId].lev, in_args);
|
|
||||||
}
|
|
||||||
if (returned <= MAX_LEV_DISTANCE) {
|
|
||||||
if (results_returned[fullId] === undefined) {
|
|
||||||
results_returned[fullId] = {
|
|
||||||
id: j,
|
|
||||||
index: index,
|
|
||||||
lev: returned,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
results_returned[fullId].lev =
|
|
||||||
Math.min(results_returned[fullId].lev, returned);
|
|
||||||
}
|
|
||||||
if (typePassesFilter(typeFilter, ty.ty) &&
|
if (typePassesFilter(typeFilter, ty.ty) &&
|
||||||
(index !== -1 || lev <= MAX_LEV_DISTANCE)) {
|
(index !== -1 || lev <= MAX_LEV_DISTANCE)) {
|
||||||
if (index !== -1 && paths.length < 2) {
|
if (index !== -1 && paths.length < 2) {
|
||||||
lev = 0;
|
lev = 0;
|
||||||
}
|
}
|
||||||
if (results[fullId] === undefined) {
|
addIntoResults(false, results, fullId, j, index, lev);
|
||||||
results[fullId] = {
|
|
||||||
id: j,
|
|
||||||
index: index,
|
|
||||||
lev: lev,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
results[fullId].lev = Math.min(results[fullId].lev, lev);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{DefKind, Res};
|
use rustc_hir::def::{DefKind, Res};
|
||||||
use rustc_hir::def_id::DefId;
|
use rustc_hir::def_id::DefId;
|
||||||
|
use rustc_hir::definitions::DefPathData;
|
||||||
use rustc_hir::Node;
|
use rustc_hir::Node;
|
||||||
use rustc_hir::CRATE_HIR_ID;
|
use rustc_hir::CRATE_HIR_ID;
|
||||||
use rustc_middle::middle::privacy::AccessLevel;
|
use rustc_middle::middle::privacy::AccessLevel;
|
||||||
|
@ -45,9 +46,8 @@ impl Module<'hir> {
|
||||||
fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec<String> {
|
fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec<String> {
|
||||||
let crate_name = tcx.crate_name(did.krate).to_string();
|
let crate_name = tcx.crate_name(did.krate).to_string();
|
||||||
let relative = tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
let relative = tcx.def_path(did).data.into_iter().filter_map(|elem| {
|
||||||
// extern blocks have an empty name
|
// Filter out extern blocks
|
||||||
let s = elem.data.to_string();
|
(elem.data != DefPathData::ForeignMod).then(|| elem.data.to_string())
|
||||||
if !s.is_empty() { Some(s) } else { None }
|
|
||||||
});
|
});
|
||||||
std::iter::once(crate_name).chain(relative).collect()
|
std::iter::once(crate_name).chain(relative).collect()
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<
|
||||||
| |
|
| |
|
||||||
| hidden type `(&'a u8, &'b u8)` captures the lifetime `'b` as defined here
|
| hidden type `(&'a u8, &'b u8)` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -16,7 +16,7 @@ LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<
|
||||||
| |
|
| |
|
||||||
| hidden type `(&'a u8, &'b u8)` captures the lifetime `'b` as defined here
|
| hidden type `(&'a u8, &'b u8)` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
LL | async fn async_ret_impl_trait1<'a, 'b>(a: &'a u8, b: &'b u8) -> impl Trait<'a> + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn hide_ref<'a, 'b, T: 'static>(x: &'a mut &'b T) -> impl Swap + 'a {
|
||||||
| |
|
| |
|
||||||
| hidden type `&'a mut &'b T` captures the lifetime `'b` as defined here
|
| hidden type `&'a mut &'b T` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn hide_ref<'a, 'b, T: 'static>(x: &'a mut &'b T) -> impl Swap + 'a + 'b {
|
LL | fn hide_ref<'a, 'b, T: 'static>(x: &'a mut &'b T) -> impl Swap + 'a + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -19,7 +19,7 @@ LL | fn hide_rc_refcell<'a, 'b: 'a, T: 'static>(x: Rc<RefCell<&'b T>>) -> impl S
|
||||||
| |
|
| |
|
||||||
| hidden type `Rc<RefCell<&'b T>>` captures the lifetime `'b` as defined here
|
| hidden type `Rc<RefCell<&'b T>>` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn hide_rc_refcell<'a, 'b: 'a, T: 'static>(x: Rc<RefCell<&'b T>>) -> impl Swap + 'a + 'b {
|
LL | fn hide_rc_refcell<'a, 'b: 'a, T: 'static>(x: Rc<RefCell<&'b T>>) -> impl Swap + 'a + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn upper_bounds<'a, 'b, 'c, 'd, 'e>(a: Ordinary<'a>, b: Ordinary<'b>) -> im
|
||||||
| |
|
| |
|
||||||
| hidden type `Ordinary<'b>` captures the lifetime `'b` as defined here
|
| hidden type `Ordinary<'b>` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn upper_bounds<'a, 'b, 'c, 'd, 'e>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'d, 'e> + 'b
|
LL | fn upper_bounds<'a, 'b, 'c, 'd, 'e>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'d, 'e> + 'b
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn upper_bounds<'a, 'b>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'a,
|
||||||
| |
|
| |
|
||||||
| hidden type `Ordinary<'b>` captures the lifetime `'b` as defined here
|
| hidden type `Ordinary<'b>` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn upper_bounds<'a, 'b>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'a, 'b> + 'b
|
LL | fn upper_bounds<'a, 'b>(a: Ordinary<'a>, b: Ordinary<'b>) -> impl Trait<'a, 'b> + 'b
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn elided(x: &i32) -> impl Copy { x }
|
||||||
| |
|
| |
|
||||||
| hidden type `&i32` captures the anonymous lifetime defined here
|
| hidden type `&i32` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -19,7 +19,7 @@ LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||||
| |
|
| |
|
||||||
| hidden type `&'a i32` captures the lifetime `'a` as defined here
|
| hidden type `&'a i32` captures the lifetime `'a` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'a, you can add an explicit `'a` lifetime bound
|
help: to declare that the `impl Trait` captures `'a`, you can add an explicit `'a` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -74,7 +74,7 @@ LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32
|
||||||
| |
|
| |
|
||||||
| hidden type `[closure@$DIR/must_outlive_least_region_or_bound.rs:35:5: 35:31]` captures the lifetime `'b` as defined here
|
| hidden type `[closure@$DIR/must_outlive_least_region_or_bound.rs:35:5: 35:31]` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) + 'b {
|
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn elided(x: &i32) -> impl Copy { x }
|
||||||
| |
|
| |
|
||||||
| hidden type `&i32` captures the anonymous lifetime defined here
|
| hidden type `&i32` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
LL | fn elided(x: &i32) -> impl Copy + '_ { x }
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -19,7 +19,7 @@ LL | fn explicit<'a>(x: &'a i32) -> impl Copy { x }
|
||||||
| |
|
| |
|
||||||
| hidden type `&'a i32` captures the lifetime `'a` as defined here
|
| hidden type `&'a i32` captures the lifetime `'a` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'a, you can add an explicit `'a` lifetime bound
|
help: to declare that the `impl Trait` captures `'a`, you can add an explicit `'a` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
LL | fn explicit<'a>(x: &'a i32) -> impl Copy + 'a { x }
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -119,7 +119,7 @@ LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32
|
||||||
| |
|
| |
|
||||||
| hidden type `[closure@$DIR/must_outlive_least_region_or_bound.rs:35:5: 35:31]` captures the lifetime `'b` as defined here
|
| hidden type `[closure@$DIR/must_outlive_least_region_or_bound.rs:35:5: 35:31]` captures the lifetime `'b` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'b, you can add an explicit `'b` lifetime bound
|
help: to declare that the `impl Trait` captures `'b`, you can add an explicit `'b` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) + 'b {
|
LL | fn move_lifetime_into_fn<'a, 'b>(x: &'a u32, y: &'b u32) -> impl Fn(&'a u32) + 'b {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -7,7 +7,7 @@ LL |
|
||||||
LL | where 'x: 'y
|
LL | where 'x: 'y
|
||||||
| -- hidden type `Cell<&'x u32>` captures the lifetime `'x` as defined here
|
| -- hidden type `Cell<&'x u32>` captures the lifetime `'x` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'x, you can add an explicit `'x` lifetime bound
|
help: to declare that the `impl Trait` captures `'x`, you can add an explicit `'x` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn foo(x: Cell<&'x u32>) -> impl Trait<'y> + 'x
|
LL | fn foo(x: Cell<&'x u32>) -> impl Trait<'y> + 'x
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> {
|
||||||
| |
|
| |
|
||||||
| hidden type `Map<std::slice::Iter<'_, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:9:27: 9:34]>` captures the anonymous lifetime defined here
|
| hidden type `Map<std::slice::Iter<'_, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:9:27: 9:34]>` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -19,7 +19,7 @@ LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> {
|
||||||
| |
|
| |
|
||||||
| hidden type `Map<std::slice::Iter<'_, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:9:27: 9:34]>` captures the anonymous lifetime defined here
|
| hidden type `Map<std::slice::Iter<'_, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:9:27: 9:34]>` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
LL | fn iter_values_anon(&self) -> impl Iterator<Item=u32> + '_ {
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -32,7 +32,7 @@ LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||||
| |
|
| |
|
||||||
| hidden type `Map<std::slice::Iter<'a, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:14:27: 14:34]>` captures the lifetime `'a` as defined here
|
| hidden type `Map<std::slice::Iter<'a, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:14:27: 14:34]>` captures the lifetime `'a` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'a, you can add an explicit `'a` lifetime bound
|
help: to declare that the `impl Trait` captures `'a`, you can add an explicit `'a` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a {
|
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a {
|
||||||
| ++++
|
| ++++
|
||||||
|
@ -45,7 +45,7 @@ LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> {
|
||||||
| |
|
| |
|
||||||
| hidden type `Map<std::slice::Iter<'a, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:14:27: 14:34]>` captures the lifetime `'a` as defined here
|
| hidden type `Map<std::slice::Iter<'a, (u32, u32)>, [closure@$DIR/static-return-lifetime-infered.rs:14:27: 14:34]>` captures the lifetime `'a` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures 'a, you can add an explicit `'a` lifetime bound
|
help: to declare that the `impl Trait` captures `'a`, you can add an explicit `'a` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a {
|
LL | fn iter_values<'a>(&'a self) -> impl Iterator<Item=u32> + 'a {
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> {
|
||||||
| |
|
| |
|
||||||
| hidden type `&ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0)) T` captures the anonymous lifetime defined here
|
| hidden type `&ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0)) T` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0)), you can add an explicit `ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0))` lifetime bound
|
help: to declare that the `impl Trait` captures `ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0))`, you can add an explicit `ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0))` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> + ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0)) {
|
LL | fn foo<'a, T>(x: &T) -> impl Foo<'a> + ReFree(DefId(0:8 ~ impl_trait_captures[HASH]::foo), BrAnon(0)) {
|
||||||
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | async fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||||
| |
|
| |
|
||||||
| hidden type `Pin<&Foo>` captures the lifetime `'_` as defined here
|
| hidden type `Pin<&Foo>` captures the lifetime `'_` as defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | async fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
LL | async fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
||||||
| ++++
|
| ++++
|
||||||
|
|
|
@ -6,7 +6,7 @@ LL | fn f(self: Pin<&Self>) -> impl Clone { self }
|
||||||
| |
|
| |
|
||||||
| hidden type `Pin<&Foo>` captures the anonymous lifetime defined here
|
| hidden type `Pin<&Foo>` captures the anonymous lifetime defined here
|
||||||
|
|
|
|
||||||
help: to declare that the `impl Trait` captures '_, you can add an explicit `'_` lifetime bound
|
help: to declare that the `impl Trait` captures `'_`, you can add an explicit `'_` lifetime bound
|
||||||
|
|
|
|
||||||
LL | fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
LL | fn f(self: Pin<&Self>) -> impl Clone + '_ { self }
|
||||||
| ++++
|
| ++++
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue