feat(exhaustiveness): check tuple patterns
This commit is contained in:
parent
f1100e901d
commit
ef2fc57ca9
|
@ -9,6 +9,7 @@ use crate::{
|
||||||
|
|
||||||
const NIL_NAME: &str = "[]";
|
const NIL_NAME: &str = "[]";
|
||||||
const CONS_NAME: &str = "::";
|
const CONS_NAME: &str = "::";
|
||||||
|
const TUPLE_NAME: &str = "__Tuple";
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) struct PatternStack(Vec<Pattern>);
|
pub(crate) struct PatternStack(Vec<Pattern>);
|
||||||
|
@ -401,6 +402,16 @@ impl Pattern {
|
||||||
match self {
|
match self {
|
||||||
Pattern::Wildcard => "_".to_string(),
|
Pattern::Wildcard => "_".to_string(),
|
||||||
Pattern::Literal(_) => unreachable!("maybe never happens?"),
|
Pattern::Literal(_) => unreachable!("maybe never happens?"),
|
||||||
|
Pattern::Constructor(name, _alts, args) if name.contains(TUPLE_NAME) => {
|
||||||
|
let mut pretty_pattern = "(".to_string();
|
||||||
|
|
||||||
|
pretty_pattern.push_str(&args.into_iter().map(Pattern::pretty).join(", "));
|
||||||
|
|
||||||
|
pretty_pattern.push(')');
|
||||||
|
|
||||||
|
pretty_pattern
|
||||||
|
}
|
||||||
|
|
||||||
Pattern::Constructor(name, _alts, args) if name == CONS_NAME => {
|
Pattern::Constructor(name, _alts, args) if name == CONS_NAME => {
|
||||||
let mut pretty_pattern = "[".to_string();
|
let mut pretty_pattern = "[".to_string();
|
||||||
|
|
||||||
|
@ -604,17 +615,28 @@ pub(super) fn simplify(
|
||||||
Ok(Pattern::Constructor(name.to_string(), alts, args))
|
Ok(Pattern::Constructor(name.to_string(), alts, args))
|
||||||
}
|
}
|
||||||
ast::Pattern::Tuple { elems, .. } => {
|
ast::Pattern::Tuple { elems, .. } => {
|
||||||
let mut p = Pattern::Constructor(NIL_NAME.to_string(), list_constructors(), vec![]);
|
let mut args = vec![];
|
||||||
|
|
||||||
for hd in elems.iter().rev() {
|
for elem in elems {
|
||||||
p = Pattern::Constructor(
|
args.push(simplify(environment, elem)?);
|
||||||
CONS_NAME.to_string(),
|
|
||||||
list_constructors(),
|
|
||||||
vec![simplify(environment, hd)?, p],
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(p)
|
Ok(Pattern::Constructor(
|
||||||
|
TUPLE_NAME.to_string(),
|
||||||
|
vec![tipo::ValueConstructor {
|
||||||
|
tipo: tipo::Type::Tuple { elems: vec![] }.into(),
|
||||||
|
public: true,
|
||||||
|
variant: tipo::ValueConstructorVariant::Record {
|
||||||
|
name: TUPLE_NAME.to_string(),
|
||||||
|
arity: elems.len(),
|
||||||
|
field_map: None,
|
||||||
|
location: ast::Span::empty(),
|
||||||
|
module: "".to_string(),
|
||||||
|
constructors_count: 1,
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
args,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
ast::Pattern::Var { .. } | ast::Pattern::Discard { .. } => Ok(Pattern::Wildcard),
|
ast::Pattern::Var { .. } | ast::Pattern::Discard { .. } => Ok(Pattern::Wildcard),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue