From f843f23abae72ba3bd2920edc2a8635eafb61409 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Jul 2018 15:33:51 +0300 Subject: [PATCH] Type ascription in let --- src/parser/grammar/items/mod.rs | 15 ++++- tests/data/parser/inline/0050_let_stmt;.rs | 6 ++ tests/data/parser/inline/0050_let_stmt;.txt | 71 +++++++++++++++++++++ 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 tests/data/parser/inline/0050_let_stmt;.rs create mode 100644 tests/data/parser/inline/0050_let_stmt;.txt diff --git a/src/parser/grammar/items/mod.rs b/src/parser/grammar/items/mod.rs index 73fd5235a9..00c52dc09e 100644 --- a/src/parser/grammar/items/mod.rs +++ b/src/parser/grammar/items/mod.rs @@ -267,13 +267,24 @@ fn fn_item(p: &mut Parser) { m.complete(p, BLOCK); } + // test let_stmt; + // fn foo() { + // let a; + // let b: i32; + // let c = 92; + // let d: i32 = 92; + // } fn let_stmt(p: &mut Parser) { assert!(p.at(LET_KW)); let m = p.start(); p.bump(); patterns::pattern(p); - p.expect(EQ); - expressions::expr(p); + if p.eat(COLON) { + types::type_(p); + } + if p.eat(EQ) { + expressions::expr(p); + } p.expect(SEMI); m.complete(p, LET_STMT); } diff --git a/tests/data/parser/inline/0050_let_stmt;.rs b/tests/data/parser/inline/0050_let_stmt;.rs new file mode 100644 index 0000000000..0a9af907f5 --- /dev/null +++ b/tests/data/parser/inline/0050_let_stmt;.rs @@ -0,0 +1,6 @@ +fn foo() { + let a; + let b: i32; + let c = 92; + let d: i32 = 92; +} diff --git a/tests/data/parser/inline/0050_let_stmt;.txt b/tests/data/parser/inline/0050_let_stmt;.txt new file mode 100644 index 0000000000..b7acf8744b --- /dev/null +++ b/tests/data/parser/inline/0050_let_stmt;.txt @@ -0,0 +1,71 @@ +FILE@[0; 77) + FN_ITEM@[0; 77) + 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@[9; 77) + L_CURLY@[9; 10) + LET_STMT@[10; 26) + WHITESPACE@[10; 15) + LET_KW@[15; 18) + BIND_PAT@[18; 20) + NAME@[18; 20) + WHITESPACE@[18; 19) + IDENT@[19; 20) "a" + SEMI@[20; 21) + WHITESPACE@[21; 26) + LET_STMT@[26; 42) + LET_KW@[26; 29) + BIND_PAT@[29; 31) + NAME@[29; 31) + WHITESPACE@[29; 30) + IDENT@[30; 31) "b" + COLON@[31; 32) + PATH_TYPE@[32; 36) + PATH@[32; 36) + PATH_SEGMENT@[32; 36) + NAME_REF@[32; 36) + WHITESPACE@[32; 33) + IDENT@[33; 36) "i32" + SEMI@[36; 37) + WHITESPACE@[37; 42) + LET_STMT@[42; 58) + LET_KW@[42; 45) + BIND_PAT@[45; 48) + NAME@[45; 48) + WHITESPACE@[45; 46) + IDENT@[46; 47) "c" + WHITESPACE@[47; 48) + EQ@[48; 49) + LITERAL@[49; 52) + WHITESPACE@[49; 50) + INT_NUMBER@[50; 52) + SEMI@[52; 53) + WHITESPACE@[53; 58) + LET_STMT@[58; 75) + LET_KW@[58; 61) + BIND_PAT@[61; 63) + NAME@[61; 63) + WHITESPACE@[61; 62) + IDENT@[62; 63) "d" + COLON@[63; 64) + PATH_TYPE@[64; 69) + PATH@[64; 69) + PATH_SEGMENT@[64; 69) + NAME_REF@[64; 69) + WHITESPACE@[64; 65) + IDENT@[65; 68) "i32" + WHITESPACE@[68; 69) + EQ@[69; 70) + LITERAL@[70; 73) + WHITESPACE@[70; 71) + INT_NUMBER@[71; 73) + SEMI@[73; 74) + WHITESPACE@[74; 75) + R_CURLY@[75; 76) + WHITESPACE@[76; 77)