aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_syntax
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_syntax')
-rw-r--r--crates/ra_syntax/src/ast.rs9
-rw-r--r--crates/ra_syntax/src/ast/generated.rs1
-rw-r--r--crates/ra_syntax/src/grammar.ron2
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt52
-rw-r--r--crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt28
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/ok/0121_match_arms_outer_attributes.txt156
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.rs3
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.txt45
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.rs27
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.txt320
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.rs17
-rw-r--r--crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.txt200
12 files changed, 735 insertions, 125 deletions
diff --git a/crates/ra_syntax/src/ast.rs b/crates/ra_syntax/src/ast.rs
index 81c709bfb..d8c2cb063 100644
--- a/crates/ra_syntax/src/ast.rs
+++ b/crates/ra_syntax/src/ast.rs
@@ -114,6 +114,9 @@ pub trait AttrsOwner: AstNode {
114 fn attrs(&self) -> AstChildren<Attr> { 114 fn attrs(&self) -> AstChildren<Attr> {
115 children(self) 115 children(self)
116 } 116 }
117 fn has_atom_attr(&self, atom: &str) -> bool {
118 self.attrs().filter_map(|x| x.as_atom()).any(|x| x == atom)
119 }
117} 120}
118 121
119pub trait DocCommentsOwner: AstNode { 122pub trait DocCommentsOwner: AstNode {
@@ -153,12 +156,6 @@ pub trait DocCommentsOwner: AstNode {
153 } 156 }
154} 157}
155 158
156impl FnDef {
157 pub fn has_atom_attr(&self, atom: &str) -> bool {
158 self.attrs().filter_map(|x| x.as_atom()).any(|x| x == atom)
159 }
160}
161
162impl Attr { 159impl Attr {
163 pub fn is_inner(&self) -> bool { 160 pub fn is_inner(&self) -> bool {
164 let tt = match self.value() { 161 let tt = match self.value() {
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs
index 7572225b8..54b72f8c5 100644
--- a/crates/ra_syntax/src/ast/generated.rs
+++ b/crates/ra_syntax/src/ast/generated.rs
@@ -2108,6 +2108,7 @@ impl ToOwned for MacroCall {
2108 2108
2109 2109
2110impl ast::NameOwner for MacroCall {} 2110impl ast::NameOwner for MacroCall {}
2111impl ast::AttrsOwner for MacroCall {}
2111impl MacroCall { 2112impl MacroCall {
2112 pub fn token_tree(&self) -> Option<&TokenTree> { 2113 pub fn token_tree(&self) -> Option<&TokenTree> {
2113 super::child_opt(self) 2114 super::child_opt(self)
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron
index 66f1339c1..4f8e19bd0 100644
--- a/crates/ra_syntax/src/grammar.ron
+++ b/crates/ra_syntax/src/grammar.ron
@@ -557,7 +557,7 @@ Grammar(
557 "Name": (), 557 "Name": (),
558 "NameRef": (), 558 "NameRef": (),
559 "MacroCall": ( 559 "MacroCall": (
560 traits: [ "NameOwner" ], 560 traits: [ "NameOwner", "AttrsOwner" ],
561 options: [ "TokenTree", "Path" ], 561 options: [ "TokenTree", "Path" ],
562 ), 562 ),
563 "Attr": ( options: [ ["value", "TokenTree"] ] ), 563 "Attr": ( options: [ ["value", "TokenTree"] ] ),
diff --git a/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt
index b7543abc9..ed5735a63 100644
--- a/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt
+++ b/crates/ra_syntax/tests/data/parser/err/0032_match_arms_inner_attrs.txt
@@ -33,11 +33,11 @@ SOURCE_FILE@[0; 293)
33 R_PAREN@[40; 41) 33 R_PAREN@[40; 41)
34 COMMA@[41; 42) 34 COMMA@[41; 42)
35 WHITESPACE@[42; 51) 35 WHITESPACE@[42; 51)
36 ATTR@[51; 52) 36 MATCH_ARM@[51; 78)
37 POUND@[51; 52) 37 ATTR@[51; 52)
38 err: `expected `[`` 38 POUND@[51; 52)
39 err: `expected pattern` 39 err: `expected `[``
40 MATCH_ARM@[52; 78) 40 err: `expected pattern`
41 ERROR@[52; 53) 41 ERROR@[52; 53)
42 EXCL@[52; 53) 42 EXCL@[52; 53)
43 err: `expected FAT_ARROW` 43 err: `expected FAT_ARROW`
@@ -103,11 +103,11 @@ SOURCE_FILE@[0; 293)
103 R_PAREN@[149; 150) 103 R_PAREN@[149; 150)
104 COMMA@[150; 151) 104 COMMA@[150; 151)
105 WHITESPACE@[151; 160) 105 WHITESPACE@[151; 160)
106 ATTR@[160; 161) 106 MATCH_ARM@[160; 179)
107 POUND@[160; 161) 107 ATTR@[160; 161)
108 err: `expected `[`` 108 POUND@[160; 161)
109 err: `expected pattern` 109 err: `expected `[``
110 MATCH_ARM@[161; 179) 110 err: `expected pattern`
111 ERROR@[161; 162) 111 ERROR@[161; 162)
112 EXCL@[161; 162) 112 EXCL@[161; 162)
113 err: `expected FAT_ARROW` 113 err: `expected FAT_ARROW`
@@ -138,22 +138,22 @@ SOURCE_FILE@[0; 293)
138 MATCH_ARM_LIST@[200; 290) 138 MATCH_ARM_LIST@[200; 290)
139 L_CURLY@[200; 201) 139 L_CURLY@[200; 201)
140 WHITESPACE@[201; 210) 140 WHITESPACE@[201; 210)
141 ATTR@[210; 222) 141 MATCH_ARM@[210; 250)
142 POUND@[210; 211) 142 ATTR@[210; 222)
143 TOKEN_TREE@[211; 222) 143 POUND@[210; 211)
144 L_BRACK@[211; 212) 144 TOKEN_TREE@[211; 222)
145 IDENT@[212; 215) "cfg" 145 L_BRACK@[211; 212)
146 TOKEN_TREE@[215; 221) 146 IDENT@[212; 215) "cfg"
147 L_PAREN@[215; 216) 147 TOKEN_TREE@[215; 221)
148 IDENT@[216; 220) "test" 148 L_PAREN@[215; 216)
149 R_PAREN@[220; 221) 149 IDENT@[216; 220) "test"
150 R_BRACK@[221; 222) 150 R_PAREN@[220; 221)
151 WHITESPACE@[222; 231) 151 R_BRACK@[221; 222)
152 ATTR@[231; 232) 152 WHITESPACE@[222; 231)
153 POUND@[231; 232) 153 ATTR@[231; 232)
154 err: `expected `[`` 154 POUND@[231; 232)
155 err: `expected pattern` 155 err: `expected `[``
156 MATCH_ARM@[232; 250) 156 err: `expected pattern`
157 ERROR@[232; 233) 157 ERROR@[232; 233)
158 EXCL@[232; 233) 158 EXCL@[232; 233)
159 err: `expected FAT_ARROW` 159 err: `expected FAT_ARROW`
diff --git a/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt
index 7f8767001..f540409bc 100644
--- a/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt
+++ b/crates/ra_syntax/tests/data/parser/err/0033_match_arms_outer_attrs.txt
@@ -43,21 +43,21 @@ SOURCE_FILE@[0; 89)
43 R_PAREN@[57; 58) 43 R_PAREN@[57; 58)
44 COMMA@[58; 59) 44 COMMA@[58; 59)
45 WHITESPACE@[59; 68) 45 WHITESPACE@[59; 68)
46 ATTR@[68; 80) 46 MATCH_ARM@[68; 80)
47 POUND@[68; 69) 47 ATTR@[68; 80)
48 TOKEN_TREE@[69; 80) 48 POUND@[68; 69)
49 L_BRACK@[69; 70) 49 TOKEN_TREE@[69; 80)
50 IDENT@[70; 73) "cfg" 50 L_BRACK@[69; 70)
51 TOKEN_TREE@[73; 79) 51 IDENT@[70; 73) "cfg"
52 L_PAREN@[73; 74) 52 TOKEN_TREE@[73; 79)
53 IDENT@[74; 78) "test" 53 L_PAREN@[73; 74)
54 R_PAREN@[78; 79) 54 IDENT@[74; 78) "test"
55 R_BRACK@[79; 80) 55 R_PAREN@[78; 79)
56 R_BRACK@[79; 80)
57 err: `expected pattern`
58 err: `expected FAT_ARROW`
59 err: `expected expression`
56 WHITESPACE@[80; 85) 60 WHITESPACE@[80; 85)
57 err: `expected pattern`
58 err: `expected FAT_ARROW`
59 err: `expected expression`
60 MATCH_ARM@[85; 85)
61 R_CURLY@[85; 86) 61 R_CURLY@[85; 86)
62 WHITESPACE@[86; 87) 62 WHITESPACE@[86; 87)
63 R_CURLY@[87; 88) 63 R_CURLY@[87; 88)
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0121_match_arms_outer_attributes.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0121_match_arms_outer_attributes.txt
index c888fb8f0..e52a290bf 100644
--- a/crates/ra_syntax/tests/data/parser/inline/ok/0121_match_arms_outer_attributes.txt
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0121_match_arms_outer_attributes.txt
@@ -21,22 +21,22 @@ SOURCE_FILE@[0; 259)
21 MATCH_ARM_LIST@[24; 256) 21 MATCH_ARM_LIST@[24; 256)
22 L_CURLY@[24; 25) 22 L_CURLY@[24; 25)
23 WHITESPACE@[25; 34) 23 WHITESPACE@[25; 34)
24 ATTR@[34; 58) 24 MATCH_ARM@[34; 74)
25 POUND@[34; 35) 25 ATTR@[34; 58)
26 TOKEN_TREE@[35; 58) 26 POUND@[34; 35)
27 L_BRACK@[35; 36) 27 TOKEN_TREE@[35; 58)
28 IDENT@[36; 39) "cfg" 28 L_BRACK@[35; 36)
29 TOKEN_TREE@[39; 57) 29 IDENT@[36; 39) "cfg"
30 L_PAREN@[39; 40) 30 TOKEN_TREE@[39; 57)
31 IDENT@[40; 47) "feature" 31 L_PAREN@[39; 40)
32 WHITESPACE@[47; 48) 32 IDENT@[40; 47) "feature"
33 EQ@[48; 49) 33 WHITESPACE@[47; 48)
34 WHITESPACE@[49; 50) 34 EQ@[48; 49)
35 STRING@[50; 56) 35 WHITESPACE@[49; 50)
36 R_PAREN@[56; 57) 36 STRING@[50; 56)
37 R_BRACK@[57; 58) 37 R_PAREN@[56; 57)
38 WHITESPACE@[58; 67) 38 R_BRACK@[57; 58)
39 MATCH_ARM@[67; 74) 39 WHITESPACE@[58; 67)
40 PLACEHOLDER_PAT@[67; 68) 40 PLACEHOLDER_PAT@[67; 68)
41 UNDERSCORE@[67; 68) 41 UNDERSCORE@[67; 68)
42 WHITESPACE@[68; 69) 42 WHITESPACE@[68; 69)
@@ -47,22 +47,22 @@ SOURCE_FILE@[0; 259)
47 R_PAREN@[73; 74) 47 R_PAREN@[73; 74)
48 COMMA@[74; 75) 48 COMMA@[74; 75)
49 WHITESPACE@[75; 84) 49 WHITESPACE@[75; 84)
50 ATTR@[84; 109) 50 MATCH_ARM@[84; 125)
51 POUND@[84; 85) 51 ATTR@[84; 109)
52 TOKEN_TREE@[85; 109) 52 POUND@[84; 85)
53 L_BRACK@[85; 86) 53 TOKEN_TREE@[85; 109)
54 IDENT@[86; 89) "cfg" 54 L_BRACK@[85; 86)
55 TOKEN_TREE@[89; 108) 55 IDENT@[86; 89) "cfg"
56 L_PAREN@[89; 90) 56 TOKEN_TREE@[89; 108)
57 IDENT@[90; 97) "feature" 57 L_PAREN@[89; 90)
58 WHITESPACE@[97; 98) 58 IDENT@[90; 97) "feature"
59 EQ@[98; 99) 59 WHITESPACE@[97; 98)
60 WHITESPACE@[99; 100) 60 EQ@[98; 99)
61 STRING@[100; 107) 61 WHITESPACE@[99; 100)
62 R_PAREN@[107; 108) 62 STRING@[100; 107)
63 R_BRACK@[108; 109) 63 R_PAREN@[107; 108)
64 WHITESPACE@[109; 118) 64 R_BRACK@[108; 109)
65 MATCH_ARM@[118; 125) 65 WHITESPACE@[109; 118)
66 PLACEHOLDER_PAT@[118; 119) 66 PLACEHOLDER_PAT@[118; 119)
67 UNDERSCORE@[118; 119) 67 UNDERSCORE@[118; 119)
68 WHITESPACE@[119; 120) 68 WHITESPACE@[119; 120)
@@ -73,52 +73,52 @@ SOURCE_FILE@[0; 259)
73 R_PAREN@[124; 125) 73 R_PAREN@[124; 125)
74 COMMA@[125; 126) 74 COMMA@[125; 126)
75 WHITESPACE@[126; 135) 75 WHITESPACE@[126; 135)
76 ATTR@[135; 159) 76 MATCH_ARM@[135; 249)
77 POUND@[135; 136) 77 ATTR@[135; 159)
78 TOKEN_TREE@[136; 159) 78 POUND@[135; 136)
79 L_BRACK@[136; 137) 79 TOKEN_TREE@[136; 159)
80 IDENT@[137; 140) "cfg" 80 L_BRACK@[136; 137)
81 TOKEN_TREE@[140; 158) 81 IDENT@[137; 140) "cfg"
82 L_PAREN@[140; 141) 82 TOKEN_TREE@[140; 158)
83 IDENT@[141; 148) "feature" 83 L_PAREN@[140; 141)
84 WHITESPACE@[148; 149) 84 IDENT@[141; 148) "feature"
85 EQ@[149; 150) 85 WHITESPACE@[148; 149)
86 WHITESPACE@[150; 151) 86 EQ@[149; 150)
87 STRING@[151; 157) 87 WHITESPACE@[150; 151)
88 R_PAREN@[157; 158) 88 STRING@[151; 157)
89 R_BRACK@[158; 159) 89 R_PAREN@[157; 158)
90 WHITESPACE@[159; 168) 90 R_BRACK@[158; 159)
91 ATTR@[168; 198) 91 WHITESPACE@[159; 168)
92 POUND@[168; 169) 92 ATTR@[168; 198)
93 TOKEN_TREE@[169; 198) 93 POUND@[168; 169)
94 L_BRACK@[169; 170) 94 TOKEN_TREE@[169; 198)
95 IDENT@[170; 173) "cfg" 95 L_BRACK@[169; 170)
96 TOKEN_TREE@[173; 197) 96 IDENT@[170; 173) "cfg"
97 L_PAREN@[173; 174) 97 TOKEN_TREE@[173; 197)
98 IDENT@[174; 181) "feature" 98 L_PAREN@[173; 174)
99 WHITESPACE@[181; 182) 99 IDENT@[174; 181) "feature"
100 EQ@[182; 183) 100 WHITESPACE@[181; 182)
101 WHITESPACE@[183; 184) 101 EQ@[182; 183)
102 STRING@[184; 196) 102 WHITESPACE@[183; 184)
103 R_PAREN@[196; 197) 103 STRING@[184; 196)
104 R_BRACK@[197; 198) 104 R_PAREN@[196; 197)
105 WHITESPACE@[198; 207) 105 R_BRACK@[197; 198)
106 ATTR@[207; 233) 106 WHITESPACE@[198; 207)
107 POUND@[207; 208) 107 ATTR@[207; 233)
108 TOKEN_TREE@[208; 233) 108 POUND@[207; 208)
109 L_BRACK@[208; 209) 109 TOKEN_TREE@[208; 233)
110 IDENT@[209; 212) "cfg" 110 L_BRACK@[208; 209)
111 TOKEN_TREE@[212; 232) 111 IDENT@[209; 212) "cfg"
112 L_PAREN@[212; 213) 112 TOKEN_TREE@[212; 232)
113 IDENT@[213; 220) "feature" 113 L_PAREN@[212; 213)
114 WHITESPACE@[220; 221) 114 IDENT@[213; 220) "feature"
115 EQ@[221; 222) 115 WHITESPACE@[220; 221)
116 WHITESPACE@[222; 223) 116 EQ@[221; 222)
117 STRING@[223; 231) 117 WHITESPACE@[222; 223)
118 R_PAREN@[231; 232) 118 STRING@[223; 231)
119 R_BRACK@[232; 233) 119 R_PAREN@[231; 232)
120 WHITESPACE@[233; 242) 120 R_BRACK@[232; 233)
121 MATCH_ARM@[242; 249) 121 WHITESPACE@[233; 242)
122 PLACEHOLDER_PAT@[242; 243) 122 PLACEHOLDER_PAT@[242; 243)
123 UNDERSCORE@[242; 243) 123 UNDERSCORE@[242; 243)
124 WHITESPACE@[243; 244) 124 WHITESPACE@[243; 244)
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.rs
new file mode 100644
index 000000000..a6c7760c7
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.rs
@@ -0,0 +1,3 @@
1fn main() {
2 S { #[cfg(test)] field: 1 }
3}
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.txt
new file mode 100644
index 000000000..34c80500a
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0125_struct_literal_field_with_attr.txt
@@ -0,0 +1,45 @@
1SOURCE_FILE@[0; 46)
2 FN_DEF@[0; 45)
3 FN_KW@[0; 2)
4 WHITESPACE@[2; 3)
5 NAME@[3; 7)
6 IDENT@[3; 7) "main"
7 PARAM_LIST@[7; 9)
8 L_PAREN@[7; 8)
9 R_PAREN@[8; 9)
10 WHITESPACE@[9; 10)
11 BLOCK@[10; 45)
12 L_CURLY@[10; 11)
13 WHITESPACE@[11; 16)
14 STRUCT_LIT@[16; 43)
15 PATH@[16; 17)
16 PATH_SEGMENT@[16; 17)
17 NAME_REF@[16; 17)
18 IDENT@[16; 17) "S"
19 WHITESPACE@[17; 18)
20 NAMED_FIELD_LIST@[18; 43)
21 L_CURLY@[18; 19)
22 WHITESPACE@[19; 20)
23 NAMED_FIELD@[20; 41)
24 ATTR@[20; 32)
25 POUND@[20; 21)
26 TOKEN_TREE@[21; 32)
27 L_BRACK@[21; 22)
28 IDENT@[22; 25) "cfg"
29 TOKEN_TREE@[25; 31)
30 L_PAREN@[25; 26)
31 IDENT@[26; 30) "test"
32 R_PAREN@[30; 31)
33 R_BRACK@[31; 32)
34 WHITESPACE@[32; 33)
35 NAME_REF@[33; 38)
36 IDENT@[33; 38) "field"
37 COLON@[38; 39)
38 WHITESPACE@[39; 40)
39 LITERAL@[40; 41)
40 INT_NUMBER@[40; 41) "1"
41 WHITESPACE@[41; 42)
42 R_CURLY@[42; 43)
43 WHITESPACE@[43; 44)
44 R_CURLY@[44; 45)
45 WHITESPACE@[45; 46)
diff --git a/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.rs b/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.rs
new file mode 100644
index 000000000..bbd6b0f6e
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.rs
@@ -0,0 +1,27 @@
1// https://github.com/rust-analyzer/rust-analyzer/issues/972
2
3fn main() {
4 match Some(-1) {
5 Some(-1) => (),
6 _ => (),
7 }
8
9 match Some((-1, -1)) {
10 Some((-1, -1)) => (),
11 _ => (),
12 }
13
14 match A::B(-1, -1) {
15 A::B(-1, -1) => (),
16 _ => (),
17 }
18
19 if let Some(-1) = Some(-1) {
20 }
21}
22
23enum A {
24 B(i8, i8)
25}
26
27fn foo(-128..=127: i8) {}
diff --git a/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.txt b/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.txt
new file mode 100644
index 000000000..ca66b44bb
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/ok/0047_minus_in_inner_pattern.txt
@@ -0,0 +1,320 @@
1SOURCE_FILE@[0; 395)
2 COMMENT@[0; 60)
3 WHITESPACE@[60; 62)
4 FN_DEF@[62; 341)
5 FN_KW@[62; 64)
6 WHITESPACE@[64; 65)
7 NAME@[65; 69)
8 IDENT@[65; 69) "main"
9 PARAM_LIST@[69; 71)
10 L_PAREN@[69; 70)
11 R_PAREN@[70; 71)
12 WHITESPACE@[71; 72)
13 BLOCK@[72; 341)
14 L_CURLY@[72; 73)
15 WHITESPACE@[73; 78)
16 EXPR_STMT@[78; 141)
17 MATCH_EXPR@[78; 141)
18 MATCH_KW@[78; 83)
19 WHITESPACE@[83; 84)
20 CALL_EXPR@[84; 92)
21 PATH_EXPR@[84; 88)
22 PATH@[84; 88)
23 PATH_SEGMENT@[84; 88)
24 NAME_REF@[84; 88)
25 IDENT@[84; 88) "Some"
26 ARG_LIST@[88; 92)
27 L_PAREN@[88; 89)
28 PREFIX_EXPR@[89; 91)
29 MINUS@[89; 90)
30 LITERAL@[90; 91)
31 INT_NUMBER@[90; 91) "1"
32 R_PAREN@[91; 92)
33 WHITESPACE@[92; 93)
34 MATCH_ARM_LIST@[93; 141)
35 L_CURLY@[93; 94)
36 WHITESPACE@[94; 103)
37 MATCH_ARM@[103; 117)
38 TUPLE_STRUCT_PAT@[103; 111)
39 PATH@[103; 107)
40 PATH_SEGMENT@[103; 107)
41 NAME_REF@[103; 107)
42 IDENT@[103; 107) "Some"
43 L_PAREN@[107; 108)
44 LITERAL_PAT@[108; 110)
45 MINUS@[108; 109)
46 LITERAL@[109; 110)
47 INT_NUMBER@[109; 110) "1"
48 R_PAREN@[110; 111)
49 WHITESPACE@[111; 112)
50 FAT_ARROW@[112; 114)
51 WHITESPACE@[114; 115)
52 TUPLE_EXPR@[115; 117)
53 L_PAREN@[115; 116)
54 R_PAREN@[116; 117)
55 COMMA@[117; 118)
56 WHITESPACE@[118; 127)
57 MATCH_ARM@[127; 134)
58 PLACEHOLDER_PAT@[127; 128)
59 UNDERSCORE@[127; 128)
60 WHITESPACE@[128; 129)
61 FAT_ARROW@[129; 131)
62 WHITESPACE@[131; 132)
63 TUPLE_EXPR@[132; 134)
64 L_PAREN@[132; 133)
65 R_PAREN@[133; 134)
66 COMMA@[134; 135)
67 WHITESPACE@[135; 140)
68 R_CURLY@[140; 141)
69 WHITESPACE@[141; 147)
70 EXPR_STMT@[147; 222)
71 MATCH_EXPR@[147; 222)
72 MATCH_KW@[147; 152)
73 WHITESPACE@[152; 153)
74 CALL_EXPR@[153; 167)
75 PATH_EXPR@[153; 157)
76 PATH@[153; 157)
77 PATH_SEGMENT@[153; 157)
78 NAME_REF@[153; 157)
79 IDENT@[153; 157) "Some"
80 ARG_LIST@[157; 167)
81 L_PAREN@[157; 158)
82 TUPLE_EXPR@[158; 166)
83 L_PAREN@[158; 159)
84 PREFIX_EXPR@[159; 161)
85 MINUS@[159; 160)
86 LITERAL@[160; 161)
87 INT_NUMBER@[160; 161) "1"
88 COMMA@[161; 162)
89 WHITESPACE@[162; 163)
90 PREFIX_EXPR@[163; 165)
91 MINUS@[163; 164)
92 LITERAL@[164; 165)
93 INT_NUMBER@[164; 165) "1"
94 R_PAREN@[165; 166)
95 R_PAREN@[166; 167)
96 WHITESPACE@[167; 168)
97 MATCH_ARM_LIST@[168; 222)
98 L_CURLY@[168; 169)
99 WHITESPACE@[169; 178)
100 MATCH_ARM@[178; 198)
101 TUPLE_STRUCT_PAT@[178; 192)
102 PATH@[178; 182)
103 PATH_SEGMENT@[178; 182)
104 NAME_REF@[178; 182)
105 IDENT@[178; 182) "Some"
106 L_PAREN@[182; 183)
107 TUPLE_PAT@[183; 191)
108 L_PAREN@[183; 184)
109 LITERAL_PAT@[184; 186)
110 MINUS@[184; 185)
111 LITERAL@[185; 186)
112 INT_NUMBER@[185; 186) "1"
113 COMMA@[186; 187)
114 WHITESPACE@[187; 188)
115 LITERAL_PAT@[188; 190)
116 MINUS@[188; 189)
117 LITERAL@[189; 190)
118 INT_NUMBER@[189; 190) "1"
119 R_PAREN@[190; 191)
120 R_PAREN@[191; 192)
121 WHITESPACE@[192; 193)
122 FAT_ARROW@[193; 195)
123 WHITESPACE@[195; 196)
124 TUPLE_EXPR@[196; 198)
125 L_PAREN@[196; 197)
126 R_PAREN@[197; 198)
127 COMMA@[198; 199)
128 WHITESPACE@[199; 208)
129 MATCH_ARM@[208; 215)
130 PLACEHOLDER_PAT@[208; 209)
131 UNDERSCORE@[208; 209)
132 WHITESPACE@[209; 210)
133 FAT_ARROW@[210; 212)
134 WHITESPACE@[212; 213)
135 TUPLE_EXPR@[213; 215)
136 L_PAREN@[213; 214)
137 R_PAREN@[214; 215)
138 COMMA@[215; 216)
139 WHITESPACE@[216; 221)
140 R_CURLY@[221; 222)
141 WHITESPACE@[222; 228)
142 EXPR_STMT@[228; 299)
143 MATCH_EXPR@[228; 299)
144 MATCH_KW@[228; 233)
145 WHITESPACE@[233; 234)
146 CALL_EXPR@[234; 246)
147 PATH_EXPR@[234; 238)
148 PATH@[234; 238)
149 PATH@[234; 235)
150 PATH_SEGMENT@[234; 235)
151 NAME_REF@[234; 235)
152 IDENT@[234; 235) "A"
153 COLONCOLON@[235; 237)
154 PATH_SEGMENT@[237; 238)
155 NAME_REF@[237; 238)
156 IDENT@[237; 238) "B"
157 ARG_LIST@[238; 246)
158 L_PAREN@[238; 239)
159 PREFIX_EXPR@[239; 241)
160 MINUS@[239; 240)
161 LITERAL@[240; 241)
162 INT_NUMBER@[240; 241) "1"
163 COMMA@[241; 242)
164 WHITESPACE@[242; 243)
165 PREFIX_EXPR@[243; 245)
166 MINUS@[243; 244)
167 LITERAL@[244; 245)
168 INT_NUMBER@[244; 245) "1"
169 R_PAREN@[245; 246)
170 WHITESPACE@[246; 247)
171 MATCH_ARM_LIST@[247; 299)
172 L_CURLY@[247; 248)
173 WHITESPACE@[248; 257)
174 MATCH_ARM@[257; 275)
175 TUPLE_STRUCT_PAT@[257; 269)
176 PATH@[257; 261)
177 PATH@[257; 258)
178 PATH_SEGMENT@[257; 258)
179 NAME_REF@[257; 258)
180 IDENT@[257; 258) "A"
181 COLONCOLON@[258; 260)
182 PATH_SEGMENT@[260; 261)
183 NAME_REF@[260; 261)
184 IDENT@[260; 261) "B"
185 L_PAREN@[261; 262)
186 LITERAL_PAT@[262; 264)
187 MINUS@[262; 263)
188 LITERAL@[263; 264)
189 INT_NUMBER@[263; 264) "1"
190 COMMA@[264; 265)
191 WHITESPACE@[265; 266)
192 LITERAL_PAT@[266; 268)
193 MINUS@[266; 267)
194 LITERAL@[267; 268)
195 INT_NUMBER@[267; 268) "1"
196 R_PAREN@[268; 269)
197 WHITESPACE@[269; 270)
198 FAT_ARROW@[270; 272)
199 WHITESPACE@[272; 273)
200 TUPLE_EXPR@[273; 275)
201 L_PAREN@[273; 274)
202 R_PAREN@[274; 275)
203 COMMA@[275; 276)
204 WHITESPACE@[276; 285)
205 MATCH_ARM@[285; 292)
206 PLACEHOLDER_PAT@[285; 286)
207 UNDERSCORE@[285; 286)
208 WHITESPACE@[286; 287)
209 FAT_ARROW@[287; 289)
210 WHITESPACE@[289; 290)
211 TUPLE_EXPR@[290; 292)
212 L_PAREN@[290; 291)
213 R_PAREN@[291; 292)
214 COMMA@[292; 293)
215 WHITESPACE@[293; 298)
216 R_CURLY@[298; 299)
217 WHITESPACE@[299; 305)
218 IF_EXPR@[305; 339)
219 IF_KW@[305; 307)
220 WHITESPACE@[307; 308)
221 CONDITION@[308; 331)
222 LET_KW@[308; 311)
223 WHITESPACE@[311; 312)
224 TUPLE_STRUCT_PAT@[312; 320)
225 PATH@[312; 316)
226 PATH_SEGMENT@[312; 316)
227 NAME_REF@[312; 316)
228 IDENT@[312; 316) "Some"
229 L_PAREN@[316; 317)
230 LITERAL_PAT@[317; 319)
231 MINUS@[317; 318)
232 LITERAL@[318; 319)
233 INT_NUMBER@[318; 319) "1"
234 R_PAREN@[319; 320)
235 WHITESPACE@[320; 321)
236 EQ@[321; 322)
237 WHITESPACE@[322; 323)
238 CALL_EXPR@[323; 331)
239 PATH_EXPR@[323; 327)
240 PATH@[323; 327)
241 PATH_SEGMENT@[323; 327)
242 NAME_REF@[323; 327)
243 IDENT@[323; 327) "Some"
244 ARG_LIST@[327; 331)
245 L_PAREN@[327; 328)
246 PREFIX_EXPR@[328; 330)
247 MINUS@[328; 329)
248 LITERAL@[329; 330)
249 INT_NUMBER@[329; 330) "1"
250 R_PAREN@[330; 331)
251 WHITESPACE@[331; 332)
252 BLOCK@[332; 339)
253 L_CURLY@[332; 333)
254 WHITESPACE@[333; 338)
255 R_CURLY@[338; 339)
256 WHITESPACE@[339; 340)
257 R_CURLY@[340; 341)
258 WHITESPACE@[341; 343)
259 ENUM_DEF@[343; 367)
260 ENUM_KW@[343; 347)
261 WHITESPACE@[347; 348)
262 NAME@[348; 349)
263 IDENT@[348; 349) "A"
264 WHITESPACE@[349; 350)
265 ENUM_VARIANT_LIST@[350; 367)
266 L_CURLY@[350; 351)
267 WHITESPACE@[351; 356)
268 ENUM_VARIANT@[356; 365)
269 NAME@[356; 357)
270 IDENT@[356; 357) "B"
271 POS_FIELD_DEF_LIST@[357; 365)
272 L_PAREN@[357; 358)
273 POS_FIELD_DEF@[358; 360)
274 PATH_TYPE@[358; 360)
275 PATH@[358; 360)
276 PATH_SEGMENT@[358; 360)
277 NAME_REF@[358; 360)
278 IDENT@[358; 360) "i8"
279 COMMA@[360; 361)
280 WHITESPACE@[361; 362)
281 POS_FIELD_DEF@[362; 364)
282 PATH_TYPE@[362; 364)
283 PATH@[362; 364)
284 PATH_SEGMENT@[362; 364)
285 NAME_REF@[362; 364)
286 IDENT@[362; 364) "i8"
287 R_PAREN@[364; 365)
288 WHITESPACE@[365; 366)
289 R_CURLY@[366; 367)
290 WHITESPACE@[367; 369)
291 FN_DEF@[369; 394)
292 FN_KW@[369; 371)
293 WHITESPACE@[371; 372)
294 NAME@[372; 375)
295 IDENT@[372; 375) "foo"
296 PARAM_LIST@[375; 391)
297 L_PAREN@[375; 376)
298 PARAM@[376; 390)
299 RANGE_PAT@[376; 386)
300 LITERAL_PAT@[376; 380)
301 MINUS@[376; 377)
302 LITERAL@[377; 380)
303 INT_NUMBER@[377; 380) "128"
304 DOTDOTEQ@[380; 383)
305 LITERAL_PAT@[383; 386)
306 LITERAL@[383; 386)
307 INT_NUMBER@[383; 386) "127"
308 COLON@[386; 387)
309 WHITESPACE@[387; 388)
310 PATH_TYPE@[388; 390)
311 PATH@[388; 390)
312 PATH_SEGMENT@[388; 390)
313 NAME_REF@[388; 390)
314 IDENT@[388; 390) "i8"
315 R_PAREN@[390; 391)
316 WHITESPACE@[391; 392)
317 BLOCK@[392; 394)
318 L_CURLY@[392; 393)
319 R_CURLY@[393; 394)
320 WHITESPACE@[394; 395)
diff --git a/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.rs b/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.rs
new file mode 100644
index 000000000..871720a49
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.rs
@@ -0,0 +1,17 @@
1// https://github.com/rust-analyzer/rust-analyzer/pull/983
2
3fn compound_assignment() {
4 let mut a = 0;
5 a += 1;
6 a -= 2;
7 a *= 3;
8 a %= 4;
9 a /= 5;
10 a |= 6;
11 a &= 7;
12 a ^= 8;
13 a <= 9;
14 a >= 10;
15 a >>= 11;
16 a <<= 12;
17}
diff --git a/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.txt b/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.txt
new file mode 100644
index 000000000..c5ff06823
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/ok/0048_compound_assignment.txt
@@ -0,0 +1,200 @@
1SOURCE_FILE@[0; 257)
2 COMMENT@[0; 58)
3 WHITESPACE@[58; 60)
4 FN_DEF@[60; 256)
5 FN_KW@[60; 62)
6 WHITESPACE@[62; 63)
7 NAME@[63; 82)
8 IDENT@[63; 82) "compound_assignment"
9 PARAM_LIST@[82; 84)
10 L_PAREN@[82; 83)
11 R_PAREN@[83; 84)
12 WHITESPACE@[84; 85)
13 BLOCK@[85; 256)
14 L_CURLY@[85; 86)
15 WHITESPACE@[86; 91)
16 LET_STMT@[91; 105)
17 LET_KW@[91; 94)
18 WHITESPACE@[94; 95)
19 BIND_PAT@[95; 100)
20 MUT_KW@[95; 98)
21 WHITESPACE@[98; 99)
22 NAME@[99; 100)
23 IDENT@[99; 100) "a"
24 WHITESPACE@[100; 101)
25 EQ@[101; 102)
26 WHITESPACE@[102; 103)
27 LITERAL@[103; 104)
28 INT_NUMBER@[103; 104) "0"
29 SEMI@[104; 105)
30 WHITESPACE@[105; 110)
31 EXPR_STMT@[110; 117)
32 BIN_EXPR@[110; 116)
33 PATH_EXPR@[110; 111)
34 PATH@[110; 111)
35 PATH_SEGMENT@[110; 111)
36 NAME_REF@[110; 111)
37 IDENT@[110; 111) "a"
38 WHITESPACE@[111; 112)
39 PLUSEQ@[112; 114)
40 WHITESPACE@[114; 115)
41 LITERAL@[115; 116)
42 INT_NUMBER@[115; 116) "1"
43 SEMI@[116; 117)
44 WHITESPACE@[117; 122)
45 EXPR_STMT@[122; 129)
46 BIN_EXPR@[122; 128)
47 PATH_EXPR@[122; 123)
48 PATH@[122; 123)
49 PATH_SEGMENT@[122; 123)
50 NAME_REF@[122; 123)
51 IDENT@[122; 123) "a"
52 WHITESPACE@[123; 124)
53 MINUSEQ@[124; 126)
54 WHITESPACE@[126; 127)
55 LITERAL@[127; 128)
56 INT_NUMBER@[127; 128) "2"
57 SEMI@[128; 129)
58 WHITESPACE@[129; 134)
59 EXPR_STMT@[134; 141)
60 BIN_EXPR@[134; 140)
61 PATH_EXPR@[134; 135)
62 PATH@[134; 135)
63 PATH_SEGMENT@[134; 135)
64 NAME_REF@[134; 135)
65 IDENT@[134; 135) "a"
66 WHITESPACE@[135; 136)
67 STAREQ@[136; 138)
68 WHITESPACE@[138; 139)
69 LITERAL@[139; 140)
70 INT_NUMBER@[139; 140) "3"
71 SEMI@[140; 141)
72 WHITESPACE@[141; 146)
73 EXPR_STMT@[146; 153)
74 BIN_EXPR@[146; 152)
75 PATH_EXPR@[146; 147)
76 PATH@[146; 147)
77 PATH_SEGMENT@[146; 147)
78 NAME_REF@[146; 147)
79 IDENT@[146; 147) "a"
80 WHITESPACE@[147; 148)
81 PERCENTEQ@[148; 150)
82 WHITESPACE@[150; 151)
83 LITERAL@[151; 152)
84 INT_NUMBER@[151; 152) "4"
85 SEMI@[152; 153)
86 WHITESPACE@[153; 158)
87 EXPR_STMT@[158; 165)
88 BIN_EXPR@[158; 164)
89 PATH_EXPR@[158; 159)
90 PATH@[158; 159)
91 PATH_SEGMENT@[158; 159)
92 NAME_REF@[158; 159)
93 IDENT@[158; 159) "a"
94 WHITESPACE@[159; 160)
95 SLASHEQ@[160; 162)
96 WHITESPACE@[162; 163)
97 LITERAL@[163; 164)
98 INT_NUMBER@[163; 164) "5"
99 SEMI@[164; 165)
100 WHITESPACE@[165; 170)
101 EXPR_STMT@[170; 177)
102 BIN_EXPR@[170; 176)
103 PATH_EXPR@[170; 171)
104 PATH@[170; 171)
105 PATH_SEGMENT@[170; 171)
106 NAME_REF@[170; 171)
107 IDENT@[170; 171) "a"
108 WHITESPACE@[171; 172)
109 PIPEEQ@[172; 174)
110 WHITESPACE@[174; 175)
111 LITERAL@[175; 176)
112 INT_NUMBER@[175; 176) "6"
113 SEMI@[176; 177)
114 WHITESPACE@[177; 182)
115 EXPR_STMT@[182; 189)
116 BIN_EXPR@[182; 188)
117 PATH_EXPR@[182; 183)
118 PATH@[182; 183)
119 PATH_SEGMENT@[182; 183)
120 NAME_REF@[182; 183)
121 IDENT@[182; 183) "a"
122 WHITESPACE@[183; 184)
123 AMPEQ@[184; 186)
124 WHITESPACE@[186; 187)
125 LITERAL@[187; 188)
126 INT_NUMBER@[187; 188) "7"
127 SEMI@[188; 189)
128 WHITESPACE@[189; 194)
129 EXPR_STMT@[194; 201)
130 BIN_EXPR@[194; 200)
131 PATH_EXPR@[194; 195)
132 PATH@[194; 195)
133 PATH_SEGMENT@[194; 195)
134 NAME_REF@[194; 195)
135 IDENT@[194; 195) "a"
136 WHITESPACE@[195; 196)
137 CARETEQ@[196; 198)
138 WHITESPACE@[198; 199)
139 LITERAL@[199; 200)
140 INT_NUMBER@[199; 200) "8"
141 SEMI@[200; 201)
142 WHITESPACE@[201; 206)
143 EXPR_STMT@[206; 213)
144 BIN_EXPR@[206; 212)
145 PATH_EXPR@[206; 207)
146 PATH@[206; 207)
147 PATH_SEGMENT@[206; 207)
148 NAME_REF@[206; 207)
149 IDENT@[206; 207) "a"
150 WHITESPACE@[207; 208)
151 LTEQ@[208; 210)
152 WHITESPACE@[210; 211)
153 LITERAL@[211; 212)
154 INT_NUMBER@[211; 212) "9"
155 SEMI@[212; 213)
156 WHITESPACE@[213; 218)
157 EXPR_STMT@[218; 226)
158 BIN_EXPR@[218; 225)
159 PATH_EXPR@[218; 219)
160 PATH@[218; 219)
161 PATH_SEGMENT@[218; 219)
162 NAME_REF@[218; 219)
163 IDENT@[218; 219) "a"
164 WHITESPACE@[219; 220)
165 GTEQ@[220; 222)
166 WHITESPACE@[222; 223)
167 LITERAL@[223; 225)
168 INT_NUMBER@[223; 225) "10"
169 SEMI@[225; 226)
170 WHITESPACE@[226; 231)
171 EXPR_STMT@[231; 240)
172 BIN_EXPR@[231; 239)
173 PATH_EXPR@[231; 232)
174 PATH@[231; 232)
175 PATH_SEGMENT@[231; 232)
176 NAME_REF@[231; 232)
177 IDENT@[231; 232) "a"
178 WHITESPACE@[232; 233)
179 SHREQ@[233; 236)
180 WHITESPACE@[236; 237)
181 LITERAL@[237; 239)
182 INT_NUMBER@[237; 239) "11"
183 SEMI@[239; 240)
184 WHITESPACE@[240; 245)
185 EXPR_STMT@[245; 254)
186 BIN_EXPR@[245; 253)
187 PATH_EXPR@[245; 246)
188 PATH@[245; 246)
189 PATH_SEGMENT@[245; 246)
190 NAME_REF@[245; 246)
191 IDENT@[245; 246) "a"
192 WHITESPACE@[246; 247)
193 SHLEQ@[247; 250)
194 WHITESPACE@[250; 251)
195 LITERAL@[251; 253)
196 INT_NUMBER@[251; 253) "12"
197 SEMI@[253; 254)
198 WHITESPACE@[254; 255)
199 R_CURLY@[255; 256)
200 WHITESPACE@[256; 257)