diff options
author | David Li <li.davidm96@gmail.com> | 2017-11-06 09:26:23 -0500 |
---|---|---|
committer | David Li <li.davidm96@gmail.com> | 2017-11-06 09:26:23 -0500 |
commit | 5b137e0983051bf72759cea9c4af1c4bc7a24e1f (patch) | |
tree | b1ef7efe6dbacbe3f37275fd829c8cc9eb19551c /src | |
parent | e4dfafc26756b6e9fe3df445efb5a14d4cab3e31 (diff) |
Type check record definitions
Diffstat (limited to 'src')
-rw-r--r-- | src/ast.rs | 4 | ||||
-rw-r--r-- | src/semantic/translate.rs | 15 | ||||
-rw-r--r-- | src/taiga.lalrpop | 6 |
3 files changed, 12 insertions, 13 deletions
@@ -86,11 +86,11 @@ pub enum Expression { #[derive(Debug)] pub struct RecordField { pub name: WithLocation<String>, - pub ty: WithLocation<String>, + pub ty: WithLocation<Ty>, } impl RecordField { - pub fn new(name: WithLocation<String>, ty: WithLocation<String>) -> RecordField { + pub fn new(name: WithLocation<String>, ty: WithLocation<Ty>) -> RecordField { RecordField { name, ty } } } diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs index 6c7f60c..dfcec68 100644 --- a/src/semantic/translate.rs +++ b/src/semantic/translate.rs @@ -43,14 +43,13 @@ fn trans_ty<'a>( trans_ty(venv, tenv, &inner_ty) }, ast::Ty::Record(ref fields) => { - err!(ty, TypeError::Unimplemented) - // let result = vec![]; - // for field in fields { - // result.push(types::RecordField::new( - // *field.name, - // trans_ty(venv, tenv, field.ty)?)); - // } - // Ok(Ty::Record(result)) + let mut result = vec![]; + for field in fields { + result.push(types::RecordField::new( + field.name.clone(), + trans_ty(venv, tenv, &field.ty)?)); + } + Ok(Ty::Record(result)) }, } } diff --git a/src/taiga.lalrpop b/src/taiga.lalrpop index 0c7fea0..bad60bb 100644 --- a/src/taiga.lalrpop +++ b/src/taiga.lalrpop @@ -8,13 +8,13 @@ pub Program: ast::Program = { }; FieldList: Vec<WithLocation<ast::RecordField>> = { - <l: @L> <n:Name> ":" <v:Name> <r: @R> "," <rest: FieldList> => { + <l: @L> <n:Name> ":" <v:Ty> <r: @R> "," <rest: FieldList> => { let mut rest = rest; rest.push(WithLocation::new(ast::RecordField::new(n, v), l, r)); rest }, - <l: @L> <n:Name> ":" <v:Name> <r: @R> "," => vec![WithLocation::new(ast::RecordField::new(n, v), l, r)], - <l: @L> <n:Name> ":" <v:Name> <r: @R> => vec![WithLocation::new(ast::RecordField::new(n, v), l, r)], + <l: @L> <n:Name> ":" <v:Ty> <r: @R> "," => vec![WithLocation::new(ast::RecordField::new(n, v), l, r)], + <l: @L> <n:Name> ":" <v:Ty> <r: @R> => vec![WithLocation::new(ast::RecordField::new(n, v), l, r)], }; RecordFields: WithLocation<Vec<WithLocation<ast::RecordField>>> = { |