diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-12 15:47:48 +0000 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-01-12 15:47:48 +0000 |
commit | 8033c81acc93a376fbbecae6962ce35a0021aa8a (patch) | |
tree | ec45b93ee97ff1ba3ad7d5c773d767d421b2b554 /crates/ra_syntax | |
parent | 52ec6edf552d6b389af04649227fdea773e25138 (diff) | |
parent | 0b9e462ab0c6d74fd0bb34d9b9101132373e65a3 (diff) |
Merge #507
507: Fix handling of attributes in positional field lists r=matklad a=DJMcNab
First reported by @max-frai. This allows us to properly handle crates using e.g. `#[Derive(fail)]` with `#[fail(cause)]`, among other cases.
Co-authored-by: DJMcNab <[email protected]>
Diffstat (limited to 'crates/ra_syntax')
3 files changed, 53 insertions, 0 deletions
diff --git a/crates/ra_syntax/src/grammar/items/nominal.rs b/crates/ra_syntax/src/grammar/items/nominal.rs index 495462ca7..0784fb7b1 100644 --- a/crates/ra_syntax/src/grammar/items/nominal.rs +++ b/crates/ra_syntax/src/grammar/items/nominal.rs | |||
@@ -140,6 +140,16 @@ fn pos_field_list(p: &mut Parser) { | |||
140 | } | 140 | } |
141 | while !p.at(R_PAREN) && !p.at(EOF) { | 141 | while !p.at(R_PAREN) && !p.at(EOF) { |
142 | let m = p.start(); | 142 | let m = p.start(); |
143 | // test pos_field_attrs | ||
144 | // struct S ( | ||
145 | // #[serde(with = "url_serde")] | ||
146 | // pub Uri, | ||
147 | // ); | ||
148 | // | ||
149 | // enum S { | ||
150 | // Uri(#[serde(with = "url_serde")] Uri), | ||
151 | // } | ||
152 | attributes::outer_attributes(p); | ||
143 | opt_visibility(p); | 153 | opt_visibility(p); |
144 | if !p.at_ts(types::TYPE_FIRST) { | 154 | if !p.at_ts(types::TYPE_FIRST) { |
145 | p.error("expected a type"); | 155 | p.error("expected a type"); |
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.rs new file mode 100644 index 000000000..635b9ac21 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.rs | |||
@@ -0,0 +1,4 @@ | |||
1 | struct S ( | ||
2 | #[serde(with = "url_serde")] | ||
3 | pub Uri, | ||
4 | ); | ||
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.txt new file mode 100644 index 000000000..99ec0755b --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0115_pos_field_attrs.txt | |||
@@ -0,0 +1,39 @@ | |||
1 | SOURCE_FILE@[0; 60) | ||
2 | STRUCT_DEF@[0; 59) | ||
3 | STRUCT_KW@[0; 6) | ||
4 | WHITESPACE@[6; 7) | ||
5 | NAME@[7; 8) | ||
6 | IDENT@[7; 8) "S" | ||
7 | WHITESPACE@[8; 9) | ||
8 | POS_FIELD_LIST@[9; 58) | ||
9 | L_PAREN@[9; 10) | ||
10 | WHITESPACE@[10; 15) | ||
11 | POS_FIELD@[15; 55) | ||
12 | ATTR@[15; 43) | ||
13 | POUND@[15; 16) | ||
14 | TOKEN_TREE@[16; 43) | ||
15 | L_BRACK@[16; 17) | ||
16 | IDENT@[17; 22) "serde" | ||
17 | TOKEN_TREE@[22; 42) | ||
18 | L_PAREN@[22; 23) | ||
19 | IDENT@[23; 27) "with" | ||
20 | WHITESPACE@[27; 28) | ||
21 | EQ@[28; 29) | ||
22 | WHITESPACE@[29; 30) | ||
23 | STRING@[30; 41) | ||
24 | R_PAREN@[41; 42) | ||
25 | R_BRACK@[42; 43) | ||
26 | WHITESPACE@[43; 48) | ||
27 | VISIBILITY@[48; 51) | ||
28 | PUB_KW@[48; 51) | ||
29 | WHITESPACE@[51; 52) | ||
30 | PATH_TYPE@[52; 55) | ||
31 | PATH@[52; 55) | ||
32 | PATH_SEGMENT@[52; 55) | ||
33 | NAME_REF@[52; 55) | ||
34 | IDENT@[52; 55) "Uri" | ||
35 | COMMA@[55; 56) | ||
36 | WHITESPACE@[56; 57) | ||
37 | R_PAREN@[57; 58) | ||
38 | SEMI@[58; 59) | ||
39 | WHITESPACE@[59; 60) | ||