From 7087c9be0f4caddd6fc2b731592d54b4d077ac23 Mon Sep 17 00:00:00 2001 From: Nilstrieb <48135649+Nilstrieb@users.noreply.github.com> Date: Sat, 9 Apr 2022 11:57:40 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parser/src/lib.rs | 2 +- parser/src/parser.rs | 40 ++++++++++++----- .../parser__parser__tests__if_else.snap | 45 +++++++++++++++++++ .../parser__parser__tests__if_no_else.snap | 40 +++++++++++++++++ .../parser__parser__tests__while_loop.snap | 39 ++++++++++++++++ 5 files changed, 155 insertions(+), 11 deletions(-) create mode 100644 parser/src/snapshots/parser__parser__tests__if_else.snap create mode 100644 parser/src/snapshots/parser__parser__tests__if_no_else.snap create mode 100644 parser/src/snapshots/parser__parser__tests__while_loop.snap diff --git a/parser/src/lib.rs b/parser/src/lib.rs index cc5d3fb..b2e87ce 100644 --- a/parser/src/lib.rs +++ b/parser/src/lib.rs @@ -19,7 +19,7 @@ pub fn parse(_str: &str, _file_name: PathBuf) -> Result { pub fn test() { let src = " fn main() { - if false {} else {} + u64 hello = 5; } "; diff --git a/parser/src/parser.rs b/parser/src/parser.rs index 66a0b41..e033feb 100644 --- a/parser/src/parser.rs +++ b/parser/src/parser.rs @@ -136,6 +136,7 @@ fn statement_parser<'src>() -> impl Parser, Stmt, Error = Error<'src .then(ident_parser()) .then_ignore(just(Token::Eq)) .then(expr_parser()) + .then_ignore(just(Token::Semi)) .map(|((ty, name), rhs)| { Stmt::VarDecl(VarDecl { name, @@ -176,16 +177,17 @@ fn statement_parser<'src>() -> impl Parser, Stmt, Error = Error<'src .delimited_by(just(Token::BraceO), just(Token::BraceC)), ) .then( - just(Token::Else).ignore_then( - if_stmt - .map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt))) - .or(stmt - .clone() - .repeated() - .delimited_by(just(Token::BraceO), just(Token::BraceC)) - .map_with_span(ElsePart::Else)) - .or_not(), - ), + just(Token::Else) + .ignore_then( + if_stmt + .map(|if_stmt| ElsePart::ElseIf(Box::new(if_stmt))) + .or(stmt + .clone() + .repeated() + .delimited_by(just(Token::BraceO), just(Token::BraceC)) + .map_with_span(ElsePart::Else)), + ) + .or_not(), ) .map_with_span(|((cond, body), else_part), span| IfStmt { cond, @@ -325,6 +327,24 @@ mod tests { insta::assert_debug_snapshot!(r); } + #[test] + fn if_no_else() { + let r = parse("fn foo() -> u64 { if false {} }"); + insta::assert_debug_snapshot!(r); + } + + #[test] + fn if_else() { + let r = parse("fn foo() -> u64 { if false {} else {} }"); + insta::assert_debug_snapshot!(r); + } + + #[test] + fn while_loop() { + let r = parse("fn foo() -> u64 { while false {} }"); + insta::assert_debug_snapshot!(r); + } + #[test] fn var_decl() { let r = parse("fn foo() -> u64 { u64 hello = 5; }"); diff --git a/parser/src/snapshots/parser__parser__tests__if_else.snap b/parser/src/snapshots/parser__parser__tests__if_else.snap new file mode 100644 index 0000000..590101a --- /dev/null +++ b/parser/src/snapshots/parser__parser__tests__if_else.snap @@ -0,0 +1,45 @@ +--- +source: parser/src/parser.rs +assertion_line: 330 +expression: r +--- +( + Some( + File { + name: "parser__parser__tests", + items: [ + FnDecl( + FnDecl { + name: "foo", + params: [], + ret_ty: Some( + Ty { + span: 12..15, + kind: U64, + }, + ), + span: 0..2, + body: [ + IfStmt( + IfStmt { + cond: Name( + "false", + ), + body: [], + else_part: Some( + Else( + [], + 35..37, + ), + ), + span: 18..37, + }, + ), + ], + }, + ), + ], + }, + ), + [], +) diff --git a/parser/src/snapshots/parser__parser__tests__if_no_else.snap b/parser/src/snapshots/parser__parser__tests__if_no_else.snap new file mode 100644 index 0000000..ed7192d --- /dev/null +++ b/parser/src/snapshots/parser__parser__tests__if_no_else.snap @@ -0,0 +1,40 @@ +--- +source: parser/src/parser.rs +assertion_line: 333 +expression: r +--- +( + Some( + File { + name: "parser__parser__tests", + items: [ + FnDecl( + FnDecl { + name: "foo", + params: [], + ret_ty: Some( + Ty { + span: 12..15, + kind: U64, + }, + ), + span: 0..2, + body: [ + IfStmt( + IfStmt { + cond: Name( + "false", + ), + body: [], + else_part: None, + span: 18..29, + }, + ), + ], + }, + ), + ], + }, + ), + [], +) diff --git a/parser/src/snapshots/parser__parser__tests__while_loop.snap b/parser/src/snapshots/parser__parser__tests__while_loop.snap new file mode 100644 index 0000000..4744129 --- /dev/null +++ b/parser/src/snapshots/parser__parser__tests__while_loop.snap @@ -0,0 +1,39 @@ +--- +source: parser/src/parser.rs +assertion_line: 336 +expression: r +--- +( + Some( + File { + name: "parser__parser__tests", + items: [ + FnDecl( + FnDecl { + name: "foo", + params: [], + ret_ty: Some( + Ty { + span: 12..15, + kind: U64, + }, + ), + span: 0..2, + body: [ + WhileStmt( + WhileStmt { + cond: Name( + "false", + ), + body: [], + span: 18..32, + }, + ), + ], + }, + ), + ], + }, + ), + [], +)