AST refactoring: merge PatWild and PatWildMulti into one variant with a flag.
This commit is contained in:
parent
b09a02b415
commit
d3202354f5
20 changed files with 42 additions and 36 deletions
|
@ -594,7 +594,7 @@ fn exec<'t>(which: ::regex::native::MatchKind, input: &'t str,
|
||||||
pats: vec!(box(GC) ast::Pat{
|
pats: vec!(box(GC) ast::Pat{
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
span: self.sp,
|
span: self.sp,
|
||||||
node: ast::PatWild,
|
node: ast::PatWild(ast::PatWildSingle),
|
||||||
}),
|
}),
|
||||||
guard: None,
|
guard: None,
|
||||||
body: body,
|
body: body,
|
||||||
|
|
|
@ -112,7 +112,7 @@ impl<'a> CFGBuilder<'a> {
|
||||||
ast::PatEnum(_, None) |
|
ast::PatEnum(_, None) |
|
||||||
ast::PatLit(..) |
|
ast::PatLit(..) |
|
||||||
ast::PatRange(..) |
|
ast::PatRange(..) |
|
||||||
ast::PatWild | ast::PatWildMulti => {
|
ast::PatWild(_) => {
|
||||||
self.add_node(pat.id, [pred])
|
self.add_node(pat.id, [pred])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -344,7 +344,7 @@ fn construct_witness(cx: &MatchCheckCtxt, ctor: &Constructor,
|
||||||
let fields = ty::lookup_struct_fields(cx.tcx, vid);
|
let fields = ty::lookup_struct_fields(cx.tcx, vid);
|
||||||
let field_pats: Vec<FieldPat> = fields.move_iter()
|
let field_pats: Vec<FieldPat> = fields.move_iter()
|
||||||
.zip(pats.iter())
|
.zip(pats.iter())
|
||||||
.filter(|&(_, pat)| pat.node != PatWild)
|
.filter(|&(_, pat)| pat.node != PatWild(PatWildSingle))
|
||||||
.map(|(field, pat)| FieldPat {
|
.map(|(field, pat)| FieldPat {
|
||||||
ident: Ident::new(field.name),
|
ident: Ident::new(field.name),
|
||||||
pat: pat.clone()
|
pat: pat.clone()
|
||||||
|
@ -372,7 +372,7 @@ fn construct_witness(cx: &MatchCheckCtxt, ctor: &Constructor,
|
||||||
},
|
},
|
||||||
_ => unreachable!()
|
_ => unreachable!()
|
||||||
},
|
},
|
||||||
ty::ty_str => PatWild,
|
ty::ty_str => PatWild(PatWildSingle),
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
assert_eq!(pats.len(), 1);
|
assert_eq!(pats.len(), 1);
|
||||||
|
@ -394,7 +394,7 @@ fn construct_witness(cx: &MatchCheckCtxt, ctor: &Constructor,
|
||||||
_ => {
|
_ => {
|
||||||
match *ctor {
|
match *ctor {
|
||||||
ConstantValue(ref v) => PatLit(const_val_to_expr(v)),
|
ConstantValue(ref v) => PatLit(const_val_to_expr(v)),
|
||||||
_ => PatWild
|
_ => PatWild(PatWildSingle),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -599,7 +599,7 @@ fn pat_constructors(cx: &MatchCheckCtxt, p: Gc<Pat>,
|
||||||
},
|
},
|
||||||
PatBox(_) | PatTup(_) | PatRegion(..) =>
|
PatBox(_) | PatTup(_) | PatRegion(..) =>
|
||||||
vec!(Single),
|
vec!(Single),
|
||||||
PatWild | PatWildMulti =>
|
PatWild(_) =>
|
||||||
vec!(),
|
vec!(),
|
||||||
PatMac(_) =>
|
PatMac(_) =>
|
||||||
cx.tcx.sess.bug("unexpanded macro")
|
cx.tcx.sess.bug("unexpanded macro")
|
||||||
|
@ -666,10 +666,7 @@ pub fn specialize(cx: &MatchCheckCtxt, r: &[Gc<Pat>],
|
||||||
id: pat_id, node: ref node, span: pat_span
|
id: pat_id, node: ref node, span: pat_span
|
||||||
} = &(*raw_pat(r[col]));
|
} = &(*raw_pat(r[col]));
|
||||||
let head: Option<Vec<Gc<Pat>>> = match node {
|
let head: Option<Vec<Gc<Pat>>> = match node {
|
||||||
&PatWild =>
|
&PatWild(_) =>
|
||||||
Some(Vec::from_elem(arity, wild())),
|
|
||||||
|
|
||||||
&PatWildMulti =>
|
|
||||||
Some(Vec::from_elem(arity, wild())),
|
Some(Vec::from_elem(arity, wild())),
|
||||||
|
|
||||||
&PatIdent(_, _, _) => {
|
&PatIdent(_, _, _) => {
|
||||||
|
|
|
@ -706,7 +706,7 @@ fn check_sized(tcx: &ty::ctxt, ty: ty::t, name: String, sp: Span) {
|
||||||
// Check that any variables in a pattern have types with statically known size.
|
// Check that any variables in a pattern have types with statically known size.
|
||||||
fn check_pat(cx: &mut Context, pat: &Pat) {
|
fn check_pat(cx: &mut Context, pat: &Pat) {
|
||||||
let var_name = match pat.node {
|
let var_name = match pat.node {
|
||||||
PatWild => Some("_".to_string()),
|
PatWild(PatWildSingle) => Some("_".to_string()),
|
||||||
PatIdent(_, ref path1, _) => Some(ident_to_string(&path1.node).to_string()),
|
PatIdent(_, ref path1, _) => Some(ident_to_string(&path1.node).to_string()),
|
||||||
_ => None
|
_ => None
|
||||||
};
|
};
|
||||||
|
|
|
@ -1026,7 +1026,7 @@ impl<'t,TYPER:Typer> MemCategorizationContext<'t,TYPER> {
|
||||||
op(self, cmt.clone(), pat);
|
op(self, cmt.clone(), pat);
|
||||||
|
|
||||||
match pat.node {
|
match pat.node {
|
||||||
ast::PatWild | ast::PatWildMulti => {
|
ast::PatWild(_) => {
|
||||||
// _
|
// _
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ pub fn pat_is_binding(dm: &resolve::DefMap, pat: &Pat) -> bool {
|
||||||
pub fn pat_is_binding_or_wild(dm: &resolve::DefMap, pat: &Pat) -> bool {
|
pub fn pat_is_binding_or_wild(dm: &resolve::DefMap, pat: &Pat) -> bool {
|
||||||
match pat.node {
|
match pat.node {
|
||||||
PatIdent(..) => pat_is_binding(dm, pat),
|
PatIdent(..) => pat_is_binding(dm, pat),
|
||||||
PatWild | PatWildMulti => true,
|
PatWild(_) => true,
|
||||||
_ => false
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ pub fn simple_identifier<'a>(pat: &'a Pat) -> Option<&'a Ident> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn wild() -> Gc<Pat> {
|
pub fn wild() -> Gc<Pat> {
|
||||||
box (GC) Pat { id: 0, node: PatWild, span: DUMMY_SP }
|
box (GC) Pat { id: 0, node: PatWild(PatWildSingle), span: DUMMY_SP }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn def_to_path(tcx: &ty::ctxt, id: DefId) -> Path {
|
pub fn def_to_path(tcx: &ty::ctxt, id: DefId) -> Path {
|
||||||
|
|
|
@ -1392,7 +1392,7 @@ fn trans_match_inner<'a>(scope_cx: &'a Block<'a>,
|
||||||
// to the default arm.
|
// to the default arm.
|
||||||
let has_default = arms.last().map_or(false, |arm| {
|
let has_default = arms.last().map_or(false, |arm| {
|
||||||
arm.pats.len() == 1
|
arm.pats.len() == 1
|
||||||
&& arm.pats.last().unwrap().node == ast::PatWild
|
&& arm.pats.last().unwrap().node == ast::PatWild(ast::PatWildSingle)
|
||||||
});
|
});
|
||||||
|
|
||||||
compile_submatch(bcx, matches.as_slice(), [discr_datum.val], &chk, has_default);
|
compile_submatch(bcx, matches.as_slice(), [discr_datum.val], &chk, has_default);
|
||||||
|
@ -1762,7 +1762,7 @@ fn bind_irrefutable_pat<'a>(
|
||||||
ast::PatMac(..) => {
|
ast::PatMac(..) => {
|
||||||
bcx.sess().span_bug(pat.span, "unexpanded macro");
|
bcx.sess().span_bug(pat.span, "unexpanded macro");
|
||||||
}
|
}
|
||||||
ast::PatWild | ast::PatWildMulti | ast::PatLit(_) | ast::PatRange(_, _) => ()
|
ast::PatWild(_) | ast::PatLit(_) | ast::PatRange(_, _) => ()
|
||||||
}
|
}
|
||||||
return bcx;
|
return bcx;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1032,7 +1032,7 @@ pub fn store_ty(cx: &Block, v: ValueRef, dst: ValueRef, t: ty::t) {
|
||||||
|
|
||||||
pub fn ignore_lhs(_bcx: &Block, local: &ast::Local) -> bool {
|
pub fn ignore_lhs(_bcx: &Block, local: &ast::Local) -> bool {
|
||||||
match local.pat.node {
|
match local.pat.node {
|
||||||
ast::PatWild => true, _ => false
|
ast::PatWild(ast::PatWildSingle) => true, _ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3429,7 +3429,7 @@ fn populate_scope_map(cx: &CrateContext,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast::PatWild | ast::PatWildMulti => {
|
ast::PatWild(_) => {
|
||||||
scope_map.insert(pat.id, scope_stack.last().unwrap().scope_metadata);
|
scope_map.insert(pat.id, scope_stack.last().unwrap().scope_metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -412,7 +412,7 @@ pub fn check_pat(pcx: &pat_ctxt, pat: &ast::Pat, expected: ty::t) {
|
||||||
let tcx = pcx.fcx.ccx.tcx;
|
let tcx = pcx.fcx.ccx.tcx;
|
||||||
|
|
||||||
match pat.node {
|
match pat.node {
|
||||||
ast::PatWild | ast::PatWildMulti => {
|
ast::PatWild(_) => {
|
||||||
fcx.write_ty(pat.id, expected);
|
fcx.write_ty(pat.id, expected);
|
||||||
}
|
}
|
||||||
ast::PatLit(ref lt) => {
|
ast::PatLit(ref lt) => {
|
||||||
|
|
|
@ -1255,7 +1255,7 @@ pub fn ty_of_foreign_fn_decl(ccx: &CrateCtxt,
|
||||||
for i in decl.inputs.iter() {
|
for i in decl.inputs.iter() {
|
||||||
match (*i).pat.node {
|
match (*i).pat.node {
|
||||||
ast::PatIdent(_, _, _) => (),
|
ast::PatIdent(_, _, _) => (),
|
||||||
ast::PatWild => (),
|
ast::PatWild(ast::PatWildSingle) => (),
|
||||||
_ => {
|
_ => {
|
||||||
span_err!(ccx.tcx.sess, (*i).pat.span, E0130,
|
span_err!(ccx.tcx.sess, (*i).pat.span, E0130,
|
||||||
"patterns aren't allowed in foreign function declarations");
|
"patterns aren't allowed in foreign function declarations");
|
||||||
|
|
|
@ -1959,8 +1959,8 @@ fn name_from_pat(p: &ast::Pat) -> String {
|
||||||
debug!("Trying to get a name from pattern: {:?}", p);
|
debug!("Trying to get a name from pattern: {:?}", p);
|
||||||
|
|
||||||
match p.node {
|
match p.node {
|
||||||
PatWild => "_".to_string(),
|
PatWild(PatWildSingle) => "_".to_string(),
|
||||||
PatWildMulti => "..".to_string(),
|
PatWild(PatWildMulti) => "..".to_string(),
|
||||||
PatIdent(_, ref p, _) => token::get_ident(p.node).get().to_string(),
|
PatIdent(_, ref p, _) => token::get_ident(p.node).get().to_string(),
|
||||||
PatEnum(ref p, _) => path_to_string(p),
|
PatEnum(ref p, _) => path_to_string(p),
|
||||||
PatStruct(ref name, ref fields, etc) => {
|
PatStruct(ref name, ref fields, etc) => {
|
||||||
|
|
|
@ -324,9 +324,19 @@ pub enum BindingMode {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)]
|
#[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)]
|
||||||
pub enum Pat_ {
|
pub enum PatWildKind {
|
||||||
PatWild,
|
/// Represents the wildcard pattern `_`
|
||||||
|
PatWildSingle,
|
||||||
|
|
||||||
|
/// Represents the wildcard pattern `..`
|
||||||
PatWildMulti,
|
PatWildMulti,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)]
|
||||||
|
pub enum Pat_ {
|
||||||
|
/// Represents a wildcard pattern (either `_` or `..`)
|
||||||
|
PatWild(PatWildKind),
|
||||||
|
|
||||||
/// A PatIdent may either be a new bound variable,
|
/// A PatIdent may either be a new bound variable,
|
||||||
/// or a nullary enum (in which case the third field
|
/// or a nullary enum (in which case the third field
|
||||||
/// is None).
|
/// is None).
|
||||||
|
|
|
@ -636,7 +636,7 @@ pub fn walk_pat(pat: &Pat, it: |&Pat| -> bool) -> bool {
|
||||||
after.iter().all(|p| walk_pat(&**p, |p| it(p)))
|
after.iter().all(|p| walk_pat(&**p, |p| it(p)))
|
||||||
}
|
}
|
||||||
PatMac(_) => fail!("attempted to analyze unexpanded pattern"),
|
PatMac(_) => fail!("attempted to analyze unexpanded pattern"),
|
||||||
PatWild | PatWildMulti | PatLit(_) | PatRange(_, _) | PatIdent(_, _, _) |
|
PatWild(_) | PatLit(_) | PatRange(_, _) | PatIdent(_, _, _) |
|
||||||
PatEnum(_, _) => {
|
PatEnum(_, _) => {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,7 +229,7 @@ impl DummyResult {
|
||||||
pub fn raw_pat(sp: Span) -> Gc<ast::Pat> {
|
pub fn raw_pat(sp: Span) -> Gc<ast::Pat> {
|
||||||
box(GC) ast::Pat {
|
box(GC) ast::Pat {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
node: ast::PatWild,
|
node: ast::PatWild(ast::PatWildSingle),
|
||||||
span: sp,
|
span: sp,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -763,7 +763,7 @@ impl<'a> AstBuilder for ExtCtxt<'a> {
|
||||||
box(GC) ast::Pat { id: ast::DUMMY_NODE_ID, node: pat, span: span }
|
box(GC) ast::Pat { id: ast::DUMMY_NODE_ID, node: pat, span: span }
|
||||||
}
|
}
|
||||||
fn pat_wild(&self, span: Span) -> Gc<ast::Pat> {
|
fn pat_wild(&self, span: Span) -> Gc<ast::Pat> {
|
||||||
self.pat(span, ast::PatWild)
|
self.pat(span, ast::PatWild(ast::PatWildSingle))
|
||||||
}
|
}
|
||||||
fn pat_lit(&self, span: Span, expr: Gc<ast::Expr>) -> Gc<ast::Pat> {
|
fn pat_lit(&self, span: Span, expr: Gc<ast::Expr>) -> Gc<ast::Pat> {
|
||||||
self.pat(span, ast::PatLit(expr))
|
self.pat(span, ast::PatLit(expr))
|
||||||
|
|
|
@ -969,8 +969,7 @@ pub fn noop_fold_method<T: Folder>(m: &Method, folder: &mut T) -> SmallVector<Gc
|
||||||
pub fn noop_fold_pat<T: Folder>(p: Gc<Pat>, folder: &mut T) -> Gc<Pat> {
|
pub fn noop_fold_pat<T: Folder>(p: Gc<Pat>, folder: &mut T) -> Gc<Pat> {
|
||||||
let id = folder.new_id(p.id);
|
let id = folder.new_id(p.id);
|
||||||
let node = match p.node {
|
let node = match p.node {
|
||||||
PatWild => PatWild,
|
PatWild(k) => PatWild(k),
|
||||||
PatWildMulti => PatWildMulti,
|
|
||||||
PatIdent(binding_mode, ref pth1, ref sub) => {
|
PatIdent(binding_mode, ref pth1, ref sub) => {
|
||||||
PatIdent(binding_mode,
|
PatIdent(binding_mode,
|
||||||
Spanned{span: folder.new_span(pth1.span),
|
Spanned{span: folder.new_span(pth1.span),
|
||||||
|
|
|
@ -39,7 +39,7 @@ use ast::{MutImmutable, MutMutable, Mac_, MacInvocTT, Matcher, MatchNonterminal}
|
||||||
use ast::{MatchSeq, MatchTok, Method, MutTy, BiMul, Mutability};
|
use ast::{MatchSeq, MatchTok, Method, MutTy, BiMul, Mutability};
|
||||||
use ast::{NamedField, UnNeg, NoReturn, UnNot, P, Pat, PatEnum};
|
use ast::{NamedField, UnNeg, NoReturn, UnNot, P, Pat, PatEnum};
|
||||||
use ast::{PatIdent, PatLit, PatRange, PatRegion, PatStruct};
|
use ast::{PatIdent, PatLit, PatRange, PatRegion, PatStruct};
|
||||||
use ast::{PatTup, PatBox, PatWild, PatWildMulti};
|
use ast::{PatTup, PatBox, PatWild, PatWildMulti, PatWildSingle};
|
||||||
use ast::{BiRem, Required};
|
use ast::{BiRem, Required};
|
||||||
use ast::{RetStyle, Return, BiShl, BiShr, Stmt, StmtDecl};
|
use ast::{RetStyle, Return, BiShl, BiShr, Stmt, StmtDecl};
|
||||||
use ast::{StmtExpr, StmtSemi, StmtMac, StructDef, StructField};
|
use ast::{StmtExpr, StmtSemi, StmtMac, StructDef, StructField};
|
||||||
|
@ -2822,7 +2822,7 @@ impl<'a> Parser<'a> {
|
||||||
if self.token == token::COMMA || self.token == token::RBRACKET {
|
if self.token == token::COMMA || self.token == token::RBRACKET {
|
||||||
slice = Some(box(GC) ast::Pat {
|
slice = Some(box(GC) ast::Pat {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
node: PatWildMulti,
|
node: PatWild(PatWildMulti),
|
||||||
span: self.span,
|
span: self.span,
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
@ -2920,7 +2920,7 @@ impl<'a> Parser<'a> {
|
||||||
// parse _
|
// parse _
|
||||||
token::UNDERSCORE => {
|
token::UNDERSCORE => {
|
||||||
self.bump();
|
self.bump();
|
||||||
pat = PatWild;
|
pat = PatWild(PatWildSingle);
|
||||||
hi = self.last_span.hi;
|
hi = self.last_span.hi;
|
||||||
return box(GC) ast::Pat {
|
return box(GC) ast::Pat {
|
||||||
id: ast::DUMMY_NODE_ID,
|
id: ast::DUMMY_NODE_ID,
|
||||||
|
|
|
@ -1732,8 +1732,8 @@ impl<'a> State<'a> {
|
||||||
/* Pat isn't normalized, but the beauty of it
|
/* Pat isn't normalized, but the beauty of it
|
||||||
is that it doesn't matter */
|
is that it doesn't matter */
|
||||||
match pat.node {
|
match pat.node {
|
||||||
ast::PatWild => try!(word(&mut self.s, "_")),
|
ast::PatWild(ast::PatWildSingle) => try!(word(&mut self.s, "_")),
|
||||||
ast::PatWildMulti => try!(word(&mut self.s, "..")),
|
ast::PatWild(ast::PatWildMulti) => try!(word(&mut self.s, "..")),
|
||||||
ast::PatIdent(binding_mode, ref path1, sub) => {
|
ast::PatIdent(binding_mode, ref path1, sub) => {
|
||||||
match binding_mode {
|
match binding_mode {
|
||||||
ast::BindByRef(mutbl) => {
|
ast::BindByRef(mutbl) => {
|
||||||
|
@ -1822,7 +1822,7 @@ impl<'a> State<'a> {
|
||||||
for p in slice.iter() {
|
for p in slice.iter() {
|
||||||
if !before.is_empty() { try!(self.word_space(",")); }
|
if !before.is_empty() { try!(self.word_space(",")); }
|
||||||
match **p {
|
match **p {
|
||||||
ast::Pat { node: ast::PatWildMulti, .. } => {
|
ast::Pat { node: ast::PatWild(ast::PatWildMulti), .. } => {
|
||||||
// this case is handled by print_pat
|
// this case is handled by print_pat
|
||||||
}
|
}
|
||||||
_ => try!(word(&mut self.s, "..")),
|
_ => try!(word(&mut self.s, "..")),
|
||||||
|
|
|
@ -481,7 +481,7 @@ pub fn walk_pat<E: Clone, V: Visitor<E>>(visitor: &mut V, pattern: &Pat, env: E)
|
||||||
visitor.visit_expr(&**lower_bound, env.clone());
|
visitor.visit_expr(&**lower_bound, env.clone());
|
||||||
visitor.visit_expr(&**upper_bound, env)
|
visitor.visit_expr(&**upper_bound, env)
|
||||||
}
|
}
|
||||||
PatWild | PatWildMulti => (),
|
PatWild(_) => (),
|
||||||
PatVec(ref prepattern, ref slice_pattern, ref postpatterns) => {
|
PatVec(ref prepattern, ref slice_pattern, ref postpatterns) => {
|
||||||
for prepattern in prepattern.iter() {
|
for prepattern in prepattern.iter() {
|
||||||
visitor.visit_pat(&**prepattern, env.clone())
|
visitor.visit_pat(&**prepattern, env.clone())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue