1
Fork 0

Hide internal stuff in check_match.rs

This commit is contained in:
Dmitry Ermolov 2013-10-06 23:27:36 +04:00
parent 8eb28bb7dc
commit fdb49aa917

View file

@ -28,7 +28,7 @@ use syntax::codemap::{Span, dummy_sp, Spanned};
use syntax::visit; use syntax::visit;
use syntax::visit::{Visitor,fn_kind}; use syntax::visit::{Visitor,fn_kind};
pub struct MatchCheckCtxt { struct MatchCheckCtxt {
tcx: ty::ctxt, tcx: ty::ctxt,
method_map: method_map, method_map: method_map,
moves_map: moves::MovesMap moves_map: moves::MovesMap
@ -64,7 +64,7 @@ pub fn check_crate(tcx: ty::ctxt,
tcx.sess.abort_if_errors(); tcx.sess.abort_if_errors();
} }
pub fn check_expr(v: &mut CheckMatchVisitor, fn check_expr(v: &mut CheckMatchVisitor,
cx: @MatchCheckCtxt, cx: @MatchCheckCtxt,
ex: @Expr, ex: @Expr,
s: ()) { s: ()) {
@ -115,7 +115,7 @@ pub fn check_expr(v: &mut CheckMatchVisitor,
} }
// Check for unreachable patterns // Check for unreachable patterns
pub fn check_arms(cx: &MatchCheckCtxt, arms: &[Arm]) { fn check_arms(cx: &MatchCheckCtxt, arms: &[Arm]) {
let mut seen = ~[]; let mut seen = ~[];
for arm in arms.iter() { for arm in arms.iter() {
for pat in arm.pats.iter() { for pat in arm.pats.iter() {
@ -154,14 +154,14 @@ pub fn check_arms(cx: &MatchCheckCtxt, arms: &[Arm]) {
} }
} }
pub fn raw_pat(p: @Pat) -> @Pat { fn raw_pat(p: @Pat) -> @Pat {
match p.node { match p.node {
PatIdent(_, _, Some(s)) => { raw_pat(s) } PatIdent(_, _, Some(s)) => { raw_pat(s) }
_ => { p } _ => { p }
} }
} }
pub fn check_exhaustive(cx: &MatchCheckCtxt, sp: Span, pats: ~[@Pat]) { fn check_exhaustive(cx: &MatchCheckCtxt, sp: Span, pats: ~[@Pat]) {
assert!((!pats.is_empty())); assert!((!pats.is_empty()));
let ext = match is_useful(cx, &pats.map(|p| ~[*p]), [wild()]) { let ext = match is_useful(cx, &pats.map(|p| ~[*p]), [wild()]) {
not_useful => { not_useful => {
@ -209,12 +209,12 @@ pub fn check_exhaustive(cx: &MatchCheckCtxt, sp: Span, pats: ~[@Pat]) {
cx.tcx.sess.span_err(sp, msg); cx.tcx.sess.span_err(sp, msg);
} }
pub type matrix = ~[~[@Pat]]; type matrix = ~[~[@Pat]];
pub enum useful { useful(ty::t, ctor), useful_, not_useful } enum useful { useful(ty::t, ctor), useful_, not_useful }
#[deriving(Eq)] #[deriving(Eq)]
pub enum ctor { enum ctor {
single, single,
variant(DefId), variant(DefId),
val(const_val), val(const_val),
@ -235,7 +235,7 @@ pub enum ctor {
// Note: is_useful doesn't work on empty types, as the paper notes. // Note: is_useful doesn't work on empty types, as the paper notes.
// So it assumes that v is non-empty. // So it assumes that v is non-empty.
pub fn is_useful(cx: &MatchCheckCtxt, m: &matrix, v: &[@Pat]) -> useful { fn is_useful(cx: &MatchCheckCtxt, m: &matrix, v: &[@Pat]) -> useful {
if m.len() == 0u { return useful_; } if m.len() == 0u { return useful_; }
if m[0].len() == 0u { return not_useful; } if m[0].len() == 0u { return not_useful; }
let real_pat = match m.iter().find(|r| r[0].id != 0) { let real_pat = match m.iter().find(|r| r[0].id != 0) {
@ -314,7 +314,7 @@ pub fn is_useful(cx: &MatchCheckCtxt, m: &matrix, v: &[@Pat]) -> useful {
} }
} }
pub fn is_useful_specialized(cx: &MatchCheckCtxt, fn is_useful_specialized(cx: &MatchCheckCtxt,
m: &matrix, m: &matrix,
v: &[@Pat], v: &[@Pat],
ctor: ctor, ctor: ctor,
@ -330,7 +330,7 @@ pub fn is_useful_specialized(cx: &MatchCheckCtxt,
} }
} }
pub fn pat_ctor_id(cx: &MatchCheckCtxt, p: @Pat) -> Option<ctor> { fn pat_ctor_id(cx: &MatchCheckCtxt, p: @Pat) -> Option<ctor> {
let pat = raw_pat(p); let pat = raw_pat(p);
match pat.node { match pat.node {
PatWild => { None } PatWild => { None }
@ -366,7 +366,7 @@ pub fn pat_ctor_id(cx: &MatchCheckCtxt, p: @Pat) -> Option<ctor> {
} }
} }
pub fn is_wild(cx: &MatchCheckCtxt, p: @Pat) -> bool { fn is_wild(cx: &MatchCheckCtxt, p: @Pat) -> bool {
let pat = raw_pat(p); let pat = raw_pat(p);
match pat.node { match pat.node {
PatWild => { true } PatWild => { true }
@ -380,7 +380,7 @@ pub fn is_wild(cx: &MatchCheckCtxt, p: @Pat) -> bool {
} }
} }
pub fn missing_ctor(cx: &MatchCheckCtxt, fn missing_ctor(cx: &MatchCheckCtxt,
m: &matrix, m: &matrix,
left_ty: ty::t) left_ty: ty::t)
-> Option<ctor> { -> Option<ctor> {
@ -505,7 +505,7 @@ pub fn missing_ctor(cx: &MatchCheckCtxt,
} }
} }
pub fn ctor_arity(cx: &MatchCheckCtxt, ctor: &ctor, ty: ty::t) -> uint { fn ctor_arity(cx: &MatchCheckCtxt, ctor: &ctor, ty: ty::t) -> uint {
match ty::get(ty).sty { match ty::get(ty).sty {
ty::ty_tup(ref fs) => fs.len(), ty::ty_tup(ref fs) => fs.len(),
ty::ty_box(_) | ty::ty_uniq(_) | ty::ty_rptr(*) => 1u, ty::ty_box(_) | ty::ty_uniq(_) | ty::ty_rptr(*) => 1u,
@ -528,11 +528,11 @@ pub fn ctor_arity(cx: &MatchCheckCtxt, ctor: &ctor, ty: ty::t) -> uint {
} }
} }
pub fn wild() -> @Pat { fn wild() -> @Pat {
@Pat {id: 0, node: PatWild, span: dummy_sp()} @Pat {id: 0, node: PatWild, span: dummy_sp()}
} }
pub fn specialize(cx: &MatchCheckCtxt, fn specialize(cx: &MatchCheckCtxt,
r: &[@Pat], r: &[@Pat],
ctor_id: &ctor, ctor_id: &ctor,
arity: uint, arity: uint,
@ -798,12 +798,12 @@ pub fn specialize(cx: &MatchCheckCtxt,
} }
} }
pub fn default(cx: &MatchCheckCtxt, r: &[@Pat]) -> Option<~[@Pat]> { fn default(cx: &MatchCheckCtxt, r: &[@Pat]) -> Option<~[@Pat]> {
if is_wild(cx, r[0]) { Some(r.tail().to_owned()) } if is_wild(cx, r[0]) { Some(r.tail().to_owned()) }
else { None } else { None }
} }
pub fn check_local(v: &mut CheckMatchVisitor, fn check_local(v: &mut CheckMatchVisitor,
cx: &MatchCheckCtxt, cx: &MatchCheckCtxt,
loc: @Local, loc: @Local,
s: ()) { s: ()) {
@ -817,7 +817,7 @@ pub fn check_local(v: &mut CheckMatchVisitor,
check_legality_of_move_bindings(cx, false, [ loc.pat ]); check_legality_of_move_bindings(cx, false, [ loc.pat ]);
} }
pub fn check_fn(v: &mut CheckMatchVisitor, fn check_fn(v: &mut CheckMatchVisitor,
cx: &MatchCheckCtxt, cx: &MatchCheckCtxt,
kind: &visit::fn_kind, kind: &visit::fn_kind,
decl: &fn_decl, decl: &fn_decl,
@ -834,7 +834,7 @@ pub fn check_fn(v: &mut CheckMatchVisitor,
} }
} }
pub fn is_refutable(cx: &MatchCheckCtxt, pat: &Pat) -> bool { fn is_refutable(cx: &MatchCheckCtxt, pat: &Pat) -> bool {
match cx.tcx.def_map.find(&pat.id) { match cx.tcx.def_map.find(&pat.id) {
Some(&DefVariant(enum_id, _, _)) => { Some(&DefVariant(enum_id, _, _)) => {
if ty::enum_variants(cx.tcx, enum_id).len() != 1u { if ty::enum_variants(cx.tcx, enum_id).len() != 1u {
@ -872,7 +872,7 @@ pub fn is_refutable(cx: &MatchCheckCtxt, pat: &Pat) -> bool {
// Legality of move bindings checking // Legality of move bindings checking
pub fn check_legality_of_move_bindings(cx: &MatchCheckCtxt, fn check_legality_of_move_bindings(cx: &MatchCheckCtxt,
has_guard: bool, has_guard: bool,
pats: &[@Pat]) { pats: &[@Pat]) {
let tcx = cx.tcx; let tcx = cx.tcx;