]> git.lizzy.rs Git - rust.git/commitdiff
Refactoring: added `PatternTypeAnnotation` wrapper around `UserTypeAnnotation` to...
authorFelix S. Klock II <pnkfelix@pnkfx.org>
Sun, 21 Oct 2018 19:52:38 +0000 (21:52 +0200)
committerFelix S. Klock II <pnkfelix@pnkfx.org>
Fri, 26 Oct 2018 21:42:39 +0000 (23:42 +0200)
src/librustc_mir/build/matches/mod.rs
src/librustc_mir/hair/cx/block.rs
src/librustc_mir/hair/mod.rs
src/librustc_mir/hair/pattern/mod.rs

index 71dc45db8b638ed41c7078bd6aa657261572b89a..0d456a091c2059789857daec9b6c93c379efa68b 100644 (file)
@@ -291,7 +291,7 @@ pub(super) fn expr_into_pattern(
                     },
                     ..
                 },
-                user_ty: ascription_user_ty,
+                user_ty: pat_ascription_ty,
                 user_ty_span,
             } => {
                 let place =
@@ -316,7 +316,7 @@ pub(super) fn expr_into_pattern(
                         kind: StatementKind::AscribeUserType(
                             place,
                             ty::Variance::Invariant,
-                            box ascription_user_ty,
+                            box pat_ascription_ty.user_ty(),
                         ),
                     },
                 );
@@ -491,7 +491,7 @@ pub fn schedule_drop_for_binding(&mut self, var: NodeId, span: Span, for_guard:
     pub(super) fn visit_bindings(
         &mut self,
         pattern: &Pattern<'tcx>,
-        mut pattern_user_ty: Option<(UserTypeAnnotation<'tcx>, Span)>,
+        mut pattern_user_ty: Option<(PatternTypeAnnotation<'tcx>, Span)>,
         f: &mut impl FnMut(
             &mut Self,
             Mutability,
@@ -500,7 +500,7 @@ pub(super) fn visit_bindings(
             NodeId,
             Span,
             Ty<'tcx>,
-            Option<(UserTypeAnnotation<'tcx>, Span)>,
+            Option<(PatternTypeAnnotation<'tcx>, Span)>,
         ),
     ) {
         match *pattern.kind {
@@ -626,7 +626,7 @@ struct Binding<'tcx> {
 struct Ascription<'tcx> {
     span: Span,
     source: Place<'tcx>,
-    user_ty: UserTypeAnnotation<'tcx>,
+    user_ty: PatternTypeAnnotation<'tcx>,
 }
 
 #[derive(Clone, Debug)]
@@ -1323,7 +1323,7 @@ fn ascribe_types<'pat>(
                     kind: StatementKind::AscribeUserType(
                         ascription.source.clone(),
                         ty::Variance::Covariant,
-                        box ascription.user_ty,
+                        box ascription.user_ty.user_ty(),
                     ),
                 },
             );
@@ -1470,7 +1470,7 @@ fn declare_binding(
         num_patterns: usize,
         var_id: NodeId,
         var_ty: Ty<'tcx>,
-        user_var_ty: Option<(UserTypeAnnotation<'tcx>, Span)>,
+        user_var_ty: Option<(PatternTypeAnnotation<'tcx>, Span)>,
         has_guard: ArmHasGuard,
         opt_match_place: Option<(Option<Place<'tcx>>, Span)>,
         pat_span: Span,
@@ -1489,7 +1489,7 @@ fn declare_binding(
         let local = LocalDecl::<'tcx> {
             mutability,
             ty: var_ty,
-            user_ty: user_var_ty,
+            user_ty: user_var_ty.map(|(pat_ty, span)|(pat_ty.user_ty(), span)),
             name: Some(name),
             source_info,
             visibility_scope,
index 9865867a196ca3b34f5899cf6b6bc6e7eb0ba472..d89f250ef5bca510ae11eaa1709c40726b8a3a28 100644 (file)
@@ -91,7 +91,7 @@ fn mirror_stmts<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
                                     ty: pattern.ty,
                                     span: pattern.span,
                                     kind: Box::new(PatternKind::AscribeUserType {
-                                        user_ty: UserTypeAnnotation::Ty(user_ty),
+                                        user_ty: PatternTypeAnnotation::from_c_ty(user_ty),
                                         user_ty_span: ty.span,
                                         subpattern: pattern
                                     })
index 788db5c0b7e5217ac94d32940b12df8e17ad0ea8..11f5ce260030023daef09730023eaed8288692bb 100644 (file)
@@ -27,7 +27,7 @@
 pub mod cx;
 
 pub mod pattern;
-pub use self::pattern::{BindingMode, Pattern, PatternKind, FieldPattern};
+pub use self::pattern::{BindingMode, Pattern, PatternKind, PatternTypeAnnotation, FieldPattern};
 
 mod util;
 
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> {