Add a IsIdentity extension trait for CanonicalUserType
This commit is contained in:
parent
024ca99de5
commit
8f3b4f94ef
@ -26,7 +26,7 @@ use rustc_middle::ty::error::TypeError;
|
||||
use rustc_middle::ty::fold::TypeFoldable;
|
||||
use rustc_middle::ty::visit::{TypeVisitable, TypeVisitableExt};
|
||||
use rustc_middle::ty::{
|
||||
self, AdtKind, CanonicalUserType, GenericParamDefKind, Ty, TyCtxt, UserType,
|
||||
self, AdtKind, CanonicalUserType, GenericParamDefKind, IsIdentity, Ty, TyCtxt, UserType,
|
||||
};
|
||||
use rustc_middle::ty::{GenericArgKind, GenericArgsRef, UserArgs, UserSelfTy};
|
||||
use rustc_session::lint;
|
||||
@ -208,7 +208,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
debug!("fcx {}", self.tag());
|
||||
|
||||
// FIXME: is_identity being on `UserType` and not `Canonical<UserType>` is awkward
|
||||
if !canonical_user_type_annotation.value.is_identity() {
|
||||
if !canonical_user_type_annotation.is_identity() {
|
||||
self.typeck_results
|
||||
.borrow_mut()
|
||||
.user_provided_types_mut()
|
||||
|
@ -106,8 +106,8 @@ pub use self::sty::{
|
||||
};
|
||||
pub use self::trait_def::TraitDef;
|
||||
pub use self::typeck_results::{
|
||||
CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, TypeckResults,
|
||||
UserType, UserTypeAnnotationIndex,
|
||||
CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, IsIdentity,
|
||||
TypeckResults, UserType, UserTypeAnnotationIndex,
|
||||
};
|
||||
|
||||
pub mod _match;
|
||||
|
@ -607,11 +607,15 @@ pub enum UserType<'tcx> {
|
||||
TypeOf(DefId, UserArgs<'tcx>),
|
||||
}
|
||||
|
||||
impl<'tcx> UserType<'tcx> {
|
||||
pub trait IsIdentity {
|
||||
fn is_identity(&self) -> bool;
|
||||
}
|
||||
|
||||
impl<'tcx> IsIdentity for CanonicalUserType<'tcx> {
|
||||
/// Returns `true` if this represents a substitution of the form `[?0, ?1, ?2]`,
|
||||
/// i.e., each thing is mapped to a canonical variable with the same index.
|
||||
pub fn is_identity(&self) -> bool {
|
||||
match self {
|
||||
fn is_identity(&self) -> bool {
|
||||
match self.value {
|
||||
UserType::Ty(_) => false,
|
||||
UserType::TypeOf(_, user_args) => {
|
||||
if user_args.user_self_ty.is_some() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user