From 8cf962f1f56717646af7f67642d2724cb27928d0 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 5 Aug 2018 17:19:03 +0300 Subject: Paren expr --- src/grammar.ron | 1 + src/grammar/expressions/atom.rs | 19 +++++++++++++- src/syntax_kinds/generated.rs | 2 ++ tests/data/parser/inline/0080_tuple_expr.rs | 5 ++++ tests/data/parser/inline/0080_tuple_expr.txt | 38 ++++++++++++++++++++++++++++ 5 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 tests/data/parser/inline/0080_tuple_expr.rs create mode 100644 tests/data/parser/inline/0080_tuple_expr.txt diff --git a/src/grammar.ron b/src/grammar.ron index 67022b296..a73e4e1f1 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -138,6 +138,7 @@ Grammar( // atoms "TUPLE_EXPR", + "PAREN_EXPR", "PATH_EXPR", "LAMBDA_EXPR", "IF_EXPR", diff --git a/src/grammar/expressions/atom.rs b/src/grammar/expressions/atom.rs index 6a0d47d82..4eb638c3c 100644 --- a/src/grammar/expressions/atom.rs +++ b/src/grammar/expressions/atom.rs @@ -60,12 +60,29 @@ pub(super) fn atom_expr(p: &mut Parser, r: Restrictions) -> Option CompletedMarker { assert!(p.at(L_PAREN)); let m = p.start(); p.expect(L_PAREN); + + let mut saw_comma = false; + let mut saw_expr = false; + while !p.at(EOF) && !p.at(R_PAREN) { + saw_expr = true; + expr(p); + if !p.at(R_PAREN) { + saw_comma = true; + p.expect(COMMA); + } + } p.expect(R_PAREN); - m.complete(p, TUPLE_EXPR) + m.complete(p, if saw_expr && !saw_comma { PAREN_EXPR } else { TUPLE_EXPR }) } // test lambda_expr diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 8dfeb2b82..fe1a6694c 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -128,6 +128,7 @@ pub enum SyntaxKind { STRUCT_PAT, TUPLE_PAT, TUPLE_EXPR, + PAREN_EXPR, PATH_EXPR, LAMBDA_EXPR, IF_EXPR, @@ -353,6 +354,7 @@ impl SyntaxKind { STRUCT_PAT => &SyntaxInfo { name: "STRUCT_PAT" }, TUPLE_PAT => &SyntaxInfo { name: "TUPLE_PAT" }, TUPLE_EXPR => &SyntaxInfo { name: "TUPLE_EXPR" }, + PAREN_EXPR => &SyntaxInfo { name: "PAREN_EXPR" }, PATH_EXPR => &SyntaxInfo { name: "PATH_EXPR" }, LAMBDA_EXPR => &SyntaxInfo { name: "LAMBDA_EXPR" }, IF_EXPR => &SyntaxInfo { name: "IF_EXPR" }, diff --git a/tests/data/parser/inline/0080_tuple_expr.rs b/tests/data/parser/inline/0080_tuple_expr.rs new file mode 100644 index 000000000..e4f774280 --- /dev/null +++ b/tests/data/parser/inline/0080_tuple_expr.rs @@ -0,0 +1,5 @@ +fn foo() { + (); + (1); + (1,); +} diff --git a/tests/data/parser/inline/0080_tuple_expr.txt b/tests/data/parser/inline/0080_tuple_expr.txt new file mode 100644 index 000000000..bf0223c1c --- /dev/null +++ b/tests/data/parser/inline/0080_tuple_expr.txt @@ -0,0 +1,38 @@ +FILE@[0; 40) + FN_ITEM@[0; 40) + FN_KW@[0; 2) + NAME@[2; 6) + WHITESPACE@[2; 3) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 9) + L_PAREN@[6; 7) + R_PAREN@[7; 8) + WHITESPACE@[8; 9) + BLOCK_EXPR@[9; 40) + L_CURLY@[9; 10) + EXPR_STMT@[10; 23) + TUPLE_EXPR@[10; 17) + WHITESPACE@[10; 15) + L_PAREN@[15; 16) + R_PAREN@[16; 17) + SEMI@[17; 18) + WHITESPACE@[18; 23) + EXPR_STMT@[23; 32) + PAREN_EXPR@[23; 26) + L_PAREN@[23; 24) + LITERAL@[24; 25) + INT_NUMBER@[24; 25) "1" + R_PAREN@[25; 26) + SEMI@[26; 27) + WHITESPACE@[27; 32) + EXPR_STMT@[32; 38) + TUPLE_EXPR@[32; 36) + L_PAREN@[32; 33) + LITERAL@[33; 34) + INT_NUMBER@[33; 34) "1" + COMMA@[34; 35) + R_PAREN@[35; 36) + SEMI@[36; 37) + WHITESPACE@[37; 38) + R_CURLY@[38; 39) + WHITESPACE@[39; 40) -- cgit v1.2.3