Skip to content

Commit f6e06a8

Browse files
committed
Split AstBuilder::pat_enum into pat_tuple_struct and pat_path
1 parent 28ed8b1 commit f6e06a8

File tree

4 files changed

+48
-42
lines changed

4 files changed

+48
-42
lines changed

src/libsyntax/ext/build.rs

+20-20
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,11 @@ pub trait AstBuilder {
171171
span: Span,
172172
ident: ast::Ident,
173173
bm: ast::BindingMode) -> P<ast::Pat>;
174-
fn pat_enum(&self, span: Span, path: ast::Path, subpats: Vec<P<ast::Pat>> ) -> P<ast::Pat>;
175-
fn pat_struct(&self, span: Span,
176-
path: ast::Path, field_pats: Vec<Spanned<ast::FieldPat>> ) -> P<ast::Pat>;
174+
fn pat_path(&self, span: Span, path: ast::Path) -> P<ast::Pat>;
175+
fn pat_tuple_struct(&self, span: Span, path: ast::Path,
176+
subpats: Vec<P<ast::Pat>>) -> P<ast::Pat>;
177+
fn pat_struct(&self, span: Span, path: ast::Path,
178+
field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat>;
177179
fn pat_tuple(&self, span: Span, pats: Vec<P<ast::Pat>>) -> P<ast::Pat>;
178180

179181
fn pat_some(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat>;
@@ -802,10 +804,10 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
802804
let binding_expr = self.expr_ident(sp, binding_variable);
803805

804806
// Ok(__try_var) pattern
805-
let ok_pat = self.pat_enum(sp, ok_path, vec!(binding_pat.clone()));
807+
let ok_pat = self.pat_tuple_struct(sp, ok_path, vec![binding_pat.clone()]);
806808

807809
// Err(__try_var) (pattern and expression resp.)
808-
let err_pat = self.pat_enum(sp, err_path.clone(), vec!(binding_pat));
810+
let err_pat = self.pat_tuple_struct(sp, err_path.clone(), vec![binding_pat]);
809811
let err_inner_expr = self.expr_call(sp, self.expr_path(err_path),
810812
vec!(binding_expr.clone()));
811813
// return Err(__try_var)
@@ -842,18 +844,16 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
842844
let pat = PatKind::Ident(bm, Spanned{span: span, node: ident}, None);
843845
self.pat(span, pat)
844846
}
845-
fn pat_enum(&self, span: Span, path: ast::Path, subpats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
846-
let pat = if subpats.is_empty() {
847-
PatKind::Struct(path, Vec::new(), false)
848-
} else {
849-
PatKind::TupleStruct(path, subpats, None)
850-
};
851-
self.pat(span, pat)
847+
fn pat_path(&self, span: Span, path: ast::Path) -> P<ast::Pat> {
848+
self.pat(span, PatKind::Path(None, path))
852849
}
853-
fn pat_struct(&self, span: Span,
854-
path: ast::Path, field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat> {
855-
let pat = PatKind::Struct(path, field_pats, false);
856-
self.pat(span, pat)
850+
fn pat_tuple_struct(&self, span: Span, path: ast::Path,
851+
subpats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
852+
self.pat(span, PatKind::TupleStruct(path, subpats, None))
853+
}
854+
fn pat_struct(&self, span: Span, path: ast::Path,
855+
field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat> {
856+
self.pat(span, PatKind::Struct(path, field_pats, false))
857857
}
858858
fn pat_tuple(&self, span: Span, pats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
859859
self.pat(span, PatKind::Tuple(pats, None))
@@ -862,25 +862,25 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
862862
fn pat_some(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat> {
863863
let some = self.std_path(&["option", "Option", "Some"]);
864864
let path = self.path_global(span, some);
865-
self.pat_enum(span, path, vec!(pat))
865+
self.pat_tuple_struct(span, path, vec![pat])
866866
}
867867

868868
fn pat_none(&self, span: Span) -> P<ast::Pat> {
869869
let some = self.std_path(&["option", "Option", "None"]);
870870
let path = self.path_global(span, some);
871-
self.pat_enum(span, path, vec!())
871+
self.pat_path(span, path)
872872
}
873873

874874
fn pat_ok(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat> {
875875
let some = self.std_path(&["result", "Result", "Ok"]);
876876
let path = self.path_global(span, some);
877-
self.pat_enum(span, path, vec!(pat))
877+
self.pat_tuple_struct(span, path, vec![pat])
878878
}
879879

880880
fn pat_err(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat> {
881881
let some = self.std_path(&["result", "Result", "Err"]);
882882
let path = self.path_global(span, some);
883-
self.pat_enum(span, path, vec!(pat))
883+
self.pat_tuple_struct(span, path, vec![pat])
884884
}
885885

886886
fn arm(&self, _span: Span, pats: Vec<P<ast::Pat>>, expr: P<ast::Expr>) -> ast::Arm {

src/libsyntax_ext/deriving/cmp/ord.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ pub fn cs_cmp(cx: &mut ExtCtxt, span: Span, substr: &Substructure) -> P<Expr> {
104104
};
105105

106106
let eq_arm = cx.arm(span,
107-
vec![cx.pat_enum(span, equals_path.clone(), vec![])],
107+
vec![cx.pat_path(span, equals_path.clone())],
108108
old);
109109
let neq_arm = cx.arm(span,
110110
vec![cx.pat_ident(span, test_id)],

src/libsyntax_ext/deriving/cmp/partial_ord.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ pub fn cs_partial_cmp(cx: &mut ExtCtxt, span: Span, substr: &Substructure) -> P<
165165
};
166166

167167
let eq_arm = cx.arm(span,
168-
vec![cx.pat_some(span, cx.pat_enum(span, ordering.clone(), vec![]))],
168+
vec![cx.pat_some(span, cx.pat_path(span, ordering.clone()))],
169169
old);
170170
let neq_arm = cx.arm(span,
171171
vec![cx.pat_ident(span, test_id)],

src/libsyntax_ext/deriving/generic/mod.rs

+26-20
Original file line numberDiff line numberDiff line change
@@ -1510,26 +1510,32 @@ impl<'a> TraitDef<'a> {
15101510
}
15111511

15121512
let subpats = self.create_subpatterns(cx, paths, mutbl);
1513-
let pattern = if struct_def.is_struct() {
1514-
let field_pats = subpats.into_iter()
1515-
.zip(&ident_exprs)
1516-
.map(|(pat, &(sp, ident, _, _))| {
1517-
if ident.is_none() {
1518-
cx.span_bug(sp, "a braced struct with unnamed fields in `derive`");
1519-
}
1520-
codemap::Spanned {
1521-
span: pat.span,
1522-
node: ast::FieldPat {
1523-
ident: ident.unwrap(),
1524-
pat: pat,
1525-
is_shorthand: false,
1526-
},
1527-
}
1528-
})
1529-
.collect();
1530-
cx.pat_struct(self.span, struct_path, field_pats)
1531-
} else {
1532-
cx.pat_enum(self.span, struct_path, subpats)
1513+
let pattern = match *struct_def {
1514+
VariantData::Struct(..) => {
1515+
let field_pats = subpats.into_iter()
1516+
.zip(&ident_exprs)
1517+
.map(|(pat, &(sp, ident, _, _))| {
1518+
if ident.is_none() {
1519+
cx.span_bug(sp, "a braced struct with unnamed fields in `derive`");
1520+
}
1521+
codemap::Spanned {
1522+
span: pat.span,
1523+
node: ast::FieldPat {
1524+
ident: ident.unwrap(),
1525+
pat: pat,
1526+
is_shorthand: false,
1527+
},
1528+
}
1529+
})
1530+
.collect();
1531+
cx.pat_struct(self.span, struct_path, field_pats)
1532+
}
1533+
VariantData::Tuple(..) => {
1534+
cx.pat_tuple_struct(self.span, struct_path, subpats)
1535+
}
1536+
VariantData::Unit(..) => {
1537+
cx.pat_path(self.span, struct_path)
1538+
}
15331539
};
15341540

15351541
(pattern, ident_exprs)

0 commit comments

Comments
 (0)