aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Nelson <[email protected]>2020-01-12 15:19:17 +0000
committerJoshua Nelson <[email protected]>2020-01-12 15:25:41 +0000
commitc3ac2c93fb446329b09882ef452fd6820290bfc5 (patch)
tree44734cc34641cfab04cb1c71611ee0a299a90c96
parentf7a7092d691aea5c254412d9fd4b3f76a355f11f (diff)
Allow attributes before function arguments
This adds support for function calls of the form: ```rust ( #[attr(...)] 1.2, #[attr_one(...)] #[attr_two(...)] 1.5, ... etc ... ) ``` Closes https://github.com/rust-analyzer/rust-analyzer/issues/2801
-rw-r--r--crates/ra_parser/src/grammar/expressions.rs11
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.rs9
-rw-r--r--crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.txt106
3 files changed, 126 insertions, 0 deletions
diff --git a/crates/ra_parser/src/grammar/expressions.rs b/crates/ra_parser/src/grammar/expressions.rs
index 81d4f75f9..7caed66a0 100644
--- a/crates/ra_parser/src/grammar/expressions.rs
+++ b/crates/ra_parser/src/grammar/expressions.rs
@@ -535,11 +535,22 @@ fn cast_expr(p: &mut Parser, lhs: CompletedMarker) -> CompletedMarker {
535 m.complete(p, CAST_EXPR) 535 m.complete(p, CAST_EXPR)
536} 536}
537 537
538// test arg_list
539// fn assert_float(s: &str, n: f64) {}
540// fn foo() {
541// assert_float(
542// "1.797693134862315708e+308L",
543// #[allow(clippy::excessive_precision)]
544// #[allow(dead_code)]
545// 1.797_693_134_862_315_730_8e+308,
546// );
547// }
538fn arg_list(p: &mut Parser) { 548fn arg_list(p: &mut Parser) {
539 assert!(p.at(T!['('])); 549 assert!(p.at(T!['(']));
540 let m = p.start(); 550 let m = p.start();
541 p.bump(T!['(']); 551 p.bump(T!['(']);
542 while !p.at(T![')']) && !p.at(EOF) { 552 while !p.at(T![')']) && !p.at(EOF) {
553 attributes::outer_attributes(p);
543 if !p.at_ts(EXPR_FIRST) { 554 if !p.at_ts(EXPR_FIRST) {
544 p.error("expected expression"); 555 p.error("expected expression");
545 break; 556 break;
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.rs b/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.rs
new file mode 100644
index 000000000..a4009b392
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.rs
@@ -0,0 +1,9 @@
1fn assert_float(s: &str, n: f64) {}
2fn foo() {
3 assert_float(
4 "1.797693134862315708e+308L",
5 #[allow(clippy::excessive_precision)]
6 #[allow(dead_code)]
7 1.797_693_134_862_315_730_8e+308,
8 );
9}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.txt b/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.txt
new file mode 100644
index 000000000..6b1992dac
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/ok/0152_arg_list.txt
@@ -0,0 +1,106 @@
1SOURCE_FILE@[0; 228)
2 FN_DEF@[0; 35)
3 FN_KW@[0; 2) "fn"
4 WHITESPACE@[2; 3) " "
5 NAME@[3; 15)
6 IDENT@[3; 15) "assert_float"
7 PARAM_LIST@[15; 32)
8 L_PAREN@[15; 16) "("
9 PARAM@[16; 23)
10 BIND_PAT@[16; 17)
11 NAME@[16; 17)
12 IDENT@[16; 17) "s"
13 COLON@[17; 18) ":"
14 WHITESPACE@[18; 19) " "
15 REFERENCE_TYPE@[19; 23)
16 AMP@[19; 20) "&"
17 PATH_TYPE@[20; 23)
18 PATH@[20; 23)
19 PATH_SEGMENT@[20; 23)
20 NAME_REF@[20; 23)
21 IDENT@[20; 23) "str"
22 COMMA@[23; 24) ","
23 WHITESPACE@[24; 25) " "
24 PARAM@[25; 31)
25 BIND_PAT@[25; 26)
26 NAME@[25; 26)
27 IDENT@[25; 26) "n"
28 COLON@[26; 27) ":"
29 WHITESPACE@[27; 28) " "
30 PATH_TYPE@[28; 31)
31 PATH@[28; 31)
32 PATH_SEGMENT@[28; 31)
33 NAME_REF@[28; 31)
34 IDENT@[28; 31) "f64"
35 R_PAREN@[31; 32) ")"
36 WHITESPACE@[32; 33) " "
37 BLOCK_EXPR@[33; 35)
38 BLOCK@[33; 35)
39 L_CURLY@[33; 34) "{"
40 R_CURLY@[34; 35) "}"
41 WHITESPACE@[35; 36) "\n"
42 FN_DEF@[36; 227)
43 FN_KW@[36; 38) "fn"
44 WHITESPACE@[38; 39) " "
45 NAME@[39; 42)
46 IDENT@[39; 42) "foo"
47 PARAM_LIST@[42; 44)
48 L_PAREN@[42; 43) "("
49 R_PAREN@[43; 44) ")"
50 WHITESPACE@[44; 45) " "
51 BLOCK_EXPR@[45; 227)
52 BLOCK@[45; 227)
53 L_CURLY@[45; 46) "{"
54 WHITESPACE@[46; 51) "\n "
55 EXPR_STMT@[51; 225)
56 CALL_EXPR@[51; 224)
57 PATH_EXPR@[51; 63)
58 PATH@[51; 63)
59 PATH_SEGMENT@[51; 63)
60 NAME_REF@[51; 63)
61 IDENT@[51; 63) "assert_float"
62 ARG_LIST@[63; 224)
63 L_PAREN@[63; 64) "("
64 WHITESPACE@[64; 73) "\n "
65 LITERAL@[73; 101)
66 STRING@[73; 101) "\"1.797693134862315708 ..."
67 COMMA@[101; 102) ","
68 WHITESPACE@[102; 111) "\n "
69 ATTR@[111; 148)
70 POUND@[111; 112) "#"
71 L_BRACK@[112; 113) "["
72 PATH@[113; 118)
73 PATH_SEGMENT@[113; 118)
74 NAME_REF@[113; 118)
75 IDENT@[113; 118) "allow"
76 TOKEN_TREE@[118; 147)
77 L_PAREN@[118; 119) "("
78 IDENT@[119; 125) "clippy"
79 COLON@[125; 126) ":"
80 COLON@[126; 127) ":"
81 IDENT@[127; 146) "excessive_precision"
82 R_PAREN@[146; 147) ")"
83 R_BRACK@[147; 148) "]"
84 WHITESPACE@[148; 157) "\n "
85 ATTR@[157; 176)
86 POUND@[157; 158) "#"
87 L_BRACK@[158; 159) "["
88 PATH@[159; 164)
89 PATH_SEGMENT@[159; 164)
90 NAME_REF@[159; 164)
91 IDENT@[159; 164) "allow"
92 TOKEN_TREE@[164; 175)
93 L_PAREN@[164; 165) "("
94 IDENT@[165; 174) "dead_code"
95 R_PAREN@[174; 175) ")"
96 R_BRACK@[175; 176) "]"
97 WHITESPACE@[176; 185) "\n "
98 LITERAL@[185; 217)
99 FLOAT_NUMBER@[185; 217) "1.797_693_134_862_315 ..."
100 COMMA@[217; 218) ","
101 WHITESPACE@[218; 223) "\n "
102 R_PAREN@[223; 224) ")"
103 SEMI@[224; 225) ";"
104 WHITESPACE@[225; 226) "\n"
105 R_CURLY@[226; 227) "}"
106 WHITESPACE@[227; 228) "\n"