Ensure that fields are either completely untagged or entirely tagged

next
Sayan Nandan 2 years ago
parent 5fbc1d2791
commit 58aea728fa
No known key found for this signature in database
GPG Key ID: 8BC07A0A4D41DD52

@ -297,7 +297,6 @@ impl<'a> Compiler<'a> {
} }
Some(Token::Keyword(Keyword::Type(ty))) => { Some(Token::Keyword(Keyword::Type(ty))) => {
// we have a type name // we have a type name
fc.names.push("unnamed".into());
fc.types.push(self.parse_type_expression(ty)?); fc.types.push(self.parse_type_expression(ty)?);
is_good_expr &= self.peek_eq(&Token::CloseParen) || self.next_eq(&Token::Comma); is_good_expr &= self.peek_eq(&Token::CloseParen) || self.next_eq(&Token::Comma);
} }
@ -306,6 +305,11 @@ impl<'a> Compiler<'a> {
} }
is_good_expr &= self.next_eq(&Token::CloseParen); is_good_expr &= self.next_eq(&Token::CloseParen);
is_good_expr &= fc.names.len() >= 2; is_good_expr &= fc.names.len() >= 2;
// important; we either have all unnamed fields or all named fields; having some unnamed
// and some named is ambiguous because there's not "straightforward" way to query them
// without introducing some funky naming conventions ($<field_number> if you don't have the
// right name sounds like an outrageous idea)
is_good_expr &= fc.names.len() == fc.types.len();
let volatile = self.next_eq(&Token::Keyword(Keyword::Volatile)); let volatile = self.next_eq(&Token::Keyword(Keyword::Volatile));
if is_good_expr { if is_good_expr {
Ok(Statement::CreateModel { Ok(Statement::CreateModel {

@ -26,6 +26,7 @@
use super::{ use super::{
ast::{Compiler, Entity, FieldConfig, Statement}, ast::{Compiler, Entity, FieldConfig, Statement},
error::LangError,
lexer::{Keyword, Lexer, Token, Type, TypeExpression}, lexer::{Keyword, Lexer, Token, Type, TypeExpression},
}; };
@ -158,6 +159,15 @@ mod ast {
}; };
(src, stmt) (src, stmt)
} }
#[test]
fn stmt_create_named_unnamed_mixed() {
let src = b"create model twitter.tweet(username: string, binary)".to_vec();
assert_eq!(
Compiler::compile(&src).unwrap_err(),
LangError::BadExpression
);
}
#[test] #[test]
fn stmt_drop_space() { fn stmt_drop_space() {
assert_eq!( assert_eq!(

Loading…
Cancel
Save