Repository: rust-analyzer/rust-analyzer
Pull request #1461 (2019-06-30 08:11:45)

Support attributes on array members
Array members are allowed to have attributes such as `#[cfg]`.


Patch:
diff --git a/crates/ra_parser/src/grammar/expressions/atom.rs b/crates/ra_parser/src/grammar/expressions/atom.rs
index 41be283d00..6bda041416 100644
--- a/crates/ra_parser/src/grammar/expressions/atom.rs
+++ b/crates/ra_parser/src/grammar/expressions/atom.rs
@@ -170,6 +170,15 @@ fn array_expr(p: &mut Parser) -> CompletedMarker {
     if p.eat(T![']']) {
         return m.complete(p, ARRAY_EXPR);
     }
+
+    // test first_array_member_attributes
+    // pub const A: &[i64] = &[
+    //    #[cfg(test)]
+    //    1,
+    //    2,
+    // ];
+    attributes::outer_attributes(p);
+
     expr(p);
     if p.eat(T![;]) {
         expr(p);
@@ -181,6 +190,14 @@ fn array_expr(p: &mut Parser) -> CompletedMarker {
         if p.at(T![']']) {
             break;
         }
+
+        // test subsequent_array_member_attributes
+        // pub const A: &[i64] = &[
+        //    1,
+        //    #[cfg(test)]
+        //    2,
+        // ];
+        attributes::outer_attributes(p);
         if !p.at_ts(EXPR_FIRST) {
             p.error("expected expression");
             break;


Test patch:
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.rs
new file mode 100644
index 0000000000..f59e137711
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.rs
@@ -0,0 +1,5 @@
+pub const A: &[i64] = &[
+   #[cfg(test)]
+   1,
+   2,
+];
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.txt
new file mode 100644
index 0000000000..eac4f6f308
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0135_first_array_member_attributes.txt
@@ -0,0 +1,51 @@
+SOURCE_FILE@[0; 56)
+  CONST_DEF@[0; 55)
+    VISIBILITY@[0; 3)
+      PUB_KW@[0; 3) "pub"
+    WHITESPACE@[3; 4) " "
+    CONST_KW@[4; 9) "const"
+    WHITESPACE@[9; 10) " "
+    NAME@[10; 11)
+      IDENT@[10; 11) "A"
+    COLON@[11; 12) ":"
+    WHITESPACE@[12; 13) " "
+    REFERENCE_TYPE@[13; 19)
+      AMP@[13; 14) "&"
+      SLICE_TYPE@[14; 19)
+        L_BRACK@[14; 15) "["
+        PATH_TYPE@[15; 18)
+          PATH@[15; 18)
+            PATH_SEGMENT@[15; 18)
+              NAME_REF@[15; 18)
+                IDENT@[15; 18) "i64"
+        R_BRACK@[18; 19) "]"
+    WHITESPACE@[19; 20) " "
+    EQ@[20; 21) "="
+    WHITESPACE@[21; 22) " "
+    REF_EXPR@[22; 54)
+      AMP@[22; 23) "&"
+      ARRAY_EXPR@[23; 54)
+        L_BRACK@[23; 24) "["
+        WHITESPACE@[24; 28) "\n   "
+        ATTR@[28; 40)
+          POUND@[28; 29) "#"
+          TOKEN_TREE@[29; 40)
+            L_BRACK@[29; 30) "["
+            IDENT@[30; 33) "cfg"
+            TOKEN_TREE@[33; 39)
+              L_PAREN@[33; 34) "("
+              IDENT@[34; 38) "test"
+              R_PAREN@[38; 39) ")"
+            R_BRACK@[39; 40) "]"
+        WHITESPACE@[40; 44) "\n   "
+        LITERAL@[44; 45)
+          INT_NUMBER@[44; 45) "1"
+        COMMA@[45; 46) ","
+        WHITESPACE@[46; 50) "\n   "
+        LITERAL@[50; 51)
+          INT_NUMBER@[50; 51) "2"
+        COMMA@[51; 52) ","
+        WHITESPACE@[52; 53) "\n"
+        R_BRACK@[53; 54) "]"
+    SEMI@[54; 55) ";"
+  WHITESPACE@[55; 56) "\n"
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.rs
new file mode 100644
index 0000000000..1324acb3f6
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.rs
@@ -0,0 +1,5 @@
+pub const A: &[i64] = &[
+   1,
+   #[cfg(test)]
+   2,
+];
diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.txt
new file mode 100644
index 0000000000..6fa1b42d91
--- /dev/null
+++ b/crates/ra_syntax/tests/data/parser/inline/ok/0136_subsequent_array_member_attributes.txt
@@ -0,0 +1,51 @@
+SOURCE_FILE@[0; 56)
+  CONST_DEF@[0; 55)
+    VISIBILITY@[0; 3)
+      PUB_KW@[0; 3) "pub"
+    WHITESPACE@[3; 4) " "
+    CONST_KW@[4; 9) "const"
+    WHITESPACE@[9; 10) " "
+    NAME@[10; 11)
+      IDENT@[10; 11) "A"
+    COLON@[11; 12) ":"
+    WHITESPACE@[12; 13) " "
+    REFERENCE_TYPE@[13; 19)
+      AMP@[13; 14) "&"
+      SLICE_TYPE@[14; 19)
+        L_BRACK@[14; 15) "["
+        PATH_TYPE@[15; 18)
+          PATH@[15; 18)
+            PATH_SEGMENT@[15; 18)
+              NAME_REF@[15; 18)
+                IDENT@[15; 18) "i64"
+        R_BRACK@[18; 19) "]"
+    WHITESPACE@[19; 20) " "
+    EQ@[20; 21) "="
+    WHITESPACE@[21; 22) " "
+    REF_EXPR@[22; 54)
+      AMP@[22; 23) "&"
+      ARRAY_EXPR@[23; 54)
+        L_BRACK@[23; 24) "["
+        WHITESPACE@[24; 28) "\n   "
+        LITERAL@[28; 29)
+          INT_NUMBER@[28; 29) "1"
+        COMMA@[29; 30) ","
+        WHITESPACE@[30; 34) "\n   "
+        ATTR@[34; 46)
+          POUND@[34; 35) "#"
+          TOKEN_TREE@[35; 46)
+            L_BRACK@[35; 36) "["
+            IDENT@[36; 39) "cfg"
+            TOKEN_TREE@[39; 45)
+              L_PAREN@[39; 40) "("
+              IDENT@[40; 44) "test"
+              R_PAREN@[44; 45) ")"
+            R_BRACK@[45; 46) "]"
+        WHITESPACE@[46; 50) "\n   "
+        LITERAL@[50; 51)
+          INT_NUMBER@[50; 51) "2"
+        COMMA@[51; 52) ","
+        WHITESPACE@[52; 53) "\n"
+        R_BRACK@[53; 54) "]"
+    SEMI@[54; 55) ";"
+  WHITESPACE@[55; 56) "\n"