]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc_front/lowering.rs
Unify structures and enum variants in AST
[rust.git] / src / librustc_front / lowering.rs
index 4ee5fa2c1e9b5389c894dcfd4249f1e8f61e28a7..bd5f7cf3c626eba2c81dba90444a1e7f9f1198fb 100644 (file)
@@ -267,14 +267,13 @@ pub fn lower_variant(_lctx: &LoweringContext, v: &Variant) -> P<hir::Variant> {
             id: v.node.id,
             name: v.node.name.name,
             attrs: v.node.attrs.clone(),
-            kind: match v.node.kind {
-                TupleVariantKind(ref variant_args) => {
-                    hir::TupleVariantKind(variant_args.iter()
-                                                      .map(|ref x| lower_variant_arg(_lctx, x))
-                                                      .collect())
-                }
-                StructVariantKind(ref struct_def) => {
-                    hir::StructVariantKind(lower_struct_def(_lctx, struct_def))
+            kind: {
+                if v.node.def.ctor_id.is_none() {
+                    hir::StructVariantKind(lower_struct_def(_lctx, &v.node.def))
+                } else {
+                    hir::TupleVariantKind(v.node.def.fields.iter().map(|ref field| {
+                        hir::VariantArg { id: field.node.id, ty: lower_ty(_lctx, &field.node.ty) }
+                    }).collect())
                 }
             },
             disr_expr: v.node.disr_expr.as_ref().map(|e| lower_expr(_lctx, e)),
@@ -567,13 +566,6 @@ fn lower_bounds(_lctx: &LoweringContext, bounds: &TyParamBounds) -> hir::TyParam
     bounds.iter().map(|bound| lower_ty_param_bound(_lctx, bound)).collect()
 }
 
-fn lower_variant_arg(_lctx: &LoweringContext, va: &VariantArg) -> hir::VariantArg {
-    hir::VariantArg {
-        id: va.id,
-        ty: lower_ty(_lctx, &va.ty),
-    }
-}
-
 pub fn lower_block(_lctx: &LoweringContext, b: &Block) -> P<hir::Block> {
     P(hir::Block {
         id: b.id,
@@ -1422,7 +1414,11 @@ pub fn lower_expr(lctx: &LoweringContext, e: &Expr) -> P<hir::Expr> {
                               vec![head])
                 };
 
-                let match_expr = expr_match(lctx, e.span, into_iter_expr, vec![iter_arm]);
+                let match_expr = expr_match(lctx,
+                                            e.span,
+                                            into_iter_expr,
+                                            vec![iter_arm],
+                                            hir::MatchSource::ForLoopDesugar);
 
                 // `{ let result = ...; result }`
                 let result_ident = lctx.str_to_ident("result");
@@ -1574,11 +1570,12 @@ fn expr_path(lctx: &LoweringContext, path: hir::Path) -> P<hir::Expr> {
 fn expr_match(lctx: &LoweringContext,
               span: Span,
               arg: P<hir::Expr>,
-              arms: Vec<hir::Arm>)
+              arms: Vec<hir::Arm>,
+              source: hir::MatchSource)
               -> P<hir::Expr> {
     expr(lctx,
          span,
-         hir::ExprMatch(arg, arms, hir::MatchSource::Normal))
+         hir::ExprMatch(arg, arms, source))
 }
 
 fn expr_block(lctx: &LoweringContext, b: P<hir::Block>) -> P<hir::Expr> {