Remove rustc_middle::ty::util::ExplicitSelf
.
It's an old (2017 or earlier) type that describes a `self` receiver. It's only used in `rustc_hir_analysis` for two error messages, and much of the complexity isn't used. I suspect it used to be used for more things. This commit removes it, and moves a greatly simplified version of the `determine` method into `rustc_hir_analysis`, renamed as `get_self_string`. The big comment on the method is removed because it no longer seems relevant.
This commit is contained in:
parent
217693a1f0
commit
78768361a0
2 changed files with 22 additions and 62 deletions
|
@ -12,7 +12,6 @@ use rustc_hir::{self as hir, AmbigArg, GenericParamKind, ImplItemKind, intravisi
|
||||||
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
|
use rustc_infer::infer::{self, InferCtxt, TyCtxtInferExt};
|
||||||
use rustc_infer::traits::util;
|
use rustc_infer::traits::util;
|
||||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||||
use rustc_middle::ty::util::ExplicitSelf;
|
|
||||||
use rustc_middle::ty::{
|
use rustc_middle::ty::{
|
||||||
self, BottomUpFolder, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable, TypeFolder,
|
self, BottomUpFolder, GenericArgs, GenericParamDefKind, Ty, TyCtxt, TypeFoldable, TypeFolder,
|
||||||
TypeSuperFoldable, TypeVisitableExt, TypingMode, Upcast,
|
TypeSuperFoldable, TypeVisitableExt, TypingMode, Upcast,
|
||||||
|
@ -995,6 +994,26 @@ impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets the string for an explicit self declaration, e.g. "self", "&self",
|
||||||
|
/// etc.
|
||||||
|
fn get_self_string<'tcx, P>(self_arg_ty: Ty<'tcx>, is_self_ty: P) -> String
|
||||||
|
where
|
||||||
|
P: Fn(Ty<'tcx>) -> bool,
|
||||||
|
{
|
||||||
|
if is_self_ty(self_arg_ty) {
|
||||||
|
"self".to_owned()
|
||||||
|
} else if let ty::Ref(_, ty, mutbl) = self_arg_ty.kind()
|
||||||
|
&& is_self_ty(*ty)
|
||||||
|
{
|
||||||
|
match mutbl {
|
||||||
|
hir::Mutability::Not => "&self".to_owned(),
|
||||||
|
hir::Mutability::Mut => "&mut self".to_owned(),
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
format!("self: {self_arg_ty}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn report_trait_method_mismatch<'tcx>(
|
fn report_trait_method_mismatch<'tcx>(
|
||||||
infcx: &InferCtxt<'tcx>,
|
infcx: &InferCtxt<'tcx>,
|
||||||
mut cause: ObligationCause<'tcx>,
|
mut cause: ObligationCause<'tcx>,
|
||||||
|
@ -1020,12 +1039,7 @@ fn report_trait_method_mismatch<'tcx>(
|
||||||
if trait_m.fn_has_self_parameter =>
|
if trait_m.fn_has_self_parameter =>
|
||||||
{
|
{
|
||||||
let ty = trait_sig.inputs()[0];
|
let ty = trait_sig.inputs()[0];
|
||||||
let sugg = match ExplicitSelf::determine(ty, |ty| ty == impl_trait_ref.self_ty()) {
|
let sugg = get_self_string(ty, |ty| ty == impl_trait_ref.self_ty());
|
||||||
ExplicitSelf::ByValue => "self".to_owned(),
|
|
||||||
ExplicitSelf::ByReference(_, hir::Mutability::Not) => "&self".to_owned(),
|
|
||||||
ExplicitSelf::ByReference(_, hir::Mutability::Mut) => "&mut self".to_owned(),
|
|
||||||
_ => format!("self: {ty}"),
|
|
||||||
};
|
|
||||||
|
|
||||||
// When the `impl` receiver is an arbitrary self type, like `self: Box<Self>`, the
|
// When the `impl` receiver is an arbitrary self type, like `self: Box<Self>`, the
|
||||||
// span points only at the type `Box<Self`>, but we want to cover the whole
|
// span points only at the type `Box<Self`>, but we want to cover the whole
|
||||||
|
@ -1238,12 +1252,7 @@ fn compare_self_type<'tcx>(
|
||||||
.build_with_typing_env(ty::TypingEnv::non_body_analysis(tcx, method.def_id));
|
.build_with_typing_env(ty::TypingEnv::non_body_analysis(tcx, method.def_id));
|
||||||
let self_arg_ty = tcx.liberate_late_bound_regions(method.def_id, self_arg_ty);
|
let self_arg_ty = tcx.liberate_late_bound_regions(method.def_id, self_arg_ty);
|
||||||
let can_eq_self = |ty| infcx.can_eq(param_env, untransformed_self_ty, ty);
|
let can_eq_self = |ty| infcx.can_eq(param_env, untransformed_self_ty, ty);
|
||||||
match ExplicitSelf::determine(self_arg_ty, can_eq_self) {
|
get_self_string(self_arg_ty, can_eq_self)
|
||||||
ExplicitSelf::ByValue => "self".to_owned(),
|
|
||||||
ExplicitSelf::ByReference(_, hir::Mutability::Not) => "&self".to_owned(),
|
|
||||||
ExplicitSelf::ByReference(_, hir::Mutability::Mut) => "&mut self".to_owned(),
|
|
||||||
_ => format!("self: {self_arg_ty}"),
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
match (trait_m.fn_has_self_parameter, impl_m.fn_has_self_parameter) {
|
match (trait_m.fn_has_self_parameter, impl_m.fn_has_self_parameter) {
|
||||||
|
|
|
@ -1546,55 +1546,6 @@ impl<'tcx> Ty<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub enum ExplicitSelf<'tcx> {
|
|
||||||
ByValue,
|
|
||||||
ByReference(ty::Region<'tcx>, hir::Mutability),
|
|
||||||
ByRawPointer(hir::Mutability),
|
|
||||||
ByBox,
|
|
||||||
Other,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'tcx> ExplicitSelf<'tcx> {
|
|
||||||
/// Categorizes an explicit self declaration like `self: SomeType`
|
|
||||||
/// into either `self`, `&self`, `&mut self`, `Box<Self>`, or
|
|
||||||
/// `Other`.
|
|
||||||
/// This is mainly used to require the arbitrary_self_types feature
|
|
||||||
/// in the case of `Other`, to improve error messages in the common cases,
|
|
||||||
/// and to make `Other` dyn-incompatible.
|
|
||||||
///
|
|
||||||
/// Examples:
|
|
||||||
///
|
|
||||||
/// ```ignore (illustrative)
|
|
||||||
/// impl<'a> Foo for &'a T {
|
|
||||||
/// // Legal declarations:
|
|
||||||
/// fn method1(self: &&'a T); // ExplicitSelf::ByReference
|
|
||||||
/// fn method2(self: &'a T); // ExplicitSelf::ByValue
|
|
||||||
/// fn method3(self: Box<&'a T>); // ExplicitSelf::ByBox
|
|
||||||
/// fn method4(self: Rc<&'a T>); // ExplicitSelf::Other
|
|
||||||
///
|
|
||||||
/// // Invalid cases will be caught by `check_method_receiver`:
|
|
||||||
/// fn method_err1(self: &'a mut T); // ExplicitSelf::Other
|
|
||||||
/// fn method_err2(self: &'static T) // ExplicitSelf::ByValue
|
|
||||||
/// fn method_err3(self: &&T) // ExplicitSelf::ByReference
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
///
|
|
||||||
pub fn determine<P>(self_arg_ty: Ty<'tcx>, is_self_ty: P) -> ExplicitSelf<'tcx>
|
|
||||||
where
|
|
||||||
P: Fn(Ty<'tcx>) -> bool,
|
|
||||||
{
|
|
||||||
use self::ExplicitSelf::*;
|
|
||||||
|
|
||||||
match *self_arg_ty.kind() {
|
|
||||||
_ if is_self_ty(self_arg_ty) => ByValue,
|
|
||||||
ty::Ref(region, ty, mutbl) if is_self_ty(ty) => ByReference(region, mutbl),
|
|
||||||
ty::RawPtr(ty, mutbl) if is_self_ty(ty) => ByRawPointer(mutbl),
|
|
||||||
_ if self_arg_ty.boxed_ty().is_some_and(is_self_ty) => ByBox,
|
|
||||||
_ => Other,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a list of types such that the given type needs drop if and only if
|
/// Returns a list of types such that the given type needs drop if and only if
|
||||||
/// *any* of the returned types need drop. Returns `Err(AlwaysRequiresDrop)` if
|
/// *any* of the returned types need drop. Returns `Err(AlwaysRequiresDrop)` if
|
||||||
/// this type always needs drop.
|
/// this type always needs drop.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue