Rollup merge of #139669 - nnethercote:overhaul-AssocItem, r=oli-obk
Overhaul `AssocItem` `AssocItem` has multiple fields that only make sense some of the time. E.g. the `name` can be empty if it's an RPITIT associated type. It's clearer and less error prone if these fields are moved to the relevant `kind` variants. r? ``@fee1-dead``
This commit is contained in:
commit
13cd5256ac
86 changed files with 609 additions and 546 deletions
|
|
@ -111,8 +111,8 @@ impl<'tcx> LateLintPass<'tcx> for AssigningClones {
|
|||
// Only suggest if `clone_from`/`clone_into` is explicitly implemented
|
||||
&& resolved_assoc_items.in_definition_order().any(|assoc|
|
||||
match which_trait {
|
||||
CloneTrait::Clone => assoc.name == sym::clone_from,
|
||||
CloneTrait::ToOwned => assoc.name.as_str() == "clone_into",
|
||||
CloneTrait::Clone => assoc.name() == sym::clone_from,
|
||||
CloneTrait::ToOwned => assoc.name().as_str() == "clone_into",
|
||||
}
|
||||
)
|
||||
&& !clone_source_borrows_from_dest(cx, lhs, rhs.span)
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ fn is_impl_not_trait_with_bool_out<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -
|
|||
cx.tcx.associated_items(trait_id).find_by_ident_and_kind(
|
||||
cx.tcx,
|
||||
Ident::from_str("Output"),
|
||||
ty::AssocKind::Type,
|
||||
ty::AssocTag::Type,
|
||||
trait_id,
|
||||
)
|
||||
})
|
||||
|
|
|
|||
|
|
@ -550,7 +550,7 @@ impl<'tcx> FormatArgsExpr<'_, 'tcx> {
|
|||
// a `Target` that is in `self.ty_msrv_map`.
|
||||
if let Some(deref_trait_id) = self.cx.tcx.lang_items().deref_trait()
|
||||
&& implements_trait(self.cx, ty, deref_trait_id, &[])
|
||||
&& let Some(target_ty) = self.cx.get_associated_type(ty, deref_trait_id, "Target")
|
||||
&& let Some(target_ty) = self.cx.get_associated_type(ty, deref_trait_id, sym::Target)
|
||||
&& let Some(msrv) = self.ty_msrv_map.get(&target_ty)
|
||||
&& msrv.is_none_or(|msrv| self.msrv.meets(self.cx, msrv))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -315,7 +315,7 @@ fn check<'tcx>(cx: &LateContext<'tcx>, bounds: GenericBounds<'tcx>) {
|
|||
assocs
|
||||
.filter_by_name_unhygienic(constraint.ident.name)
|
||||
.next()
|
||||
.is_some_and(|assoc| assoc.kind == ty::AssocKind::Type)
|
||||
.is_some_and(|assoc| assoc.is_type())
|
||||
})
|
||||
{
|
||||
emit_lint(cx, poly_trait, bounds, index, implied_constraints, bound);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ use rustc_hir::{
|
|||
QPath, TraitItemRef, TyKind,
|
||||
};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::ty::{self, AssocKind, FnSig, Ty};
|
||||
use rustc_middle::ty::{self, FnSig, Ty};
|
||||
use rustc_session::declare_lint_pass;
|
||||
use rustc_span::source_map::Spanned;
|
||||
use rustc_span::symbol::sym;
|
||||
|
|
@ -288,8 +288,7 @@ fn check_trait_items(cx: &LateContext<'_>, visited_trait: &Item<'_>, ident: Iden
|
|||
.items()
|
||||
.flat_map(|&i| cx.tcx.associated_items(i).filter_by_name_unhygienic(is_empty))
|
||||
.any(|i| {
|
||||
i.kind == AssocKind::Fn
|
||||
&& i.fn_has_self_parameter
|
||||
i.is_method()
|
||||
&& cx.tcx.fn_sig(i.def_id).skip_binder().inputs().skip_binder().len() == 1
|
||||
});
|
||||
|
||||
|
|
@ -466,7 +465,7 @@ fn check_for_is_empty(
|
|||
.inherent_impls(impl_ty)
|
||||
.iter()
|
||||
.flat_map(|&id| cx.tcx.associated_items(id).filter_by_name_unhygienic(is_empty))
|
||||
.find(|item| item.kind == AssocKind::Fn);
|
||||
.find(|item| item.is_fn());
|
||||
|
||||
let (msg, is_empty_span, self_kind) = match is_empty {
|
||||
None => (
|
||||
|
|
@ -486,7 +485,7 @@ fn check_for_is_empty(
|
|||
None,
|
||||
),
|
||||
Some(is_empty)
|
||||
if !(is_empty.fn_has_self_parameter
|
||||
if !(is_empty.is_method()
|
||||
&& check_is_empty_sig(
|
||||
cx,
|
||||
cx.tcx.fn_sig(is_empty.def_id).instantiate_identity().skip_binder(),
|
||||
|
|
@ -608,7 +607,7 @@ fn is_empty_array(expr: &Expr<'_>) -> bool {
|
|||
fn has_is_empty(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
||||
/// Gets an `AssocItem` and return true if it matches `is_empty(self)`.
|
||||
fn is_is_empty(cx: &LateContext<'_>, item: &ty::AssocItem) -> bool {
|
||||
if item.kind == AssocKind::Fn {
|
||||
if item.is_fn() {
|
||||
let sig = cx.tcx.fn_sig(item.def_id).skip_binder();
|
||||
let ty = sig.skip_binder();
|
||||
ty.inputs().len() == 1
|
||||
|
|
@ -644,7 +643,7 @@ fn has_is_empty(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
|
|||
&& cx.tcx.get_diagnostic_item(sym::Deref).is_some_and(|deref_id| {
|
||||
implements_trait(cx, ty, deref_id, &[])
|
||||
&& cx
|
||||
.get_associated_type(ty, deref_id, "Target")
|
||||
.get_associated_type(ty, deref_id, sym::Target)
|
||||
.is_some_and(|deref_ty| ty_has_is_empty(cx, deref_ty, depth + 1))
|
||||
}))
|
||||
},
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ pub(super) fn check(cx: &LateContext<'_>, expr: &'_ Expr<'_>, self_expr: &'_ Exp
|
|||
&& let Ok(Some(fn_def)) = Instance::try_resolve(cx.tcx, cx.typing_env(), id, args)
|
||||
// find the provided definition of Iterator::last
|
||||
&& let Some(item) = cx.tcx.get_diagnostic_item(sym::Iterator)
|
||||
&& let Some(last_def) = cx.tcx.provided_trait_methods(item).find(|m| m.name.as_str() == "last")
|
||||
&& let Some(last_def) = cx.tcx.provided_trait_methods(item).find(|m| m.name().as_str() == "last")
|
||||
// if the resolved method is the same as the provided definition
|
||||
&& fn_def.def_id() == last_def.def_id
|
||||
{
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ pub(super) fn check<'tcx>(
|
|||
&& let Some(method_id) = typeck.type_dependent_def_id(cloned_call.hir_id)
|
||||
&& cx.tcx.trait_of_item(method_id) == Some(iter_id)
|
||||
&& let cloned_recv_ty = typeck.expr_ty_adjusted(cloned_recv)
|
||||
&& let Some(iter_assoc_ty) = cx.get_associated_type(cloned_recv_ty, iter_id, "Item")
|
||||
&& let Some(iter_assoc_ty) = cx.get_associated_type(cloned_recv_ty, iter_id, sym::Item)
|
||||
&& matches!(*iter_assoc_ty.kind(), ty::Ref(_, ty, _) if !is_copy(cx, ty))
|
||||
{
|
||||
if needs_into_iter
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ use rustc_hir::{
|
|||
};
|
||||
use rustc_lint::LateContext;
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::ty::{self, AssocKind, ClauseKind, EarlyBinder, GenericArg, GenericArgKind, Ty};
|
||||
use rustc_middle::ty::{self, AssocTag, ClauseKind, EarlyBinder, GenericArg, GenericArgKind, Ty};
|
||||
use rustc_span::symbol::Ident;
|
||||
use rustc_span::{Span, sym};
|
||||
|
||||
|
|
@ -241,7 +241,7 @@ fn is_contains_sig(cx: &LateContext<'_>, call_id: HirId, iter_expr: &Expr<'_>) -
|
|||
&& let Some(iter_item) = cx.tcx.associated_items(iter_trait).find_by_ident_and_kind(
|
||||
cx.tcx,
|
||||
Ident::with_dummy_span(sym::Item),
|
||||
AssocKind::Type,
|
||||
AssocTag::Type,
|
||||
iter_trait,
|
||||
)
|
||||
&& let args = cx.tcx.mk_args(&[GenericArg::from(typeck.expr_ty_adjusted(iter_expr))])
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ pub(super) fn check<'tcx>(
|
|||
.iter()
|
||||
.flat_map(|impl_id| cx.tcx.associated_items(impl_id).filter_by_name_unhygienic(sugg))
|
||||
.find_map(|assoc| {
|
||||
if assoc.fn_has_self_parameter
|
||||
if assoc.is_method()
|
||||
&& cx.tcx.fn_sig(assoc.def_id).skip_binder().inputs().skip_binder().len() == 1
|
||||
{
|
||||
Some(assoc.def_id)
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ pub fn check_for_loop_iter(
|
|||
&& let Some(into_iterator_trait_id) = cx.tcx.get_diagnostic_item(sym::IntoIterator)
|
||||
&& let collection_ty = cx.typeck_results().expr_ty(collection)
|
||||
&& implements_trait(cx, collection_ty, into_iterator_trait_id, &[])
|
||||
&& let Some(into_iter_item_ty) = cx.get_associated_type(collection_ty, into_iterator_trait_id, "Item")
|
||||
&& let Some(into_iter_item_ty) = cx.get_associated_type(collection_ty, into_iterator_trait_id, sym::Item)
|
||||
&& iter_item_ty == into_iter_item_ty
|
||||
&& let Some(collection_snippet) = collection.span.get_source_text(cx)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ fn check_addr_of_expr(
|
|||
}
|
||||
if let Some(deref_trait_id) = cx.tcx.get_diagnostic_item(sym::Deref)
|
||||
&& implements_trait(cx, receiver_ty, deref_trait_id, &[])
|
||||
&& cx.get_associated_type(receiver_ty, deref_trait_id, "Target") == Some(target_ty)
|
||||
&& cx.get_associated_type(receiver_ty, deref_trait_id, sym::Target) == Some(target_ty)
|
||||
// Make sure that it's actually calling the right `.to_string()`, (#10033)
|
||||
// *or* this is a `Cow::into_owned()` call (which would be the wrong into_owned receiver (str != Cow)
|
||||
// but that's ok for Cow::into_owned specifically)
|
||||
|
|
@ -322,7 +322,7 @@ fn check_split_call_arg(cx: &LateContext<'_>, expr: &Expr<'_>, method_name: Symb
|
|||
// add `.as_ref()` to the suggestion.
|
||||
let as_ref = if is_type_lang_item(cx, cx.typeck_results().expr_ty(expr), LangItem::String)
|
||||
&& let Some(deref_trait_id) = cx.tcx.get_diagnostic_item(sym::Deref)
|
||||
&& cx.get_associated_type(cx.typeck_results().expr_ty(receiver), deref_trait_id, "Target")
|
||||
&& cx.get_associated_type(cx.typeck_results().expr_ty(receiver), deref_trait_id, sym::Target)
|
||||
!= Some(cx.tcx.types.str_)
|
||||
{
|
||||
".as_ref()"
|
||||
|
|
@ -648,7 +648,7 @@ fn is_to_string_on_string_like<'a>(
|
|||
&& let GenericArgKind::Type(ty) = generic_arg.unpack()
|
||||
&& let Some(deref_trait_id) = cx.tcx.get_diagnostic_item(sym::Deref)
|
||||
&& let Some(as_ref_trait_id) = cx.tcx.get_diagnostic_item(sym::AsRef)
|
||||
&& (cx.get_associated_type(ty, deref_trait_id, "Target") == Some(cx.tcx.types.str_)
|
||||
&& (cx.get_associated_type(ty, deref_trait_id, sym::Target) == Some(cx.tcx.types.str_)
|
||||
|| implements_trait(cx, ty, as_ref_trait_id, &[cx.tcx.types.str_.into()]))
|
||||
{
|
||||
true
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingTraitMethods {
|
|||
cx,
|
||||
MISSING_TRAIT_METHODS,
|
||||
cx.tcx.def_span(item.owner_id),
|
||||
format!("missing trait method provided by default: `{}`", assoc.name),
|
||||
format!("missing trait method provided by default: `{}`", assoc.name()),
|
||||
|diag| {
|
||||
diag.span_help(cx.tcx.def_span(assoc.def_id), "implement the method");
|
||||
},
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ fn has_ref_mut_self_method(cx: &LateContext<'_>, trait_def_id: DefId) -> bool {
|
|||
.associated_items(trait_def_id)
|
||||
.in_definition_order()
|
||||
.any(|assoc_item| {
|
||||
if assoc_item.fn_has_self_parameter {
|
||||
if assoc_item.is_method() {
|
||||
let self_ty = cx
|
||||
.tcx
|
||||
.fn_sig(assoc_item.def_id)
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ use rustc_data_structures::fx::FxHashMap;
|
|||
use rustc_hir::def::{DefKind, Res};
|
||||
use rustc_hir::{HirId, Impl, ItemKind, Node, Path, QPath, TraitRef, TyKind};
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::ty::AssocKind;
|
||||
use rustc_session::declare_lint_pass;
|
||||
use rustc_span::Span;
|
||||
use rustc_span::symbol::Symbol;
|
||||
|
|
@ -85,8 +84,8 @@ impl<'tcx> LateLintPass<'tcx> for SameNameMethod {
|
|||
cx.tcx
|
||||
.associated_items(did)
|
||||
.in_definition_order()
|
||||
.filter(|assoc_item| matches!(assoc_item.kind, AssocKind::Fn))
|
||||
.map(|assoc_item| assoc_item.name)
|
||||
.filter(|assoc_item| assoc_item.is_fn())
|
||||
.map(|assoc_item| assoc_item.name())
|
||||
.collect()
|
||||
} else {
|
||||
BTreeSet::new()
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ use rustc_hir::{Body, Expr, ExprKind, FnDecl, HirId, Item, ItemKind, Node, QPath
|
|||
use rustc_hir_analysis::lower_ty;
|
||||
use rustc_lint::{LateContext, LateLintPass};
|
||||
use rustc_middle::hir::nested_filter;
|
||||
use rustc_middle::ty::{self, AssocKind, Ty, TyCtxt};
|
||||
use rustc_middle::ty::{self, Ty, TyCtxt};
|
||||
use rustc_session::impl_lint_pass;
|
||||
use rustc_span::symbol::{Ident, kw};
|
||||
use rustc_span::{Span, sym};
|
||||
|
|
@ -322,7 +322,7 @@ impl UnconditionalRecursion {
|
|||
.in_definition_order()
|
||||
// We're not interested in foreign implementations of the `Default` trait.
|
||||
.find(|item| {
|
||||
item.kind == AssocKind::Fn && item.def_id.is_local() && item.name == kw::Default
|
||||
item.is_fn() && item.def_id.is_local() && item.name() == kw::Default
|
||||
})
|
||||
&& let Some(body_node) = cx.tcx.hir_get_if_local(assoc_item.def_id)
|
||||
&& let Some(body_id) = body_node.body_id()
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ impl<'tcx> LateLintPass<'tcx> for UnusedSelf {
|
|||
.is_some()
|
||||
};
|
||||
if let ItemKind::Impl(Impl { of_trait: None, .. }) = parent_item.kind
|
||||
&& assoc_item.fn_has_self_parameter
|
||||
&& assoc_item.is_method()
|
||||
&& let ImplItemKind::Fn(.., body_id) = &impl_item.kind
|
||||
&& (!cx.effective_visibilities.is_exported(impl_item.owner_id.def_id) || !self.avoid_breaking_exported_api)
|
||||
&& let body = cx.tcx.hir_body(*body_id)
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ use rustc_middle::mir::interpret::Scalar;
|
|||
use rustc_middle::traits::EvaluationResult;
|
||||
use rustc_middle::ty::layout::ValidityRequirement;
|
||||
use rustc_middle::ty::{
|
||||
self, AdtDef, AliasTy, AssocItem, AssocKind, Binder, BoundRegion, FnSig, GenericArg, GenericArgKind,
|
||||
self, AdtDef, AliasTy, AssocItem, AssocTag, Binder, BoundRegion, FnSig, GenericArg, GenericArgKind,
|
||||
GenericArgsRef, GenericParamDefKind, IntTy, ParamEnv, Region, RegionKind, TraitRef, Ty, TyCtxt, TypeSuperVisitable,
|
||||
TypeVisitable, TypeVisitableExt, TypeVisitor, UintTy, Upcast, VariantDef, VariantDiscr,
|
||||
};
|
||||
|
|
@ -156,7 +156,7 @@ pub fn contains_ty_adt_constructor_opaque<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'
|
|||
pub fn get_iterator_item_ty<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>) -> Option<Ty<'tcx>> {
|
||||
cx.tcx
|
||||
.get_diagnostic_item(sym::Iterator)
|
||||
.and_then(|iter_did| cx.get_associated_type(ty, iter_did, "Item"))
|
||||
.and_then(|iter_did| cx.get_associated_type(ty, iter_did, sym::Item))
|
||||
}
|
||||
|
||||
/// Get the diagnostic name of a type, e.g. `sym::HashMap`. To check if a type
|
||||
|
|
@ -1112,7 +1112,7 @@ pub fn make_projection<'tcx>(
|
|||
let Some(assoc_item) = tcx.associated_items(container_id).find_by_ident_and_kind(
|
||||
tcx,
|
||||
Ident::with_dummy_span(assoc_ty),
|
||||
AssocKind::Type,
|
||||
AssocTag::Type,
|
||||
container_id,
|
||||
) else {
|
||||
debug_assert!(false, "type `{assoc_ty}` not found in `{container_id:?}`");
|
||||
|
|
@ -1345,7 +1345,7 @@ pub fn get_adt_inherent_method<'a>(cx: &'a LateContext<'_>, ty: Ty<'_>, method_n
|
|||
.associated_items(did)
|
||||
.filter_by_name_unhygienic(method_name)
|
||||
.next()
|
||||
.filter(|item| item.kind == AssocKind::Fn)
|
||||
.filter(|item| item.as_tag() == AssocTag::Fn)
|
||||
})
|
||||
} else {
|
||||
None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue