From b63f260bbcf89a2b40358f534b97f672468294fb Mon Sep 17 00:00:00 2001 From: Geoffry Song Date: Thu, 3 Oct 2019 00:10:58 -0700 Subject: [PATCH 1/2] Lower the precedence of the `as` operator. Previously, the `as` operator was being parsed like a postfix expression, and therefore being given the highest possible precedence. That caused it to bind more tightly than prefix operators, which it should not. Instead, parse it somewhat like a normal binary expression with some special-casing. --- crates/ra_parser/src/grammar/expressions.rs | 14 +- .../parser/inline/ok/0019_unary_expr.rs | 6 +- .../parser/inline/ok/0019_unary_expr.txt | 136 +++++++++++++----- .../parser/inline/ok/0082_ref_expr.rs | 1 + .../parser/inline/ok/0082_ref_expr.txt | 41 +++++- 5 files changed, 153 insertions(+), 45 deletions(-) diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 413ecb2782ec..448b87505770 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -250,6 +250,7 @@ fn current_op(p: &Parser) -> (u8, SyntaxKind) { T![!] if p.at(T![!=]) => (5, T![!=]), T![-] if p.at(T![-=]) => (1, T![-=]), T![-] => (10, T![-]), + T![as] => (12, T![as]), _ => NOT_AN_OP } @@ -278,6 +279,10 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> (Option, if op_bp < bp { break; } + if p.at(T![as]) { + lhs = cast_expr(p, lhs); + continue; + } let m = lhs.precede(p); p.bump(op); @@ -296,6 +301,7 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> // fn foo() { // let _ = &1; // let _ = &mut &f(); + // let _ = &1 as *const i32; // } T![&] => { m = p.start(); @@ -305,9 +311,13 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> } // test unary_expr // fn foo() { - // **&1; + // **&1 + 1; // !!true; // --1; + // *&1 as u64; + // *x(1); + // &x[1]; + // -1..2; // } T![*] | T![!] | T![-] => { m = p.start(); @@ -338,6 +348,7 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> return Some(postfix_expr(p, lhs, blocklike, !(r.prefer_stmt && blocklike.is_block()))); } }; + // parse the interior of the unary expression expr_bp(p, r, 255); Some((m.complete(p, kind), BlockLike::NotBlock)) } @@ -371,7 +382,6 @@ fn postfix_expr( } }, T![?] => try_expr(p, lhs), - T![as] => cast_expr(p, lhs), _ => break, }; allow_calls = true; diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs index f1c3f7118b2d..1080b48a1e31 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs @@ -1,5 +1,9 @@ fn foo() { - **&1; + **&1 + 1; !!true; --1; + *&1 as u64; + *x(1); + &x[1]; + -1..2; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt index 2d71efd86fff..e2b60d99f465 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 44) - FN_DEF@[0; 43) +SOURCE_FILE@[0; 97) + FN_DEF@[0; 96) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " NAME@[3; 6) @@ -8,38 +8,104 @@ SOURCE_FILE@[0; 44) L_PAREN@[6; 7) "(" R_PAREN@[7; 8) ")" WHITESPACE@[8; 9) " " - BLOCK_EXPR@[9; 43) - BLOCK@[9; 43) + BLOCK_EXPR@[9; 96) + BLOCK@[9; 96) L_CURLY@[9; 10) "{" WHITESPACE@[10; 15) "\n " - EXPR_STMT@[15; 20) - PREFIX_EXPR@[15; 19) - STAR@[15; 16) "*" - PREFIX_EXPR@[16; 19) - STAR@[16; 17) "*" - REF_EXPR@[17; 19) - AMP@[17; 18) "&" - LITERAL@[18; 19) - INT_NUMBER@[18; 19) "1" - SEMI@[19; 20) ";" - WHITESPACE@[20; 25) "\n " - EXPR_STMT@[25; 32) - PREFIX_EXPR@[25; 31) - EXCL@[25; 26) "!" - PREFIX_EXPR@[26; 31) - EXCL@[26; 27) "!" - LITERAL@[27; 31) - TRUE_KW@[27; 31) "true" - SEMI@[31; 32) ";" - WHITESPACE@[32; 37) "\n " - EXPR_STMT@[37; 41) - PREFIX_EXPR@[37; 40) - MINUS@[37; 38) "-" - PREFIX_EXPR@[38; 40) - MINUS@[38; 39) "-" - LITERAL@[39; 40) - INT_NUMBER@[39; 40) "1" - SEMI@[40; 41) ";" - WHITESPACE@[41; 42) "\n" - R_CURLY@[42; 43) "}" - WHITESPACE@[43; 44) "\n" + EXPR_STMT@[15; 24) + BIN_EXPR@[15; 23) + PREFIX_EXPR@[15; 19) + STAR@[15; 16) "*" + PREFIX_EXPR@[16; 19) + STAR@[16; 17) "*" + REF_EXPR@[17; 19) + AMP@[17; 18) "&" + LITERAL@[18; 19) + INT_NUMBER@[18; 19) "1" + WHITESPACE@[19; 20) " " + PLUS@[20; 21) "+" + WHITESPACE@[21; 22) " " + LITERAL@[22; 23) + INT_NUMBER@[22; 23) "1" + SEMI@[23; 24) ";" + WHITESPACE@[24; 29) "\n " + EXPR_STMT@[29; 36) + PREFIX_EXPR@[29; 35) + EXCL@[29; 30) "!" + PREFIX_EXPR@[30; 35) + EXCL@[30; 31) "!" + LITERAL@[31; 35) + TRUE_KW@[31; 35) "true" + SEMI@[35; 36) ";" + WHITESPACE@[36; 41) "\n " + EXPR_STMT@[41; 45) + PREFIX_EXPR@[41; 44) + MINUS@[41; 42) "-" + PREFIX_EXPR@[42; 44) + MINUS@[42; 43) "-" + LITERAL@[43; 44) + INT_NUMBER@[43; 44) "1" + SEMI@[44; 45) ";" + WHITESPACE@[45; 50) "\n " + EXPR_STMT@[50; 61) + CAST_EXPR@[50; 60) + PREFIX_EXPR@[50; 53) + STAR@[50; 51) "*" + REF_EXPR@[51; 53) + AMP@[51; 52) "&" + LITERAL@[52; 53) + INT_NUMBER@[52; 53) "1" + WHITESPACE@[53; 54) " " + AS_KW@[54; 56) "as" + WHITESPACE@[56; 57) " " + PATH_TYPE@[57; 60) + PATH@[57; 60) + PATH_SEGMENT@[57; 60) + NAME_REF@[57; 60) + IDENT@[57; 60) "u64" + SEMI@[60; 61) ";" + WHITESPACE@[61; 66) "\n " + EXPR_STMT@[66; 72) + PREFIX_EXPR@[66; 71) + STAR@[66; 67) "*" + CALL_EXPR@[67; 71) + PATH_EXPR@[67; 68) + PATH@[67; 68) + PATH_SEGMENT@[67; 68) + NAME_REF@[67; 68) + IDENT@[67; 68) "x" + ARG_LIST@[68; 71) + L_PAREN@[68; 69) "(" + LITERAL@[69; 70) + INT_NUMBER@[69; 70) "1" + R_PAREN@[70; 71) ")" + SEMI@[71; 72) ";" + WHITESPACE@[72; 77) "\n " + EXPR_STMT@[77; 83) + REF_EXPR@[77; 82) + AMP@[77; 78) "&" + INDEX_EXPR@[78; 82) + PATH_EXPR@[78; 79) + PATH@[78; 79) + PATH_SEGMENT@[78; 79) + NAME_REF@[78; 79) + IDENT@[78; 79) "x" + L_BRACK@[79; 80) "[" + LITERAL@[80; 81) + INT_NUMBER@[80; 81) "1" + R_BRACK@[81; 82) "]" + SEMI@[82; 83) ";" + WHITESPACE@[83; 88) "\n " + EXPR_STMT@[88; 94) + RANGE_EXPR@[88; 93) + PREFIX_EXPR@[88; 90) + MINUS@[88; 89) "-" + LITERAL@[89; 90) + INT_NUMBER@[89; 90) "1" + DOTDOT@[90; 92) ".." + LITERAL@[92; 93) + INT_NUMBER@[92; 93) "2" + SEMI@[93; 94) ";" + WHITESPACE@[94; 95) "\n" + R_CURLY@[95; 96) "}" + WHITESPACE@[96; 97) "\n" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs index 2dac6be95e75..050638f56094 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs @@ -1,4 +1,5 @@ fn foo() { let _ = &1; let _ = &mut &f(); + let _ = &1 as *const i32; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt index 8f34afe768eb..d6334e55bbba 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 52) - FN_DEF@[0; 51) +SOURCE_FILE@[0; 82) + FN_DEF@[0; 81) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " NAME@[3; 6) @@ -8,8 +8,8 @@ SOURCE_FILE@[0; 52) L_PAREN@[6; 7) "(" R_PAREN@[7; 8) ")" WHITESPACE@[8; 9) " " - BLOCK_EXPR@[9; 51) - BLOCK@[9; 51) + BLOCK_EXPR@[9; 81) + BLOCK@[9; 81) L_CURLY@[9; 10) "{" WHITESPACE@[10; 15) "\n " LET_STMT@[15; 26) @@ -50,6 +50,33 @@ SOURCE_FILE@[0; 52) L_PAREN@[46; 47) "(" R_PAREN@[47; 48) ")" SEMI@[48; 49) ";" - WHITESPACE@[49; 50) "\n" - R_CURLY@[50; 51) "}" - WHITESPACE@[51; 52) "\n" + WHITESPACE@[49; 54) "\n " + LET_STMT@[54; 79) + LET_KW@[54; 57) "let" + WHITESPACE@[57; 58) " " + PLACEHOLDER_PAT@[58; 59) + UNDERSCORE@[58; 59) "_" + WHITESPACE@[59; 60) " " + EQ@[60; 61) "=" + WHITESPACE@[61; 62) " " + CAST_EXPR@[62; 78) + REF_EXPR@[62; 64) + AMP@[62; 63) "&" + LITERAL@[63; 64) + INT_NUMBER@[63; 64) "1" + WHITESPACE@[64; 65) " " + AS_KW@[65; 67) "as" + WHITESPACE@[67; 68) " " + POINTER_TYPE@[68; 78) + STAR@[68; 69) "*" + CONST_KW@[69; 74) "const" + WHITESPACE@[74; 75) " " + PATH_TYPE@[75; 78) + PATH@[75; 78) + PATH_SEGMENT@[75; 78) + NAME_REF@[75; 78) + IDENT@[75; 78) "i32" + SEMI@[78; 79) ";" + WHITESPACE@[79; 80) "\n" + R_CURLY@[80; 81) "}" + WHITESPACE@[81; 82) "\n" From b4fe06bc17127b6007114a8ba8bf876fdef112e0 Mon Sep 17 00:00:00 2001 From: Geoffry Song Date: Sat, 5 Oct 2019 16:30:10 -0700 Subject: [PATCH 2/2] Move tests around --- crates/ra_parser/src/grammar/expressions.rs | 11 +- .../parser/inline/ok/0019_unary_expr.rs | 6 +- .../parser/inline/ok/0019_unary_expr.txt | 136 +++++------------- .../parser/inline/ok/0082_ref_expr.rs | 1 - .../parser/inline/ok/0082_ref_expr.txt | 41 +----- .../parser/inline/ok/0146_as_precedence.rs | 3 + .../parser/inline/ok/0146_as_precedence.txt | 43 ++++++ .../parser/ok/0058_unary_expr_precedence.rs | 7 + .../parser/ok/0058_unary_expr_precedence.txt | 97 +++++++++++++ 9 files changed, 198 insertions(+), 147 deletions(-) create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.rs create mode 100644 crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.txt create mode 100644 crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.rs create mode 100644 crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.txt diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs index 448b87505770..c2a2060eb634 100644 --- a/crates/ra_parser/src/grammar/expressions.rs +++ b/crates/ra_parser/src/grammar/expressions.rs @@ -279,6 +279,10 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) -> (Option, if op_bp < bp { break; } + // test as_precedence + // fn foo() { + // let _ = &1 as *const i32; + // } if p.at(T![as]) { lhs = cast_expr(p, lhs); continue; @@ -301,7 +305,6 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> // fn foo() { // let _ = &1; // let _ = &mut &f(); - // let _ = &1 as *const i32; // } T![&] => { m = p.start(); @@ -311,13 +314,9 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<(CompletedMarker, BlockLike)> } // test unary_expr // fn foo() { - // **&1 + 1; + // **&1; // !!true; // --1; - // *&1 as u64; - // *x(1); - // &x[1]; - // -1..2; // } T![*] | T![!] | T![-] => { m = p.start(); diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs index 1080b48a1e31..f1c3f7118b2d 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.rs @@ -1,9 +1,5 @@ fn foo() { - **&1 + 1; + **&1; !!true; --1; - *&1 as u64; - *x(1); - &x[1]; - -1..2; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt index e2b60d99f465..2d71efd86fff 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0019_unary_expr.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 97) - FN_DEF@[0; 96) +SOURCE_FILE@[0; 44) + FN_DEF@[0; 43) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " NAME@[3; 6) @@ -8,104 +8,38 @@ SOURCE_FILE@[0; 97) L_PAREN@[6; 7) "(" R_PAREN@[7; 8) ")" WHITESPACE@[8; 9) " " - BLOCK_EXPR@[9; 96) - BLOCK@[9; 96) + BLOCK_EXPR@[9; 43) + BLOCK@[9; 43) L_CURLY@[9; 10) "{" WHITESPACE@[10; 15) "\n " - EXPR_STMT@[15; 24) - BIN_EXPR@[15; 23) - PREFIX_EXPR@[15; 19) - STAR@[15; 16) "*" - PREFIX_EXPR@[16; 19) - STAR@[16; 17) "*" - REF_EXPR@[17; 19) - AMP@[17; 18) "&" - LITERAL@[18; 19) - INT_NUMBER@[18; 19) "1" - WHITESPACE@[19; 20) " " - PLUS@[20; 21) "+" - WHITESPACE@[21; 22) " " - LITERAL@[22; 23) - INT_NUMBER@[22; 23) "1" - SEMI@[23; 24) ";" - WHITESPACE@[24; 29) "\n " - EXPR_STMT@[29; 36) - PREFIX_EXPR@[29; 35) - EXCL@[29; 30) "!" - PREFIX_EXPR@[30; 35) - EXCL@[30; 31) "!" - LITERAL@[31; 35) - TRUE_KW@[31; 35) "true" - SEMI@[35; 36) ";" - WHITESPACE@[36; 41) "\n " - EXPR_STMT@[41; 45) - PREFIX_EXPR@[41; 44) - MINUS@[41; 42) "-" - PREFIX_EXPR@[42; 44) - MINUS@[42; 43) "-" - LITERAL@[43; 44) - INT_NUMBER@[43; 44) "1" - SEMI@[44; 45) ";" - WHITESPACE@[45; 50) "\n " - EXPR_STMT@[50; 61) - CAST_EXPR@[50; 60) - PREFIX_EXPR@[50; 53) - STAR@[50; 51) "*" - REF_EXPR@[51; 53) - AMP@[51; 52) "&" - LITERAL@[52; 53) - INT_NUMBER@[52; 53) "1" - WHITESPACE@[53; 54) " " - AS_KW@[54; 56) "as" - WHITESPACE@[56; 57) " " - PATH_TYPE@[57; 60) - PATH@[57; 60) - PATH_SEGMENT@[57; 60) - NAME_REF@[57; 60) - IDENT@[57; 60) "u64" - SEMI@[60; 61) ";" - WHITESPACE@[61; 66) "\n " - EXPR_STMT@[66; 72) - PREFIX_EXPR@[66; 71) - STAR@[66; 67) "*" - CALL_EXPR@[67; 71) - PATH_EXPR@[67; 68) - PATH@[67; 68) - PATH_SEGMENT@[67; 68) - NAME_REF@[67; 68) - IDENT@[67; 68) "x" - ARG_LIST@[68; 71) - L_PAREN@[68; 69) "(" - LITERAL@[69; 70) - INT_NUMBER@[69; 70) "1" - R_PAREN@[70; 71) ")" - SEMI@[71; 72) ";" - WHITESPACE@[72; 77) "\n " - EXPR_STMT@[77; 83) - REF_EXPR@[77; 82) - AMP@[77; 78) "&" - INDEX_EXPR@[78; 82) - PATH_EXPR@[78; 79) - PATH@[78; 79) - PATH_SEGMENT@[78; 79) - NAME_REF@[78; 79) - IDENT@[78; 79) "x" - L_BRACK@[79; 80) "[" - LITERAL@[80; 81) - INT_NUMBER@[80; 81) "1" - R_BRACK@[81; 82) "]" - SEMI@[82; 83) ";" - WHITESPACE@[83; 88) "\n " - EXPR_STMT@[88; 94) - RANGE_EXPR@[88; 93) - PREFIX_EXPR@[88; 90) - MINUS@[88; 89) "-" - LITERAL@[89; 90) - INT_NUMBER@[89; 90) "1" - DOTDOT@[90; 92) ".." - LITERAL@[92; 93) - INT_NUMBER@[92; 93) "2" - SEMI@[93; 94) ";" - WHITESPACE@[94; 95) "\n" - R_CURLY@[95; 96) "}" - WHITESPACE@[96; 97) "\n" + EXPR_STMT@[15; 20) + PREFIX_EXPR@[15; 19) + STAR@[15; 16) "*" + PREFIX_EXPR@[16; 19) + STAR@[16; 17) "*" + REF_EXPR@[17; 19) + AMP@[17; 18) "&" + LITERAL@[18; 19) + INT_NUMBER@[18; 19) "1" + SEMI@[19; 20) ";" + WHITESPACE@[20; 25) "\n " + EXPR_STMT@[25; 32) + PREFIX_EXPR@[25; 31) + EXCL@[25; 26) "!" + PREFIX_EXPR@[26; 31) + EXCL@[26; 27) "!" + LITERAL@[27; 31) + TRUE_KW@[27; 31) "true" + SEMI@[31; 32) ";" + WHITESPACE@[32; 37) "\n " + EXPR_STMT@[37; 41) + PREFIX_EXPR@[37; 40) + MINUS@[37; 38) "-" + PREFIX_EXPR@[38; 40) + MINUS@[38; 39) "-" + LITERAL@[39; 40) + INT_NUMBER@[39; 40) "1" + SEMI@[40; 41) ";" + WHITESPACE@[41; 42) "\n" + R_CURLY@[42; 43) "}" + WHITESPACE@[43; 44) "\n" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs index 050638f56094..2dac6be95e75 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.rs @@ -1,5 +1,4 @@ fn foo() { let _ = &1; let _ = &mut &f(); - let _ = &1 as *const i32; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt index d6334e55bbba..8f34afe768eb 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0082_ref_expr.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 82) - FN_DEF@[0; 81) +SOURCE_FILE@[0; 52) + FN_DEF@[0; 51) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " NAME@[3; 6) @@ -8,8 +8,8 @@ SOURCE_FILE@[0; 82) L_PAREN@[6; 7) "(" R_PAREN@[7; 8) ")" WHITESPACE@[8; 9) " " - BLOCK_EXPR@[9; 81) - BLOCK@[9; 81) + BLOCK_EXPR@[9; 51) + BLOCK@[9; 51) L_CURLY@[9; 10) "{" WHITESPACE@[10; 15) "\n " LET_STMT@[15; 26) @@ -50,33 +50,6 @@ SOURCE_FILE@[0; 82) L_PAREN@[46; 47) "(" R_PAREN@[47; 48) ")" SEMI@[48; 49) ";" - WHITESPACE@[49; 54) "\n " - LET_STMT@[54; 79) - LET_KW@[54; 57) "let" - WHITESPACE@[57; 58) " " - PLACEHOLDER_PAT@[58; 59) - UNDERSCORE@[58; 59) "_" - WHITESPACE@[59; 60) " " - EQ@[60; 61) "=" - WHITESPACE@[61; 62) " " - CAST_EXPR@[62; 78) - REF_EXPR@[62; 64) - AMP@[62; 63) "&" - LITERAL@[63; 64) - INT_NUMBER@[63; 64) "1" - WHITESPACE@[64; 65) " " - AS_KW@[65; 67) "as" - WHITESPACE@[67; 68) " " - POINTER_TYPE@[68; 78) - STAR@[68; 69) "*" - CONST_KW@[69; 74) "const" - WHITESPACE@[74; 75) " " - PATH_TYPE@[75; 78) - PATH@[75; 78) - PATH_SEGMENT@[75; 78) - NAME_REF@[75; 78) - IDENT@[75; 78) "i32" - SEMI@[78; 79) ";" - WHITESPACE@[79; 80) "\n" - R_CURLY@[80; 81) "}" - WHITESPACE@[81; 82) "\n" + WHITESPACE@[49; 50) "\n" + R_CURLY@[50; 51) "}" + WHITESPACE@[51; 52) "\n" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.rs b/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.rs new file mode 100644 index 000000000000..a06dec1faf36 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.rs @@ -0,0 +1,3 @@ +fn foo() { + let _ = &1 as *const i32; +} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.txt b/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.txt new file mode 100644 index 000000000000..9e3767fb75de --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0146_as_precedence.txt @@ -0,0 +1,43 @@ +SOURCE_FILE@[0; 43) + FN_DEF@[0; 42) + FN_KW@[0; 2) "fn" + WHITESPACE@[2; 3) " " + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) "(" + R_PAREN@[7; 8) ")" + WHITESPACE@[8; 9) " " + BLOCK_EXPR@[9; 42) + BLOCK@[9; 42) + L_CURLY@[9; 10) "{" + WHITESPACE@[10; 15) "\n " + LET_STMT@[15; 40) + LET_KW@[15; 18) "let" + WHITESPACE@[18; 19) " " + PLACEHOLDER_PAT@[19; 20) + UNDERSCORE@[19; 20) "_" + WHITESPACE@[20; 21) " " + EQ@[21; 22) "=" + WHITESPACE@[22; 23) " " + CAST_EXPR@[23; 39) + REF_EXPR@[23; 25) + AMP@[23; 24) "&" + LITERAL@[24; 25) + INT_NUMBER@[24; 25) "1" + WHITESPACE@[25; 26) " " + AS_KW@[26; 28) "as" + WHITESPACE@[28; 29) " " + POINTER_TYPE@[29; 39) + STAR@[29; 30) "*" + CONST_KW@[30; 35) "const" + WHITESPACE@[35; 36) " " + PATH_TYPE@[36; 39) + PATH@[36; 39) + PATH_SEGMENT@[36; 39) + NAME_REF@[36; 39) + IDENT@[36; 39) "i32" + SEMI@[39; 40) ";" + WHITESPACE@[40; 41) "\n" + R_CURLY@[41; 42) "}" + WHITESPACE@[42; 43) "\n" diff --git a/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.rs b/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.rs new file mode 100644 index 000000000000..100fccc641cb --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.rs @@ -0,0 +1,7 @@ +fn foo() { + 1 + *&2 + 3; + *&1 as u64; + *x(1); + &x[1]; + -1..2; +} diff --git a/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.txt b/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.txt new file mode 100644 index 000000000000..d30cb63ffaaf --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0058_unary_expr_precedence.txt @@ -0,0 +1,97 @@ +SOURCE_FILE@[0; 79) + FN_DEF@[0; 78) + FN_KW@[0; 2) "fn" + WHITESPACE@[2; 3) " " + NAME@[3; 6) + IDENT@[3; 6) "foo" + PARAM_LIST@[6; 8) + L_PAREN@[6; 7) "(" + R_PAREN@[7; 8) ")" + WHITESPACE@[8; 9) " " + BLOCK_EXPR@[9; 78) + BLOCK@[9; 78) + L_CURLY@[9; 10) "{" + WHITESPACE@[10; 15) "\n " + EXPR_STMT@[15; 27) + BIN_EXPR@[15; 26) + BIN_EXPR@[15; 22) + LITERAL@[15; 16) + INT_NUMBER@[15; 16) "1" + WHITESPACE@[16; 17) " " + PLUS@[17; 18) "+" + WHITESPACE@[18; 19) " " + PREFIX_EXPR@[19; 22) + STAR@[19; 20) "*" + REF_EXPR@[20; 22) + AMP@[20; 21) "&" + LITERAL@[21; 22) + INT_NUMBER@[21; 22) "2" + WHITESPACE@[22; 23) " " + PLUS@[23; 24) "+" + WHITESPACE@[24; 25) " " + LITERAL@[25; 26) + INT_NUMBER@[25; 26) "3" + SEMI@[26; 27) ";" + WHITESPACE@[27; 32) "\n " + EXPR_STMT@[32; 43) + CAST_EXPR@[32; 42) + PREFIX_EXPR@[32; 35) + STAR@[32; 33) "*" + REF_EXPR@[33; 35) + AMP@[33; 34) "&" + LITERAL@[34; 35) + INT_NUMBER@[34; 35) "1" + WHITESPACE@[35; 36) " " + AS_KW@[36; 38) "as" + WHITESPACE@[38; 39) " " + PATH_TYPE@[39; 42) + PATH@[39; 42) + PATH_SEGMENT@[39; 42) + NAME_REF@[39; 42) + IDENT@[39; 42) "u64" + SEMI@[42; 43) ";" + WHITESPACE@[43; 48) "\n " + EXPR_STMT@[48; 54) + PREFIX_EXPR@[48; 53) + STAR@[48; 49) "*" + CALL_EXPR@[49; 53) + PATH_EXPR@[49; 50) + PATH@[49; 50) + PATH_SEGMENT@[49; 50) + NAME_REF@[49; 50) + IDENT@[49; 50) "x" + ARG_LIST@[50; 53) + L_PAREN@[50; 51) "(" + LITERAL@[51; 52) + INT_NUMBER@[51; 52) "1" + R_PAREN@[52; 53) ")" + SEMI@[53; 54) ";" + WHITESPACE@[54; 59) "\n " + EXPR_STMT@[59; 65) + REF_EXPR@[59; 64) + AMP@[59; 60) "&" + INDEX_EXPR@[60; 64) + PATH_EXPR@[60; 61) + PATH@[60; 61) + PATH_SEGMENT@[60; 61) + NAME_REF@[60; 61) + IDENT@[60; 61) "x" + L_BRACK@[61; 62) "[" + LITERAL@[62; 63) + INT_NUMBER@[62; 63) "1" + R_BRACK@[63; 64) "]" + SEMI@[64; 65) ";" + WHITESPACE@[65; 70) "\n " + EXPR_STMT@[70; 76) + RANGE_EXPR@[70; 75) + PREFIX_EXPR@[70; 72) + MINUS@[70; 71) "-" + LITERAL@[71; 72) + INT_NUMBER@[71; 72) "1" + DOTDOT@[72; 74) ".." + LITERAL@[74; 75) + INT_NUMBER@[74; 75) "2" + SEMI@[75; 76) ";" + WHITESPACE@[76; 77) "\n" + R_CURLY@[77; 78) "}" + WHITESPACE@[78; 79) "\n"