Tests for new type stuff
+ some renaming
This commit is contained in:
parent
c605f76059
commit
40a82d7e25
@ -432,7 +432,7 @@ pub struct TypeBody(pub Vec<Variant>);
|
|||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
pub enum Variant {
|
pub enum Variant {
|
||||||
Singleton(Rc<String>),
|
UnitStruct(Rc<String>),
|
||||||
TupleStruct(Rc<String>, Vec<TypeAnno>),
|
TupleStruct(Rc<String>, Vec<TypeAnno>),
|
||||||
Record(Rc<String>, Vec<(Rc<String>, TypeAnno)>),
|
Record(Rc<String>, Vec<(Rc<String>, TypeAnno)>),
|
||||||
}
|
}
|
||||||
@ -632,7 +632,7 @@ impl Parser {
|
|||||||
let typed_identifier_list = delimited!(self, LCurlyBrace, '{', typed_identifier, Comma, RCurlyBrace, '}');
|
let typed_identifier_list = delimited!(self, LCurlyBrace, '{', typed_identifier, Comma, RCurlyBrace, '}');
|
||||||
Ok(Record(name, typed_identifier_list))
|
Ok(Record(name, typed_identifier_list))
|
||||||
},
|
},
|
||||||
_ => Ok(Singleton(name))
|
_ => Ok(UnitStruct(name))
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -988,8 +988,9 @@ mod parse_tests {
|
|||||||
use super::{AST, Expression, Statement, Operation, TypeBody, Variant, parse, tokenize};
|
use super::{AST, Expression, Statement, Operation, TypeBody, Variant, parse, tokenize};
|
||||||
use super::Statement::*;
|
use super::Statement::*;
|
||||||
use super::Declaration::*;
|
use super::Declaration::*;
|
||||||
use super::TypeAnno;
|
use super::TypeAnno::*;
|
||||||
use super::ExpressionType::*;
|
use super::ExpressionType::*;
|
||||||
|
use super::Variant::*;
|
||||||
|
|
||||||
macro_rules! rc {
|
macro_rules! rc {
|
||||||
($string:tt) => { Rc::new(stringify!($string).to_string()) }
|
($string:tt) => { Rc::new(stringify!($string).to_string()) }
|
||||||
@ -1020,7 +1021,7 @@ mod parse_tests {
|
|||||||
($expr_type:expr) => { Expression($expr_type, None) }
|
($expr_type:expr) => { Expression($expr_type, None) }
|
||||||
}
|
}
|
||||||
macro_rules! ty {
|
macro_rules! ty {
|
||||||
($name:expr) => { TypeAnno::Singleton { name: Rc::new($name.to_string()), params: vec![] } };
|
($name:expr) => { Singleton { name: Rc::new($name.to_string()), params: vec![] } };
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -1120,8 +1121,19 @@ mod parse_tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn parsing_types() {
|
fn parsing_types() {
|
||||||
parse_test!("type Yolo = Yolo", AST(vec![Declaration(TypeDecl(rc!(Yolo), TypeBody(vec![Variant::Singleton(rc!(Yolo))])))]));
|
parse_test!("type Yolo = Yolo", AST(vec![Declaration(TypeDecl(rc!(Yolo), TypeBody(vec![UnitStruct(rc!(Yolo))])))]));
|
||||||
parse_test!("type alias Sex = Drugs", AST(vec![Declaration(TypeAlias(rc!(Sex), rc!(Drugs)))]));
|
parse_test!("type alias Sex = Drugs", AST(vec![Declaration(TypeAlias(rc!(Sex), rc!(Drugs)))]));
|
||||||
|
parse_test!("type Sanchez = Miguel | Alejandro(Int, Option<a>) | Esparanza { a: Int, b: String }",
|
||||||
|
AST(vec![Declaration(TypeDecl(rc!(Sanchez), TypeBody(vec![
|
||||||
|
UnitStruct(rc!(Miguel)),
|
||||||
|
TupleStruct(rc!(Alejandro), vec![
|
||||||
|
Singleton { name: rc!(Int), params: vec![] },
|
||||||
|
Singleton { name: rc!(Option), params: vec![Singleton { name: rc!(a), params: vec![] }] },
|
||||||
|
]),
|
||||||
|
Record(rc!(Esparanza), vec![
|
||||||
|
(rc!(a), Singleton { name: rc!(Int), params: vec![] }),
|
||||||
|
(rc!(b), Singleton { name: rc!(String), params: vec![] }),
|
||||||
|
])])))]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -1176,7 +1188,7 @@ mod parse_tests {
|
|||||||
fn parsing_type_annotations() {
|
fn parsing_type_annotations() {
|
||||||
parse_test!("const a = b : Int", AST(vec![
|
parse_test!("const a = b : Int", AST(vec![
|
||||||
Declaration(Binding { name: rc!(a), constant: true, expr:
|
Declaration(Binding { name: rc!(a), constant: true, expr:
|
||||||
Expression(var!("b"), Some(TypeAnno::Singleton {
|
Expression(var!("b"), Some(Singleton {
|
||||||
name: rc!(Int),
|
name: rc!(Int),
|
||||||
params: vec![],
|
params: vec![],
|
||||||
})) })]));
|
})) })]));
|
||||||
@ -1186,18 +1198,18 @@ mod parse_tests {
|
|||||||
]));
|
]));
|
||||||
|
|
||||||
parse_test!("a : Option<Int>", AST(vec![
|
parse_test!("a : Option<Int>", AST(vec![
|
||||||
exprstatement!(var!("a"), TypeAnno::Singleton { name: rc!(Option), params: vec![ty!("Int")] })
|
exprstatement!(var!("a"), Singleton { name: rc!(Option), params: vec![ty!("Int")] })
|
||||||
]));
|
]));
|
||||||
|
|
||||||
parse_test!("a : KoreanBBQSpecifier<Kimchi, Option<Bulgogi> >", AST(vec![
|
parse_test!("a : KoreanBBQSpecifier<Kimchi, Option<Bulgogi> >", AST(vec![
|
||||||
exprstatement!(var!("a"), TypeAnno::Singleton { name: rc!(KoreanBBQSpecifier), params: vec![
|
exprstatement!(var!("a"), Singleton { name: rc!(KoreanBBQSpecifier), params: vec![
|
||||||
ty!("Kimchi"), TypeAnno::Singleton { name: rc!(Option), params: vec![ty!("Bulgogi")] }
|
ty!("Kimchi"), Singleton { name: rc!(Option), params: vec![ty!("Bulgogi")] }
|
||||||
] })
|
] })
|
||||||
]));
|
]));
|
||||||
|
|
||||||
parse_test!("a : (Int, Yolo<a>)", AST(vec![
|
parse_test!("a : (Int, Yolo<a>)", AST(vec![
|
||||||
exprstatement!(var!("a"), TypeAnno::Tuple(
|
exprstatement!(var!("a"), Tuple(
|
||||||
vec![ty!("Int"), TypeAnno::Singleton {
|
vec![ty!("Int"), Singleton {
|
||||||
name: rc!(Yolo), params: vec![ty!("a")]
|
name: rc!(Yolo), params: vec![ty!("a")]
|
||||||
}]))]));
|
}]))]));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user