1
Fork 0

Adjust 'ast::PatKind::{TupleStruct,Tuple,Slice}'.

This commit is contained in:
Mazdak Farrokhzad 2019-07-09 09:25:18 +02:00
parent ff77ef2d70
commit 633c9972ac
4 changed files with 21 additions and 37 deletions

View file

@ -559,18 +559,13 @@ impl Pat {
return false; return false;
} }
match self.node { match &self.node {
PatKind::Ident(_, _, Some(ref p)) => p.walk(it), PatKind::Ident(_, _, Some(p)) => p.walk(it),
PatKind::Struct(_, ref fields, _) => fields.iter().all(|field| field.node.pat.walk(it)), PatKind::Struct(_, fields, _) => fields.iter().all(|field| field.node.pat.walk(it)),
PatKind::TupleStruct(_, ref s, _) | PatKind::Tuple(ref s, _) => { PatKind::TupleStruct(_, s) | PatKind::Tuple(s) | PatKind::Slice(s) => {
s.iter().all(|p| p.walk(it)) s.iter().all(|p| p.walk(it))
} }
PatKind::Box(ref s) | PatKind::Ref(ref s, _) | PatKind::Paren(ref s) => s.walk(it), PatKind::Box(s) | PatKind::Ref(s, _) | PatKind::Paren(s) => s.walk(it),
PatKind::Slice(ref before, ref slice, ref after) => {
before.iter().all(|p| p.walk(it))
&& slice.iter().all(|p| p.walk(it))
&& after.iter().all(|p| p.walk(it))
}
PatKind::Wild PatKind::Wild
| PatKind::Rest | PatKind::Rest
| PatKind::Lit(_) | PatKind::Lit(_)
@ -639,9 +634,7 @@ pub enum PatKind {
Struct(Path, Vec<Spanned<FieldPat>>, /* recovered */ bool), Struct(Path, Vec<Spanned<FieldPat>>, /* recovered */ bool),
/// A tuple struct/variant pattern (`Variant(x, y, .., z)`). /// A tuple struct/variant pattern (`Variant(x, y, .., z)`).
/// If the `..` pattern fragment is present, then `Option<usize>` denotes its position. TupleStruct(Path, Vec<P<Pat>>),
/// `0 <= position <= subpats.len()`.
TupleStruct(Path, Vec<P<Pat>>, Option<usize>),
/// A possibly qualified path pattern. /// A possibly qualified path pattern.
/// Unqualified path patterns `A::B::C` can legally refer to variants, structs, constants /// Unqualified path patterns `A::B::C` can legally refer to variants, structs, constants
@ -650,9 +643,7 @@ pub enum PatKind {
Path(Option<QSelf>, Path), Path(Option<QSelf>, Path),
/// A tuple pattern (`(a, b)`). /// A tuple pattern (`(a, b)`).
/// If the `..` pattern fragment is present, then `Option<usize>` denotes its position. Tuple(Vec<P<Pat>>),
/// `0 <= position <= subpats.len()`.
Tuple(Vec<P<Pat>>, Option<usize>),
/// A `box` pattern. /// A `box` pattern.
Box(P<Pat>), Box(P<Pat>),
@ -666,9 +657,8 @@ pub enum PatKind {
/// A range pattern (e.g., `1...2`, `1..=2` or `1..2`). /// A range pattern (e.g., `1...2`, `1..=2` or `1..2`).
Range(P<Expr>, P<Expr>, Spanned<RangeEnd>), Range(P<Expr>, P<Expr>, Spanned<RangeEnd>),
/// `[a, b, ..i, y, z]` is represented as: /// A slice pattern `[a, b, c]`.
/// `PatKind::Slice(box [a, b], Some(i), box [y, z])` Slice(Vec<P<Pat>>),
Slice(Vec<P<Pat>>, Option<P<Pat>>, Vec<P<Pat>>),
/// A rest pattern `..`. /// A rest pattern `..`.
/// ///

View file

@ -840,14 +840,14 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
} }
fn pat_tuple_struct(&self, span: Span, path: ast::Path, fn pat_tuple_struct(&self, span: Span, path: ast::Path,
subpats: Vec<P<ast::Pat>>) -> P<ast::Pat> { subpats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
self.pat(span, PatKind::TupleStruct(path, subpats, None)) self.pat(span, PatKind::TupleStruct(path, subpats))
} }
fn pat_struct(&self, span: Span, path: ast::Path, fn pat_struct(&self, span: Span, path: ast::Path,
field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat> { field_pats: Vec<Spanned<ast::FieldPat>>) -> P<ast::Pat> {
self.pat(span, PatKind::Struct(path, field_pats, false)) self.pat(span, PatKind::Struct(path, field_pats, false))
} }
fn pat_tuple(&self, span: Span, pats: Vec<P<ast::Pat>>) -> P<ast::Pat> { fn pat_tuple(&self, span: Span, pats: Vec<P<ast::Pat>>) -> P<ast::Pat> {
self.pat(span, PatKind::Tuple(pats, None)) self.pat(span, PatKind::Tuple(pats))
} }
fn pat_some(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat> { fn pat_some(&self, span: Span, pat: P<ast::Pat>) -> P<ast::Pat> {

View file

@ -1026,9 +1026,9 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
visit_opt(sub, |sub| vis.visit_pat(sub)); visit_opt(sub, |sub| vis.visit_pat(sub));
} }
PatKind::Lit(e) => vis.visit_expr(e), PatKind::Lit(e) => vis.visit_expr(e),
PatKind::TupleStruct(path, pats, _ddpos) => { PatKind::TupleStruct(path, elems) => {
vis.visit_path(path); vis.visit_path(path);
visit_vec(pats, |pat| vis.visit_pat(pat)); visit_vec(elems, |elem| vis.visit_pat(elem));
} }
PatKind::Path(qself, path) => { PatKind::Path(qself, path) => {
vis.visit_qself(qself); vis.visit_qself(qself);
@ -1043,7 +1043,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
vis.visit_span(span); vis.visit_span(span);
}; };
} }
PatKind::Tuple(elts, _ddpos) => visit_vec(elts, |elt| vis.visit_pat(elt)), PatKind::Tuple(elems) => visit_vec(elems, |elem| vis.visit_pat(elem)),
PatKind::Box(inner) => vis.visit_pat(inner), PatKind::Box(inner) => vis.visit_pat(inner),
PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner), PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner),
PatKind::Range(e1, e2, Spanned { span: _, node: _ }) => { PatKind::Range(e1, e2, Spanned { span: _, node: _ }) => {
@ -1051,11 +1051,7 @@ pub fn noop_visit_pat<T: MutVisitor>(pat: &mut P<Pat>, vis: &mut T) {
vis.visit_expr(e2); vis.visit_expr(e2);
vis.visit_span(span); vis.visit_span(span);
} }
PatKind::Slice(before, slice, after) => { PatKind::Slice(elems) => visit_vec(elems, |elem| vis.visit_pat(elem)),
visit_vec(before, |pat| vis.visit_pat(pat));
visit_opt(slice, |slice| vis.visit_pat(slice));
visit_vec(after, |pat| vis.visit_pat(pat));
}
PatKind::Paren(inner) => vis.visit_pat(inner), PatKind::Paren(inner) => vis.visit_pat(inner),
PatKind::Mac(mac) => vis.visit_mac(mac), PatKind::Mac(mac) => vis.visit_mac(mac),
} }

