More type name stuff - compiling!
This commit is contained in:
parent
78b86b3531
commit
ad0434007b
@ -457,8 +457,10 @@ fn formal_params(text: &str) -> ParseResult<Vec<FormalParam>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn formal_param(text: &str) -> ParseResult<FormalParam> {
|
fn formal_param(text: &str) -> ParseResult<FormalParam> {
|
||||||
let p = tuple((identifier, opt(type_anno)));
|
let default = opt(preceded(ws(tag("=")), expression));
|
||||||
//TODO handle default arg
|
let p = tuple((ws(identifier), opt(ws(type_anno)), default));
|
||||||
|
map(p, |(name, anno, default)|
|
||||||
|
FormalParam { name, anno, default })(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_declaration(text: &str) -> ParseResult<Declaration> {
|
fn type_declaration(text: &str) -> ParseResult<Declaration> {
|
||||||
@ -466,7 +468,7 @@ fn type_declaration(text: &str) -> ParseResult<Declaration> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn type_declaration_body(text: &str) -> ParseResult<Declaration> {
|
fn type_declaration_body(text: &str) -> ParseResult<Declaration> {
|
||||||
let t = tuple((opt(tag("mut"))), ws(type_singleton_name), ws(tag("=")), ws(type_body));
|
let t = tuple((opt(tag("mut")), ws(type_singleton_name), ws(tag("=")), ws(type_body)));
|
||||||
alt((
|
alt((
|
||||||
preceded(tag("alias"), ws(type_alias)),
|
preceded(tag("alias"), ws(type_alias)),
|
||||||
map(t, |(mut_kw, name, _, body)| {
|
map(t, |(mut_kw, name, _, body)| {
|
||||||
@ -475,10 +477,29 @@ fn type_declaration_body(text: &str) -> ParseResult<Declaration> {
|
|||||||
))(text)
|
))(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn type_body(text: &str) -> ParseResult<TypeBody> {
|
||||||
|
let p = separated_nonempty_list(ws(tag("|")), variant_specifier);
|
||||||
|
map(p, TypeBody)(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn variant_specifier(text: &str) -> ParseResult<Variant> {
|
||||||
|
use self::Variant::*;
|
||||||
|
let tuple_struct =
|
||||||
|
delimited(tag("("), separated_nonempty_list(ws(tag(",")), type_name), ws(tag(")")));
|
||||||
|
//TODO record
|
||||||
|
|
||||||
|
let p = tuple((identifier, opt(tuple_struct)));
|
||||||
|
map(p, |(name, maybe_tuple_members)| match maybe_tuple_members {
|
||||||
|
Some(members) => TupleStruct(name, members),
|
||||||
|
None => UnitStruct(name),
|
||||||
|
})(text)
|
||||||
|
}
|
||||||
|
|
||||||
fn type_singleton_name(text: &str) -> ParseResult<TypeSingletonName> {
|
fn type_singleton_name(text: &str) -> ParseResult<TypeSingletonName> {
|
||||||
tuple((identifier, opt(delimited(tag("<"),
|
let p = tuple((identifier, opt(delimited(tag("<"),
|
||||||
separated_nonempty_list(tag(","), ws(type_name)),
|
separated_nonempty_list(tag(","), ws(type_name)),
|
||||||
tag(">")))))(text)
|
tag(">")))));
|
||||||
|
map(p, |(name, params)| TypeSingletonName { name, params: params.unwrap_or(vec![]) })(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_alias(text: &str) -> ParseResult<Declaration> {
|
fn type_alias(text: &str) -> ParseResult<Declaration> {
|
||||||
|
Loading…
Reference in New Issue
Block a user