]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_mir/hair/pattern/mod.rs
Refactoring: added `PatternTypeAnnotation` wrapper around `UserTypeAnnotation` to...
[rust.git] / src / librustc_mir / hair / pattern / mod.rs
index 4649c28aff518b0e29f1bd94fd946c86a891820d..7d879db4a5203bcd3dc4037ebc9d755d40244ad1 100644 (file)
@@ -64,12 +64,26 @@ pub struct Pattern<'tcx> {
     pub kind: Box<PatternKind<'tcx>>,
 }
 
+#[derive(Copy, Clone, Debug)]
+pub struct PatternTypeAnnotation<'tcx>(UserTypeAnnotation<'tcx>);
+
+impl<'tcx> PatternTypeAnnotation<'tcx> {
+    pub(crate) fn from_c_ty(c_ty: ty::CanonicalTy<'tcx>) -> Self {
+        Self::from_u_ty(UserTypeAnnotation::Ty(c_ty))
+    }
+    pub(crate) fn from_u_ty(u_ty: UserTypeAnnotation<'tcx>) -> Self {
+        PatternTypeAnnotation(u_ty)
+    }
+
+    pub(crate) fn user_ty(self) -> UserTypeAnnotation<'tcx> { self.0 }
+}
+
 #[derive(Clone, Debug)]
 pub enum PatternKind<'tcx> {
     Wild,
 
     AscribeUserType {
-        user_ty: UserTypeAnnotation<'tcx>,
+        user_ty: PatternTypeAnnotation<'tcx>,
         subpattern: Pattern<'tcx>,
         user_ty_span: Span,
     },
@@ -690,9 +704,10 @@ fn lower_variant_or_leaf(
 
             debug!("pattern user_ty = {:?} for pattern at {:?}", user_ty, span);
 
+            let pat_ty = PatternTypeAnnotation::from_u_ty(user_ty);
             kind = PatternKind::AscribeUserType {
                 subpattern,
-                user_ty,
+                user_ty: pat_ty,
                 user_ty_span: span,
             };
         }
@@ -980,7 +995,7 @@ fn super_fold_with<F: PatternFolder<$lt_tcx>>(&self, _: &mut F) -> Self {
 CloneImpls!{ <'tcx>
     Span, Field, Mutability, ast::Name, ast::NodeId, usize, &'tcx ty::Const<'tcx>,
     Region<'tcx>, Ty<'tcx>, BindingMode<'tcx>, &'tcx AdtDef,
-    &'tcx Substs<'tcx>, &'tcx Kind<'tcx>, UserTypeAnnotation<'tcx>
+    &'tcx Substs<'tcx>, &'tcx Kind<'tcx>, UserTypeAnnotation<'tcx>, PatternTypeAnnotation<'tcx>
 }
 
 impl<'tcx> PatternFoldable<'tcx> for FieldPattern<'tcx> {