View file

@ -428,9 +428,9 @@ pub fn walk_assoc_ty_constraint<'a, V: Visitor<'a>>(visitor: &mut V,
pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) { pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
match pattern.node { match pattern.node {
PatKind::TupleStruct(ref path, ref children, _) => { PatKind::TupleStruct(ref path, ref elems) => {
visitor.visit_path(path, pattern.id); visitor.visit_path(path, pattern.id);
walk_list!(visitor, visit_pat, children); walk_list!(visitor, visit_pat, elems);
} }
PatKind::Path(ref opt_qself, ref path) => { PatKind::Path(ref opt_qself, ref path) => {
if let Some(ref qself) = *opt_qself { if let Some(ref qself) = *opt_qself {
@ -446,8 +446,8 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
visitor.visit_pat(&field.node.pat) visitor.visit_pat(&field.node.pat)
} }
} }
PatKind::Tuple(ref tuple_elements, _) => { PatKind::Tuple(ref elems) => {
walk_list!(visitor, visit_pat, tuple_elements); walk_list!(visitor, visit_pat, elems);
} }
PatKind::Box(ref subpattern) | PatKind::Box(ref subpattern) |
PatKind::Ref(ref subpattern, _) | PatKind::Ref(ref subpattern, _) |
@ -464,10 +464,8 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) {
visitor.visit_expr(upper_bound); visitor.visit_expr(upper_bound);
} }
PatKind::Wild | PatKind::Rest => {}, PatKind::Wild | PatKind::Rest => {},
PatKind::Slice(ref prepatterns, ref slice_pattern, ref postpatterns) => { PatKind::Slice(ref elems) => {
walk_list!(visitor, visit_pat, prepatterns); walk_list!(visitor, visit_pat, elems);
walk_list!(visitor, visit_pat, slice_pattern);
walk_list!(visitor, visit_pat, postpatterns);
} }
PatKind::Mac(ref mac) => visitor.visit_mac(mac), PatKind::Mac(ref mac) => visitor.visit_mac(mac),
} }