]> git.lizzy.rs Git - rust.git/commitdiff
Fix parser tests according to review
authorEvgenii P <eupn@protonmail.com>
Thu, 8 Aug 2019 02:12:07 +0000 (09:12 +0700)
committerEvgenii P <eupn@protonmail.com>
Thu, 8 Aug 2019 02:12:07 +0000 (09:12 +0700)
19 files changed:
crates/ra_parser/src/grammar/params.rs
crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rs
crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.txt
crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rs
crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.txt
crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rs
crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.txt
crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.rs
crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.txt
crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.rs
crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.txt
crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.rs
crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.txt
crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rs [new file with mode: 0644]
crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.txt [new file with mode: 0644]
crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.rs [new file with mode: 0644]
crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.txt [new file with mode: 0644]
crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rs [new file with mode: 0644]
crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.txt [new file with mode: 0644]

index 834d80b52fa570bc972e1910dfc339f59b39ae4a..0b09f18747cd839f946c00d47ac8e782d22cf175 100644 (file)
@@ -5,15 +5,12 @@
 // fn b(x: i32) {}
 // fn c(x: i32, ) {}
 // fn d(x: i32, y: ()) {}
-// fn g1(#[attr1] #[attr2] pat: Type) {}
-// fn g2(#[attr1] x: u8) {}
 pub(super) fn param_list(p: &mut Parser) {
     list_(p, Flavor::Normal)
 }
 
 // test param_list_opt_patterns
 // fn foo<F: FnMut(&mut Foo<'a>)>(){}
-// fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}
 pub(super) fn param_list_opt_patterns(p: &mut Parser) {
     list_(p, Flavor::OptionalPattern)
 }
@@ -44,10 +41,14 @@ fn list_(p: &mut Parser, flavor: Flavor) {
     let m = p.start();
     p.bump();
     if flavor.type_required() {
+        // test self_param_outer_attr
+        // fn f(#[must_use] self) {}
         attributes::outer_attributes(p);
         opt_self_param(p);
     }
     while !p.at(EOF) && !p.at(ket) {
+        // test param_outer_arg
+        // fn f(#[attr1] pat: Type) {}
         attributes::outer_attributes(p);
 
         if flavor.type_required() && p.at(T![...]) {
@@ -65,7 +66,6 @@ fn list_(p: &mut Parser, flavor: Flavor) {
     }
     // test param_list_vararg
     // extern "C" { fn printf(format: *const i8, ...) -> i32; }
-    // extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; }
     if flavor.type_required() {
         p.eat(T![...]);
     }
@@ -95,7 +95,6 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
             // test trait_fn_placeholder_parameter
             // trait Foo {
             //     fn bar(_: u64, mut x: i32);
-            //     fn bar(#[attr] _: u64, #[attr] mut x: i32);
             // }
             if (la0 == IDENT || la0 == T![_]) && la1 == T![:]
                 || la0 == T![mut] && la1 == IDENT && la2 == T![:]
@@ -119,12 +118,6 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) {
 //     fn c(&'a self,) {}
 //     fn d(&'a mut self, x: i32) {}
 //     fn e(mut self) {}
-//     fn f(#[must_use] self) {}
-//     fn g1(#[attr] self) {}
-//     fn g2(#[attr] &self) {}
-//     fn g3<'a>(#[attr] &mut self) {}
-//     fn g4<'a>(#[attr] &'a self) {}
-//     fn g5<'a>(#[attr] &'a mut self) {}
 // }
 fn opt_self_param(p: &mut Parser) {
     let m;
@@ -136,8 +129,6 @@ fn opt_self_param(p: &mut Parser) {
         // impl S {
         //     fn a(self: &Self) {}
         //     fn b(mut self: Box<Self>) {}
-        //     fn c(#[attr] self: Self) {}
-        //     fn d(#[attr] self: Rc<Self>) {}
         // }
         if p.at(T![:]) {
             types::ascription(p);
index 7811f52c0201deaf77a5432f21f4f18bf09c75af..80c0a43f5de0df9081c7eae671c6ac0f76b11b90 100644 (file)
@@ -4,10 +4,4 @@ fn b(&self,) {}
     fn c(&'a self,) {}
     fn d(&'a mut self, x: i32) {}
     fn e(mut self) {}
-    fn f(#[must_use] self) {}
-    fn g1(#[attr] self) {}
-    fn g2(#[attr] &self) {}
-    fn g3<'a>(#[attr] &mut self) {}
-    fn g4<'a>(#[attr] &'a self) {}
-    fn g5<'a>(#[attr] &'a mut self) {}
 }
index 5c75b6c751bb322e5d55d6eaaf29a2b6f0104be1..8e210a6ca597c2100bf7c0a3792577a2a96790e4 100644 (file)
@@ -1,5 +1,5 @@
-SOURCE_FILE@[0; 323)
-  IMPL_BLOCK@[0; 322)
+SOURCE_FILE@[0; 128)
+  IMPL_BLOCK@[0; 127)
     IMPL_KW@[0; 4) "impl"
     WHITESPACE@[4; 5) " "
     PATH_TYPE@[5; 6)
@@ -8,7 +8,7 @@ SOURCE_FILE@[0; 323)
           NAME_REF@[5; 6)
             IDENT@[5; 6) "S"
     WHITESPACE@[6; 7) " "
-    ITEM_LIST@[7; 322)
+    ITEM_LIST@[7; 127)
       L_CURLY@[7; 8) "{"
       WHITESPACE@[8; 13) "\n    "
       FN_DEF@[13; 26)
@@ -111,165 +111,6 @@ SOURCE_FILE@[0; 323)
         BLOCK@[123; 125)
           L_CURLY@[123; 124) "{"
           R_CURLY@[124; 125) "}"
-      WHITESPACE@[125; 130) "\n    "
-      FN_DEF@[130; 155)
-        FN_KW@[130; 132) "fn"
-        WHITESPACE@[132; 133) " "
-        NAME@[133; 134)
-          IDENT@[133; 134) "f"
-        PARAM_LIST@[134; 152)
-          L_PAREN@[134; 135) "("
-          ATTR@[135; 146)
-            POUND@[135; 136) "#"
-            TOKEN_TREE@[136; 146)
-              L_BRACK@[136; 137) "["
-              IDENT@[137; 145) "must_use"
-              R_BRACK@[145; 146) "]"
-          WHITESPACE@[146; 147) " "
-          SELF_PARAM@[147; 151)
-            SELF_KW@[147; 151) "self"
-          R_PAREN@[151; 152) ")"
-        WHITESPACE@[152; 153) " "
-        BLOCK@[153; 155)
-          L_CURLY@[153; 154) "{"
-          R_CURLY@[154; 155) "}"
-      WHITESPACE@[155; 160) "\n    "
-      FN_DEF@[160; 182)
-        FN_KW@[160; 162) "fn"
-        WHITESPACE@[162; 163) " "
-        NAME@[163; 165)
-          IDENT@[163; 165) "g1"
-        PARAM_LIST@[165; 179)
-          L_PAREN@[165; 166) "("
-          ATTR@[166; 173)
-            POUND@[166; 167) "#"
-            TOKEN_TREE@[167; 173)
-              L_BRACK@[167; 168) "["
-              IDENT@[168; 172) "attr"
-              R_BRACK@[172; 173) "]"
-          WHITESPACE@[173; 174) " "
-          SELF_PARAM@[174; 178)
-            SELF_KW@[174; 178) "self"
-          R_PAREN@[178; 179) ")"
-        WHITESPACE@[179; 180) " "
-        BLOCK@[180; 182)
-          L_CURLY@[180; 181) "{"
-          R_CURLY@[181; 182) "}"
-      WHITESPACE@[182; 187) "\n    "
-      FN_DEF@[187; 210)
-        FN_KW@[187; 189) "fn"
-        WHITESPACE@[189; 190) " "
-        NAME@[190; 192)
-          IDENT@[190; 192) "g2"
-        PARAM_LIST@[192; 207)
-          L_PAREN@[192; 193) "("
-          ATTR@[193; 200)
-            POUND@[193; 194) "#"
-            TOKEN_TREE@[194; 200)
-              L_BRACK@[194; 195) "["
-              IDENT@[195; 199) "attr"
-              R_BRACK@[199; 200) "]"
-          WHITESPACE@[200; 201) " "
-          SELF_PARAM@[201; 206)
-            AMP@[201; 202) "&"
-            SELF_KW@[202; 206) "self"
-          R_PAREN@[206; 207) ")"
-        WHITESPACE@[207; 208) " "
-        BLOCK@[208; 210)
-          L_CURLY@[208; 209) "{"
-          R_CURLY@[209; 210) "}"
-      WHITESPACE@[210; 215) "\n    "
-      FN_DEF@[215; 246)
-        FN_KW@[215; 217) "fn"
-        WHITESPACE@[217; 218) " "
-        NAME@[218; 220)
-          IDENT@[218; 220) "g3"
-        TYPE_PARAM_LIST@[220; 224)
-          L_ANGLE@[220; 221) "<"
-          LIFETIME_PARAM@[221; 223)
-            LIFETIME@[221; 223) "\'a"
-          R_ANGLE@[223; 224) ">"
-        PARAM_LIST@[224; 243)
-          L_PAREN@[224; 225) "("
-          ATTR@[225; 232)
-            POUND@[225; 226) "#"
-            TOKEN_TREE@[226; 232)
-              L_BRACK@[226; 227) "["
-              IDENT@[227; 231) "attr"
-              R_BRACK@[231; 232) "]"
-          WHITESPACE@[232; 233) " "
-          SELF_PARAM@[233; 242)
-            AMP@[233; 234) "&"
-            MUT_KW@[234; 237) "mut"
-            WHITESPACE@[237; 238) " "
-            SELF_KW@[238; 242) "self"
-          R_PAREN@[242; 243) ")"
-        WHITESPACE@[243; 244) " "
-        BLOCK@[244; 246)
-          L_CURLY@[244; 245) "{"
-          R_CURLY@[245; 246) "}"
-      WHITESPACE@[246; 251) "\n    "
-      FN_DEF@[251; 281)
-        FN_KW@[251; 253) "fn"
-        WHITESPACE@[253; 254) " "
-        NAME@[254; 256)
-          IDENT@[254; 256) "g4"
-        TYPE_PARAM_LIST@[256; 260)
-          L_ANGLE@[256; 257) "<"
-          LIFETIME_PARAM@[257; 259)
-            LIFETIME@[257; 259) "\'a"
-          R_ANGLE@[259; 260) ">"
-        PARAM_LIST@[260; 278)
-          L_PAREN@[260; 261) "("
-          ATTR@[261; 268)
-            POUND@[261; 262) "#"
-            TOKEN_TREE@[262; 268)
-              L_BRACK@[262; 263) "["
-              IDENT@[263; 267) "attr"
-              R_BRACK@[267; 268) "]"
-          WHITESPACE@[268; 269) " "
-          SELF_PARAM@[269; 277)
-            AMP@[269; 270) "&"
-            LIFETIME@[270; 272) "\'a"
-            WHITESPACE@[272; 273) " "
-            SELF_KW@[273; 277) "self"
-          R_PAREN@[277; 278) ")"
-        WHITESPACE@[278; 279) " "
-        BLOCK@[279; 281)
-          L_CURLY@[279; 280) "{"
-          R_CURLY@[280; 281) "}"
-      WHITESPACE@[281; 286) "\n    "
-      FN_DEF@[286; 320)
-        FN_KW@[286; 288) "fn"
-        WHITESPACE@[288; 289) " "
-        NAME@[289; 291)
-          IDENT@[289; 291) "g5"
-        TYPE_PARAM_LIST@[291; 295)
-          L_ANGLE@[291; 292) "<"
-          LIFETIME_PARAM@[292; 294)
-            LIFETIME@[292; 294) "\'a"
-          R_ANGLE@[294; 295) ">"
-        PARAM_LIST@[295; 317)
-          L_PAREN@[295; 296) "("
-          ATTR@[296; 303)
-            POUND@[296; 297) "#"
-            TOKEN_TREE@[297; 303)
-              L_BRACK@[297; 298) "["
-              IDENT@[298; 302) "attr"
-              R_BRACK@[302; 303) "]"
-          WHITESPACE@[303; 304) " "
-          SELF_PARAM@[304; 316)
-            AMP@[304; 305) "&"
-            LIFETIME@[305; 307) "\'a"
-            WHITESPACE@[307; 308) " "
-            MUT_KW@[308; 311) "mut"
-            WHITESPACE@[311; 312) " "
-            SELF_KW@[312; 316) "self"
-          R_PAREN@[316; 317) ")"
-        WHITESPACE@[317; 318) " "
-        BLOCK@[318; 320)
-          L_CURLY@[318; 319) "{"
-          R_CURLY@[319; 320) "}"
-      WHITESPACE@[320; 321) "\n"
-      R_CURLY@[321; 322) "}"
-  WHITESPACE@[322; 323) "\n"
+      WHITESPACE@[125; 126) "\n"
+      R_CURLY@[126; 127) "}"
+  WHITESPACE@[127; 128) "\n"
index 077216dae5c0bb8f6fadae7c278f72d150e5e700..6a170d5ac1d38c96cbaafa51beb5ada862c12a0c 100644 (file)
@@ -1,6 +1,4 @@
 impl S {
     fn a(self: &Self) {}
     fn b(mut self: Box<Self>) {}
-    fn c(#[attr] self: Self) {}
-    fn d(#[attr] self: Rc<Self>) {}
 }
index ca49bcc260dc74a22fc8be9e6f821a9fa0a24ed5..67d0de0f0b0ef40b911ea258764d69fa71d1c8c1 100644 (file)
@@ -1,5 +1,5 @@
-SOURCE_FILE@[0; 137)
-  IMPL_BLOCK@[0; 136)
+SOURCE_FILE@[0; 69)
+  IMPL_BLOCK@[0; 68)
     IMPL_KW@[0; 4) "impl"
     WHITESPACE@[4; 5) " "
     PATH_TYPE@[5; 6)
@@ -8,7 +8,7 @@ SOURCE_FILE@[0; 137)
           NAME_REF@[5; 6)
             IDENT@[5; 6) "S"
     WHITESPACE@[6; 7) " "
-    ITEM_LIST@[7; 136)
+    ITEM_LIST@[7; 68)
       L_CURLY@[7; 8) "{"
       WHITESPACE@[8; 13) "\n    "
       FN_DEF@[13; 33)
@@ -67,73 +67,6 @@ SOURCE_FILE@[0; 137)
         BLOCK@[64; 66)
           L_CURLY@[64; 65) "{"
           R_CURLY@[65; 66) "}"
-      WHITESPACE@[66; 71) "\n    "
-      FN_DEF@[71; 98)
-        FN_KW@[71; 73) "fn"
-        WHITESPACE@[73; 74) " "
-        NAME@[74; 75)
-          IDENT@[74; 75) "c"
-        PARAM_LIST@[75; 95)
-          L_PAREN@[75; 76) "("
-          ATTR@[76; 83)
-            POUND@[76; 77) "#"
-            TOKEN_TREE@[77; 83)
-              L_BRACK@[77; 78) "["
-              IDENT@[78; 82) "attr"
-              R_BRACK@[82; 83) "]"
-          WHITESPACE@[83; 84) " "
-          SELF_PARAM@[84; 94)
-            SELF_KW@[84; 88) "self"
-            COLON@[88; 89) ":"
-            WHITESPACE@[89; 90) " "
-            PATH_TYPE@[90; 94)
-              PATH@[90; 94)
-                PATH_SEGMENT@[90; 94)
-                  NAME_REF@[90; 94)
-                    IDENT@[90; 94) "Self"
-          R_PAREN@[94; 95) ")"
-        WHITESPACE@[95; 96) " "
-        BLOCK@[96; 98)
-          L_CURLY@[96; 97) "{"
-          R_CURLY@[97; 98) "}"
-      WHITESPACE@[98; 103) "\n    "
-      FN_DEF@[103; 134)
-        FN_KW@[103; 105) "fn"
-        WHITESPACE@[105; 106) " "
-        NAME@[106; 107)
-          IDENT@[106; 107) "d"
-        PARAM_LIST@[107; 131)
-          L_PAREN@[107; 108) "("
-          ATTR@[108; 115)
-            POUND@[108; 109) "#"
-            TOKEN_TREE@[109; 115)
-              L_BRACK@[109; 110) "["
-              IDENT@[110; 114) "attr"
-              R_BRACK@[114; 115) "]"
-          WHITESPACE@[115; 116) " "
-          SELF_PARAM@[116; 130)
-            SELF_KW@[116; 120) "self"
-            COLON@[120; 121) ":"
-            WHITESPACE@[121; 122) " "
-            PATH_TYPE@[122; 130)
-              PATH@[122; 130)
-                PATH_SEGMENT@[122; 130)
-                  NAME_REF@[122; 124)
-                    IDENT@[122; 124) "Rc"
-                  TYPE_ARG_LIST@[124; 130)
-                    L_ANGLE@[124; 125) "<"
-                    TYPE_ARG@[125; 129)
-                      PATH_TYPE@[125; 129)
-                        PATH@[125; 129)
-                          PATH_SEGMENT@[125; 129)
-                            NAME_REF@[125; 129)
-                              IDENT@[125; 129) "Self"
-                    R_ANGLE@[129; 130) ">"
-          R_PAREN@[130; 131) ")"
-        WHITESPACE@[131; 132) " "
-        BLOCK@[132; 134)
-          L_CURLY@[132; 133) "{"
-          R_CURLY@[133; 134) "}"
-      WHITESPACE@[134; 135) "\n"
-      R_CURLY@[135; 136) "}"
-  WHITESPACE@[136; 137) "\n"
+      WHITESPACE@[66; 67) "\n"
+      R_CURLY@[67; 68) "}"
+  WHITESPACE@[68; 69) "\n"
index 9833dd8f1fc73ce96255a19efc01bc38f8d700c8..9b93442c0f21cfb44e902f514f63068a153b09a6 100644 (file)
@@ -1,2 +1 @@
 fn foo<F: FnMut(&mut Foo<'a>)>(){}
-fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}
index 0b377dfd44ef6b4650a43e0922622e46717c8f6c..f85d6a4bc123ce45cb758c5179ddd46a352ad0a8 100644 (file)
@@ -1,4 +1,4 @@
-SOURCE_FILE@[0; 78)
+SOURCE_FILE@[0; 35)
   FN_DEF@[0; 34)
     FN_KW@[0; 2) "fn"
     WHITESPACE@[2; 3) " "
@@ -44,55 +44,3 @@ SOURCE_FILE@[0; 78)
       L_CURLY@[32; 33) "{"
       R_CURLY@[33; 34) "}"
   WHITESPACE@[34; 35) "\n"
-  FN_DEF@[35; 77)
-    FN_KW@[35; 37) "fn"
-    WHITESPACE@[37; 38) " "
-    NAME@[38; 41)
-      IDENT@[38; 41) "foo"
-    TYPE_PARAM_LIST@[41; 73)
-      L_ANGLE@[41; 42) "<"
-      TYPE_PARAM@[42; 72)
-        NAME@[42; 43)
-          IDENT@[42; 43) "F"
-        COLON@[43; 44) ":"
-        WHITESPACE@[44; 45) " "
-        TYPE_BOUND_LIST@[45; 72)
-          TYPE_BOUND@[45; 72)
-            PATH_TYPE@[45; 72)
-              PATH@[45; 72)
-                PATH_SEGMENT@[45; 72)
-                  NAME_REF@[45; 50)
-                    IDENT@[45; 50) "FnMut"
-                  PARAM_LIST@[50; 72)
-                    L_PAREN@[50; 51) "("
-                    ATTR@[51; 58)
-                      POUND@[51; 52) "#"
-                      TOKEN_TREE@[52; 58)
-                        L_BRACK@[52; 53) "["
-                        IDENT@[53; 57) "attr"
-                        R_BRACK@[57; 58) "]"
-                    WHITESPACE@[58; 59) " "
-                    PARAM@[59; 71)
-                      REFERENCE_TYPE@[59; 71)
-                        AMP@[59; 60) "&"
-                        MUT_KW@[60; 63) "mut"
-                        WHITESPACE@[63; 64) " "
-                        PATH_TYPE@[64; 71)
-                          PATH@[64; 71)
-                            PATH_SEGMENT@[64; 71)
-                              NAME_REF@[64; 67)
-                                IDENT@[64; 67) "Foo"
-                              TYPE_ARG_LIST@[67; 71)
-                                L_ANGLE@[67; 68) "<"
-                                LIFETIME_ARG@[68; 70)
-                                  LIFETIME@[68; 70) "\'a"
-                                R_ANGLE@[70; 71) ">"
-                    R_PAREN@[71; 72) ")"
-      R_ANGLE@[72; 73) ">"
-    PARAM_LIST@[73; 75)
-      L_PAREN@[73; 74) "("
-      R_PAREN@[74; 75) ")"
-    BLOCK@[75; 77)
-      L_CURLY@[75; 76) "{"
-      R_CURLY@[76; 77) "}"
-  WHITESPACE@[77; 78) "\n"
index 83d870ba747ff713a3819c036ef338e06de98ecf..9d55bedbba7477b4287ac8433e12f2067c95ef9c 100644 (file)
@@ -2,5 +2,3 @@ fn a() {}
 fn b(x: i32) {}
 fn c(x: i32, ) {}
 fn d(x: i32, y: ()) {}
-fn g1(#[attr1] #[attr2] pat: Type) {}
-fn g2(#[attr1] x: u8) {}
index a9c63fa932faf8b440bf3bf919e2ab4c502c36b0..80d636819637124bce5184f5263245ed834d64a6 100644 (file)
@@ -1,4 +1,4 @@
-SOURCE_FILE@[0; 130)
+SOURCE_FILE@[0; 67)
   FN_DEF@[0; 9)
     FN_KW@[0; 2) "fn"
     WHITESPACE@[2; 3) " "
@@ -97,72 +97,3 @@ SOURCE_FILE@[0; 130)
       L_CURLY@[64; 65) "{"
       R_CURLY@[65; 66) "}"
   WHITESPACE@[66; 67) "\n"
-  FN_DEF@[67; 104)
-    FN_KW@[67; 69) "fn"
-    WHITESPACE@[69; 70) " "
-    NAME@[70; 72)
-      IDENT@[70; 72) "g1"
-    PARAM_LIST@[72; 101)
-      L_PAREN@[72; 73) "("
-      ATTR@[73; 81)
-        POUND@[73; 74) "#"
-        TOKEN_TREE@[74; 81)
-          L_BRACK@[74; 75) "["
-          IDENT@[75; 80) "attr1"
-          R_BRACK@[80; 81) "]"
-      WHITESPACE@[81; 82) " "
-      ATTR@[82; 90)
-        POUND@[82; 83) "#"
-        TOKEN_TREE@[83; 90)
-          L_BRACK@[83; 84) "["
-          IDENT@[84; 89) "attr2"
-          R_BRACK@[89; 90) "]"
-      WHITESPACE@[90; 91) " "
-      PARAM@[91; 100)
-        BIND_PAT@[91; 94)
-          NAME@[91; 94)
-            IDENT@[91; 94) "pat"
-        COLON@[94; 95) ":"
-        WHITESPACE@[95; 96) " "
-        PATH_TYPE@[96; 100)
-          PATH@[96; 100)
-            PATH_SEGMENT@[96; 100)
-              NAME_REF@[96; 100)
-                IDENT@[96; 100) "Type"
-      R_PAREN@[100; 101) ")"
-    WHITESPACE@[101; 102) " "
-    BLOCK@[102; 104)
-      L_CURLY@[102; 103) "{"
-      R_CURLY@[103; 104) "}"
-  WHITESPACE@[104; 105) "\n"
-  FN_DEF@[105; 129)
-    FN_KW@[105; 107) "fn"
-    WHITESPACE@[107; 108) " "
-    NAME@[108; 110)
-      IDENT@[108; 110) "g2"
-    PARAM_LIST@[110; 126)
-      L_PAREN@[110; 111) "("
-      ATTR@[111; 119)
-        POUND@[111; 112) "#"
-        TOKEN_TREE@[112; 119)
-          L_BRACK@[112; 113) "["
-          IDENT@[113; 118) "attr1"
-          R_BRACK@[118; 119) "]"
-      WHITESPACE@[119; 120) " "
-      PARAM@[120; 125)
-        BIND_PAT@[120; 121)
-          NAME@[120; 121)
-            IDENT@[120; 121) "x"
-        COLON@[121; 122) ":"
-        WHITESPACE@[122; 123) " "
-        PATH_TYPE@[123; 125)
-          PATH@[123; 125)
-            PATH_SEGMENT@[123; 125)
-              NAME_REF@[123; 125)
-                IDENT@[123; 125) "u8"
-      R_PAREN@[125; 126) ")"
-    WHITESPACE@[126; 127) " "
-    BLOCK@[127; 129)
-      L_CURLY@[127; 128) "{"
-      R_CURLY@[128; 129) "}"
-  WHITESPACE@[129; 130) "\n"
index 90c4dcd2df41a533c3ba1457512e6f22c4afde68..472cb8803f907799865a0b9dd62f1ea15dbe513e 100644 (file)
@@ -1,4 +1,3 @@
 trait Foo {
     fn bar(_: u64, mut x: i32);
-    fn bar(#[attr] _: u64, #[attr] mut x: i32);
 }
index b5c6e0a2a34dcff4818938eb35dc267a4f35f24e..158236c5a93a57840f9832dde4de4a409b74b22d 100644 (file)
@@ -1,11 +1,11 @@
-SOURCE_FILE@[0; 94)
-  TRAIT_DEF@[0; 93)
+SOURCE_FILE@[0; 46)
+  TRAIT_DEF@[0; 45)
     TRAIT_KW@[0; 5) "trait"
     WHITESPACE@[5; 6) " "
     NAME@[6; 9)
       IDENT@[6; 9) "Foo"
     WHITESPACE@[9; 10) " "
-    ITEM_LIST@[10; 93)
+    ITEM_LIST@[10; 45)
       L_CURLY@[10; 11) "{"
       WHITESPACE@[11; 16) "\n    "
       FN_DEF@[16; 43)
@@ -42,55 +42,6 @@ SOURCE_FILE@[0; 94)
                     IDENT@[38; 41) "i32"
           R_PAREN@[41; 42) ")"
         SEMI@[42; 43) ";"
-      WHITESPACE@[43; 48) "\n    "
-      FN_DEF@[48; 91)
-        FN_KW@[48; 50) "fn"
-        WHITESPACE@[50; 51) " "
-        NAME@[51; 54)
-          IDENT@[51; 54) "bar"
-        PARAM_LIST@[54; 90)
-          L_PAREN@[54; 55) "("
-          ATTR@[55; 62)
-            POUND@[55; 56) "#"
-            TOKEN_TREE@[56; 62)
-              L_BRACK@[56; 57) "["
-              IDENT@[57; 61) "attr"
-              R_BRACK@[61; 62) "]"
-          WHITESPACE@[62; 63) " "
-          PARAM@[63; 69)
-            PLACEHOLDER_PAT@[63; 64)
-              UNDERSCORE@[63; 64) "_"
-            COLON@[64; 65) ":"
-            WHITESPACE@[65; 66) " "
-            PATH_TYPE@[66; 69)
-              PATH@[66; 69)
-                PATH_SEGMENT@[66; 69)
-                  NAME_REF@[66; 69)
-                    IDENT@[66; 69) "u64"
-          COMMA@[69; 70) ","
-          WHITESPACE@[70; 71) " "
-          ATTR@[71; 78)
-            POUND@[71; 72) "#"
-            TOKEN_TREE@[72; 78)
-              L_BRACK@[72; 73) "["
-              IDENT@[73; 77) "attr"
-              R_BRACK@[77; 78) "]"
-          WHITESPACE@[78; 79) " "
-          PARAM@[79; 89)
-            BIND_PAT@[79; 84)
-              MUT_KW@[79; 82) "mut"
-              WHITESPACE@[82; 83) " "
-              NAME@[83; 84)
-                IDENT@[83; 84) "x"
-            COLON@[84; 85) ":"
-            WHITESPACE@[85; 86) " "
-            PATH_TYPE@[86; 89)
-              PATH@[86; 89)
-                PATH_SEGMENT@[86; 89)
-                  NAME_REF@[86; 89)
-                    IDENT@[86; 89) "i32"
-          R_PAREN@[89; 90) ")"
-        SEMI@[90; 91) ";"
-      WHITESPACE@[91; 92) "\n"
-      R_CURLY@[92; 93) "}"
-  WHITESPACE@[93; 94) "\n"
+      WHITESPACE@[43; 44) "\n"
+      R_CURLY@[44; 45) "}"
+  WHITESPACE@[45; 46) "\n"
index 723d868ee87227c1262750cab90780b418988533..c59addaf4201c253b39014df6ae6721a75dc9e32 100644 (file)
@@ -1,2 +1 @@
 extern "C" { fn printf(format: *const i8, ...) -> i32; }
-extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; }
index 8a66727812d9c39dc9f93dd39322749d26a3a7e2..836e8e55b696df9934b3d19c3b0514a9fa9e4bb5 100644 (file)
@@ -1,4 +1,4 @@
-SOURCE_FILE@[0; 122)
+SOURCE_FILE@[0; 57)
   EXTERN_BLOCK@[0; 56)
     ABI@[0; 10)
       EXTERN_KW@[0; 6) "extern"
@@ -47,58 +47,3 @@ SOURCE_FILE@[0; 122)
       WHITESPACE@[54; 55) " "
       R_CURLY@[55; 56) "}"
   WHITESPACE@[56; 57) "\n"
-  EXTERN_BLOCK@[57; 121)
-    ABI@[57; 67)
-      EXTERN_KW@[57; 63) "extern"
-      WHITESPACE@[63; 64) " "
-      STRING@[64; 67) "\"C\""
-    WHITESPACE@[67; 68) " "
-    EXTERN_ITEM_LIST@[68; 121)
-      L_CURLY@[68; 69) "{"
-      WHITESPACE@[69; 70) " "
-      FN_DEF@[70; 119)
-        FN_KW@[70; 72) "fn"
-        WHITESPACE@[72; 73) " "
-        NAME@[73; 79)
-          IDENT@[73; 79) "printf"
-        PARAM_LIST@[79; 111)
-          L_PAREN@[79; 80) "("
-          PARAM@[80; 97)
-            BIND_PAT@[80; 86)
-              NAME@[80; 86)
-                IDENT@[80; 86) "format"
-            COLON@[86; 87) ":"
-            WHITESPACE@[87; 88) " "
-            POINTER_TYPE@[88; 97)
-              STAR@[88; 89) "*"
-              CONST_KW@[89; 94) "const"
-              WHITESPACE@[94; 95) " "
-              PATH_TYPE@[95; 97)
-                PATH@[95; 97)
-                  PATH_SEGMENT@[95; 97)
-                    NAME_REF@[95; 97)
-                      IDENT@[95; 97) "i8"
-          COMMA@[97; 98) ","
-          WHITESPACE@[98; 99) " "
-          ATTR@[99; 106)
-            POUND@[99; 100) "#"
-            TOKEN_TREE@[100; 106)
-              L_BRACK@[100; 101) "["
-              IDENT@[101; 105) "attr"
-              R_BRACK@[105; 106) "]"
-          WHITESPACE@[106; 107) " "
-          DOTDOTDOT@[107; 110) "..."
-          R_PAREN@[110; 111) ")"
-        WHITESPACE@[111; 112) " "
-        RET_TYPE@[112; 118)
-          THIN_ARROW@[112; 114) "->"
-          WHITESPACE@[114; 115) " "
-          PATH_TYPE@[115; 118)
-            PATH@[115; 118)
-              PATH_SEGMENT@[115; 118)
-                NAME_REF@[115; 118)
-                  IDENT@[115; 118) "i32"
-        SEMI@[118; 119) ";"
-      WHITESPACE@[119; 120) " "
-      R_CURLY@[120; 121) "}"
-  WHITESPACE@[121; 122) "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rs b/crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.rs
new file mode 100644 (file)
index 0000000..3515505
--- /dev/null
@@ -0,0 +1 @@
+fn f(#[must_use] self) {}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.txt b/crates/ra_syntax/test_data/parser/inline/ok/0138_self_param_outer_attr.txt
new file mode 100644 (file)
index 0000000..49b14e6
--- /dev/null
@@ -0,0 +1,23 @@
+SOURCE_FILE@[0; 26)
+  FN_DEF@[0; 25)
+    FN_KW@[0; 2) "fn"
+    WHITESPACE@[2; 3) " "
+    NAME@[3; 4)
+      IDENT@[3; 4) "f"
+    PARAM_LIST@[4; 22)
+      L_PAREN@[4; 5) "("
+      ATTR@[5; 16)
+        POUND@[5; 6) "#"
+        TOKEN_TREE@[6; 16)
+          L_BRACK@[6; 7) "["
+          IDENT@[7; 15) "must_use"
+          R_BRACK@[15; 16) "]"
+      WHITESPACE@[16; 17) " "
+      SELF_PARAM@[17; 21)
+        SELF_KW@[17; 21) "self"
+      R_PAREN@[21; 22) ")"
+    WHITESPACE@[22; 23) " "
+    BLOCK@[23; 25)
+      L_CURLY@[23; 24) "{"
+      R_CURLY@[24; 25) "}"
+  WHITESPACE@[25; 26) "\n"
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.rs b/crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.rs
new file mode 100644 (file)
index 0000000..c238be7
--- /dev/null
@@ -0,0 +1 @@
+fn f(#[attr1] pat: Type) {}
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.txt b/crates/ra_syntax/test_data/parser/inline/ok/0139_param_outer_arg.txt
new file mode 100644 (file)
index 0000000..91c5e5f
--- /dev/null
@@ -0,0 +1,32 @@
+SOURCE_FILE@[0; 28)
+  FN_DEF@[0; 27)
+    FN_KW@[0; 2) "fn"
+    WHITESPACE@[2; 3) " "
+    NAME@[3; 4)
+      IDENT@[3; 4) "f"
+    PARAM_LIST@[4; 24)
+      L_PAREN@[4; 5) "("
+      ATTR@[5; 13)
+        POUND@[5; 6) "#"
+        TOKEN_TREE@[6; 13)
+          L_BRACK@[6; 7) "["
+          IDENT@[7; 12) "attr1"
+          R_BRACK@[12; 13) "]"
+      WHITESPACE@[13; 14) " "
+      PARAM@[14; 23)
+        BIND_PAT@[14; 17)
+          NAME@[14; 17)
+            IDENT@[14; 17) "pat"
+        COLON@[17; 18) ":"
+        WHITESPACE@[18; 19) " "
+        PATH_TYPE@[19; 23)
+          PATH@[19; 23)
+            PATH_SEGMENT@[19; 23)
+              NAME_REF@[19; 23)
+                IDENT@[19; 23) "Type"
+      R_PAREN@[23; 24) ")"
+    WHITESPACE@[24; 25) " "
+    BLOCK@[25; 27)
+      L_CURLY@[25; 26) "{"
+      R_CURLY@[26; 27) "}"
+  WHITESPACE@[27; 28) "\n"
diff --git a/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rs b/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.rs
new file mode 100644 (file)
index 0000000..de350d8
--- /dev/null
@@ -0,0 +1,21 @@
+fn g1(#[attr1] #[attr2] pat: Type) {}
+fn g2(#[attr1] x: u8) {}
+
+extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; }
+
+fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}
+
+trait Foo {
+    fn bar(#[attr] _: u64, # [attr] mut x: i32);
+}
+
+impl S {
+     fn f(#[must_use] self) {}
+     fn g1(#[attr] self) {}
+     fn g2(#[attr] &self) {}
+     fn g3<'a>(#[attr] &mut self) {}
+     fn g4<'a>(#[attr] &'a self) {}
+     fn g5<'a>(#[attr] &'a mut self) {}
+     fn c(#[attr] self: Self) {}
+     fn d(#[attr] self: Rc<Self>) {}
+}
\ No newline at end of file
diff --git a/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.txt b/crates/ra_syntax/test_data/parser/ok/0051_parameter_attrs.txt
new file mode 100644 (file)
index 0000000..b360f29
--- /dev/null
@@ -0,0 +1,477 @@
+SOURCE_FILE@[0; 519)
+  FN_DEF@[0; 37)
+    FN_KW@[0; 2) "fn"
+    WHITESPACE@[2; 3) " "
+    NAME@[3; 5)
+      IDENT@[3; 5) "g1"
+    PARAM_LIST@[5; 34)
+      L_PAREN@[5; 6) "("
+      ATTR@[6; 14)
+        POUND@[6; 7) "#"
+        TOKEN_TREE@[7; 14)
+          L_BRACK@[7; 8) "["
+          IDENT@[8; 13) "attr1"
+          R_BRACK@[13; 14) "]"
+      WHITESPACE@[14; 15) " "
+      ATTR@[15; 23)
+        POUND@[15; 16) "#"
+        TOKEN_TREE@[16; 23)
+          L_BRACK@[16; 17) "["
+          IDENT@[17; 22) "attr2"
+          R_BRACK@[22; 23) "]"
+      WHITESPACE@[23; 24) " "
+      PARAM@[24; 33)
+        BIND_PAT@[24; 27)
+          NAME@[24; 27)
+            IDENT@[24; 27) "pat"
+        COLON@[27; 28) ":"
+        WHITESPACE@[28; 29) " "
+        PATH_TYPE@[29; 33)
+          PATH@[29; 33)
+            PATH_SEGMENT@[29; 33)
+              NAME_REF@[29; 33)
+                IDENT@[29; 33) "Type"
+      R_PAREN@[33; 34) ")"
+    WHITESPACE@[34; 35) " "
+    BLOCK@[35; 37)
+      L_CURLY@[35; 36) "{"
+      R_CURLY@[36; 37) "}"
+  WHITESPACE@[37; 38) "\n"
+  FN_DEF@[38; 62)
+    FN_KW@[38; 40) "fn"
+    WHITESPACE@[40; 41) " "
+    NAME@[41; 43)
+      IDENT@[41; 43) "g2"
+    PARAM_LIST@[43; 59)
+      L_PAREN@[43; 44) "("
+      ATTR@[44; 52)
+        POUND@[44; 45) "#"
+        TOKEN_TREE@[45; 52)
+          L_BRACK@[45; 46) "["
+          IDENT@[46; 51) "attr1"
+          R_BRACK@[51; 52) "]"
+      WHITESPACE@[52; 53) " "
+      PARAM@[53; 58)
+        BIND_PAT@[53; 54)
+          NAME@[53; 54)
+            IDENT@[53; 54) "x"
+        COLON@[54; 55) ":"
+        WHITESPACE@[55; 56) " "
+        PATH_TYPE@[56; 58)
+          PATH@[56; 58)
+            PATH_SEGMENT@[56; 58)
+              NAME_REF@[56; 58)
+                IDENT@[56; 58) "u8"
+      R_PAREN@[58; 59) ")"
+    WHITESPACE@[59; 60) " "
+    BLOCK@[60; 62)
+      L_CURLY@[60; 61) "{"
+      R_CURLY@[61; 62) "}"
+  WHITESPACE@[62; 64) "\n\n"
+  EXTERN_BLOCK@[64; 128)
+    ABI@[64; 74)
+      EXTERN_KW@[64; 70) "extern"
+      WHITESPACE@[70; 71) " "
+      STRING@[71; 74) "\"C\""
+    WHITESPACE@[74; 75) " "
+    EXTERN_ITEM_LIST@[75; 128)
+      L_CURLY@[75; 76) "{"
+      WHITESPACE@[76; 77) " "
+      FN_DEF@[77; 126)
+        FN_KW@[77; 79) "fn"
+        WHITESPACE@[79; 80) " "
+        NAME@[80; 86)
+          IDENT@[80; 86) "printf"
+        PARAM_LIST@[86; 118)
+          L_PAREN@[86; 87) "("
+          PARAM@[87; 104)
+            BIND_PAT@[87; 93)
+              NAME@[87; 93)
+                IDENT@[87; 93) "format"
+            COLON@[93; 94) ":"
+            WHITESPACE@[94; 95) " "
+            POINTER_TYPE@[95; 104)
+              STAR@[95; 96) "*"
+              CONST_KW@[96; 101) "const"
+              WHITESPACE@[101; 102) " "
+              PATH_TYPE@[102; 104)
+                PATH@[102; 104)
+                  PATH_SEGMENT@[102; 104)
+                    NAME_REF@[102; 104)
+                      IDENT@[102; 104) "i8"
+          COMMA@[104; 105) ","
+          WHITESPACE@[105; 106) " "
+          ATTR@[106; 113)
+            POUND@[106; 107) "#"
+            TOKEN_TREE@[107; 113)
+              L_BRACK@[107; 108) "["
+              IDENT@[108; 112) "attr"
+              R_BRACK@[112; 113) "]"
+          WHITESPACE@[113; 114) " "
+          DOTDOTDOT@[114; 117) "..."
+          R_PAREN@[117; 118) ")"
+        WHITESPACE@[118; 119) " "
+        RET_TYPE@[119; 125)
+          THIN_ARROW@[119; 121) "->"
+          WHITESPACE@[121; 122) " "
+          PATH_TYPE@[122; 125)
+            PATH@[122; 125)
+              PATH_SEGMENT@[122; 125)
+                NAME_REF@[122; 125)
+                  IDENT@[122; 125) "i32"
+        SEMI@[125; 126) ";"
+      WHITESPACE@[126; 127) " "
+      R_CURLY@[127; 128) "}"
+  WHITESPACE@[128; 130) "\n\n"
+  FN_DEF@[130; 172)
+    FN_KW@[130; 132) "fn"
+    WHITESPACE@[132; 133) " "
+    NAME@[133; 136)
+      IDENT@[133; 136) "foo"
+    TYPE_PARAM_LIST@[136; 168)
+      L_ANGLE@[136; 137) "<"
+      TYPE_PARAM@[137; 167)
+        NAME@[137; 138)
+          IDENT@[137; 138) "F"
+        COLON@[138; 139) ":"
+        WHITESPACE@[139; 140) " "
+        TYPE_BOUND_LIST@[140; 167)
+          TYPE_BOUND@[140; 167)
+            PATH_TYPE@[140; 167)
+              PATH@[140; 167)
+                PATH_SEGMENT@[140; 167)
+                  NAME_REF@[140; 145)
+                    IDENT@[140; 145) "FnMut"
+                  PARAM_LIST@[145; 167)
+                    L_PAREN@[145; 146) "("
+                    ATTR@[146; 153)
+                      POUND@[146; 147) "#"
+                      TOKEN_TREE@[147; 153)
+                        L_BRACK@[147; 148) "["
+                        IDENT@[148; 152) "attr"
+                        R_BRACK@[152; 153) "]"
+                    WHITESPACE@[153; 154) " "
+                    PARAM@[154; 166)
+                      REFERENCE_TYPE@[154; 166)
+                        AMP@[154; 155) "&"
+                        MUT_KW@[155; 158) "mut"
+                        WHITESPACE@[158; 159) " "
+                        PATH_TYPE@[159; 166)
+                          PATH@[159; 166)
+                            PATH_SEGMENT@[159; 166)
+                              NAME_REF@[159; 162)
+                                IDENT@[159; 162) "Foo"
+                              TYPE_ARG_LIST@[162; 166)
+                                L_ANGLE@[162; 163) "<"
+                                LIFETIME_ARG@[163; 165)
+                                  LIFETIME@[163; 165) "\'a"
+                                R_ANGLE@[165; 166) ">"
+                    R_PAREN@[166; 167) ")"
+      R_ANGLE@[167; 168) ">"
+    PARAM_LIST@[168; 170)
+      L_PAREN@[168; 169) "("
+      R_PAREN@[169; 170) ")"
+    BLOCK@[170; 172)
+      L_CURLY@[170; 171) "{"
+      R_CURLY@[171; 172) "}"
+  WHITESPACE@[172; 174) "\n\n"
+  TRAIT_DEF@[174; 236)
+    TRAIT_KW@[174; 179) "trait"
+    WHITESPACE@[179; 180) " "
+    NAME@[180; 183)
+      IDENT@[180; 183) "Foo"
+    WHITESPACE@[183; 184) " "
+    ITEM_LIST@[184; 236)
+      L_CURLY@[184; 185) "{"
+      WHITESPACE@[185; 190) "\n    "
+      FN_DEF@[190; 234)
+        FN_KW@[190; 192) "fn"
+        WHITESPACE@[192; 193) " "
+        NAME@[193; 196)
+          IDENT@[193; 196) "bar"
+        PARAM_LIST@[196; 233)
+          L_PAREN@[196; 197) "("
+          ATTR@[197; 204)
+            POUND@[197; 198) "#"
+            TOKEN_TREE@[198; 204)
+              L_BRACK@[198; 199) "["
+              IDENT@[199; 203) "attr"
+              R_BRACK@[203; 204) "]"
+          WHITESPACE@[204; 205) " "
+          PARAM@[205; 211)
+            PLACEHOLDER_PAT@[205; 206)
+              UNDERSCORE@[205; 206) "_"
+            COLON@[206; 207) ":"
+            WHITESPACE@[207; 208) " "
+            PATH_TYPE@[208; 211)
+              PATH@[208; 211)
+                PATH_SEGMENT@[208; 211)
+                  NAME_REF@[208; 211)
+                    IDENT@[208; 211) "u64"
+          COMMA@[211; 212) ","
+          WHITESPACE@[212; 213) " "
+          ATTR@[213; 221)
+            POUND@[213; 214) "#"
+            WHITESPACE@[214; 215) " "
+            TOKEN_TREE@[215; 221)
+              L_BRACK@[215; 216) "["
+              IDENT@[216; 220) "attr"
+              R_BRACK@[220; 221) "]"
+          WHITESPACE@[221; 222) " "
+          PARAM@[222; 232)
+            BIND_PAT@[222; 227)
+              MUT_KW@[222; 225) "mut"
+              WHITESPACE@[225; 226) " "
+              NAME@[226; 227)
+                IDENT@[226; 227) "x"
+            COLON@[227; 228) ":"
+            WHITESPACE@[228; 229) " "
+            PATH_TYPE@[229; 232)
+              PATH@[229; 232)
+                PATH_SEGMENT@[229; 232)
+                  NAME_REF@[229; 232)
+                    IDENT@[229; 232) "i32"
+          R_PAREN@[232; 233) ")"
+        SEMI@[233; 234) ";"
+      WHITESPACE@[234; 235) "\n"
+      R_CURLY@[235; 236) "}"
+  WHITESPACE@[236; 238) "\n\n"
+  IMPL_BLOCK@[238; 519)
+    IMPL_KW@[238; 242) "impl"
+    WHITESPACE@[242; 243) " "
+    PATH_TYPE@[243; 244)
+      PATH@[243; 244)
+        PATH_SEGMENT@[243; 244)
+          NAME_REF@[243; 244)
+            IDENT@[243; 244) "S"
+    WHITESPACE@[244; 245) " "
+    ITEM_LIST@[245; 519)
+      L_CURLY@[245; 246) "{"
+      WHITESPACE@[246; 252) "\n     "
+      FN_DEF@[252; 277)
+        FN_KW@[252; 254) "fn"
+        WHITESPACE@[254; 255) " "
+        NAME@[255; 256)
+          IDENT@[255; 256) "f"
+        PARAM_LIST@[256; 274)
+          L_PAREN@[256; 257) "("
+          ATTR@[257; 268)
+            POUND@[257; 258) "#"
+            TOKEN_TREE@[258; 268)
+              L_BRACK@[258; 259) "["
+              IDENT@[259; 267) "must_use"
+              R_BRACK@[267; 268) "]"
+          WHITESPACE@[268; 269) " "
+          SELF_PARAM@[269; 273)
+            SELF_KW@[269; 273) "self"
+          R_PAREN@[273; 274) ")"
+        WHITESPACE@[274; 275) " "
+        BLOCK@[275; 277)
+          L_CURLY@[275; 276) "{"
+          R_CURLY@[276; 277) "}"
+      WHITESPACE@[277; 283) "\n     "
+      FN_DEF@[283; 305)
+        FN_KW@[283; 285) "fn"
+        WHITESPACE@[285; 286) " "
+        NAME@[286; 288)
+          IDENT@[286; 288) "g1"
+        PARAM_LIST@[288; 302)
+          L_PAREN@[288; 289) "("
+          ATTR@[289; 296)
+            POUND@[289; 290) "#"
+            TOKEN_TREE@[290; 296)
+              L_BRACK@[290; 291) "["
+              IDENT@[291; 295) "attr"
+              R_BRACK@[295; 296) "]"
+          WHITESPACE@[296; 297) " "
+          SELF_PARAM@[297; 301)
+            SELF_KW@[297; 301) "self"
+          R_PAREN@[301; 302) ")"
+        WHITESPACE@[302; 303) " "
+        BLOCK@[303; 305)
+          L_CURLY@[303; 304) "{"
+          R_CURLY@[304; 305) "}"
+      WHITESPACE@[305; 311) "\n     "
+      FN_DEF@[311; 334)
+        FN_KW@[311; 313) "fn"
+        WHITESPACE@[313; 314) " "
+        NAME@[314; 316)
+          IDENT@[314; 316) "g2"
+        PARAM_LIST@[316; 331)
+          L_PAREN@[316; 317) "("
+          ATTR@[317; 324)
+            POUND@[317; 318) "#"
+            TOKEN_TREE@[318; 324)
+              L_BRACK@[318; 319) "["
+              IDENT@[319; 323) "attr"
+              R_BRACK@[323; 324) "]"
+          WHITESPACE@[324; 325) " "
+          SELF_PARAM@[325; 330)
+            AMP@[325; 326) "&"
+            SELF_KW@[326; 330) "self"
+          R_PAREN@[330; 331) ")"
+        WHITESPACE@[331; 332) " "
+        BLOCK@[332; 334)
+          L_CURLY@[332; 333) "{"
+          R_CURLY@[333; 334) "}"
+      WHITESPACE@[334; 340) "\n     "
+      FN_DEF@[340; 371)
+        FN_KW@[340; 342) "fn"
+        WHITESPACE@[342; 343) " "
+        NAME@[343; 345)
+          IDENT@[343; 345) "g3"
+        TYPE_PARAM_LIST@[345; 349)
+          L_ANGLE@[345; 346) "<"
+          LIFETIME_PARAM@[346; 348)
+            LIFETIME@[346; 348) "\'a"
+          R_ANGLE@[348; 349) ">"
+        PARAM_LIST@[349; 368)
+          L_PAREN@[349; 350) "("
+          ATTR@[350; 357)
+            POUND@[350; 351) "#"
+            TOKEN_TREE@[351; 357)
+              L_BRACK@[351; 352) "["
+              IDENT@[352; 356) "attr"
+              R_BRACK@[356; 357) "]"
+          WHITESPACE@[357; 358) " "
+          SELF_PARAM@[358; 367)
+            AMP@[358; 359) "&"
+            MUT_KW@[359; 362) "mut"
+            WHITESPACE@[362; 363) " "
+            SELF_KW@[363; 367) "self"
+          R_PAREN@[367; 368) ")"
+        WHITESPACE@[368; 369) " "
+        BLOCK@[369; 371)
+          L_CURLY@[369; 370) "{"
+          R_CURLY@[370; 371) "}"
+      WHITESPACE@[371; 377) "\n     "
+      FN_DEF@[377; 407)
+        FN_KW@[377; 379) "fn"
+        WHITESPACE@[379; 380) " "
+        NAME@[380; 382)
+          IDENT@[380; 382) "g4"
+        TYPE_PARAM_LIST@[382; 386)
+          L_ANGLE@[382; 383) "<"
+          LIFETIME_PARAM@[383; 385)
+            LIFETIME@[383; 385) "\'a"
+          R_ANGLE@[385; 386) ">"
+        PARAM_LIST@[386; 404)
+          L_PAREN@[386; 387) "("
+          ATTR@[387; 394)
+            POUND@[387; 388) "#"
+            TOKEN_TREE@[388; 394)
+              L_BRACK@[388; 389) "["
+              IDENT@[389; 393) "attr"
+              R_BRACK@[393; 394) "]"
+          WHITESPACE@[394; 395) " "
+          SELF_PARAM@[395; 403)
+            AMP@[395; 396) "&"
+            LIFETIME@[396; 398) "\'a"
+            WHITESPACE@[398; 399) " "
+            SELF_KW@[399; 403) "self"
+          R_PAREN@[403; 404) ")"
+        WHITESPACE@[404; 405) " "
+        BLOCK@[405; 407)
+          L_CURLY@[405; 406) "{"
+          R_CURLY@[406; 407) "}"
+      WHITESPACE@[407; 413) "\n     "
+      FN_DEF@[413; 447)
+        FN_KW@[413; 415) "fn"
+        WHITESPACE@[415; 416) " "
+        NAME@[416; 418)
+          IDENT@[416; 418) "g5"
+        TYPE_PARAM_LIST@[418; 422)
+          L_ANGLE@[418; 419) "<"
+          LIFETIME_PARAM@[419; 421)
+            LIFETIME@[419; 421) "\'a"
+          R_ANGLE@[421; 422) ">"
+        PARAM_LIST@[422; 444)
+          L_PAREN@[422; 423) "("
+          ATTR@[423; 430)
+            POUND@[423; 424) "#"
+            TOKEN_TREE@[424; 430)
+              L_BRACK@[424; 425) "["
+              IDENT@[425; 429) "attr"
+              R_BRACK@[429; 430) "]"
+          WHITESPACE@[430; 431) " "
+          SELF_PARAM@[431; 443)
+            AMP@[431; 432) "&"
+            LIFETIME@[432; 434) "\'a"
+            WHITESPACE@[434; 435) " "
+            MUT_KW@[435; 438) "mut"
+            WHITESPACE@[438; 439) " "
+            SELF_KW@[439; 443) "self"
+          R_PAREN@[443; 444) ")"
+        WHITESPACE@[444; 445) " "
+        BLOCK@[445; 447)
+          L_CURLY@[445; 446) "{"
+          R_CURLY@[446; 447) "}"
+      WHITESPACE@[447; 453) "\n     "
+      FN_DEF@[453; 480)
+        FN_KW@[453; 455) "fn"
+        WHITESPACE@[455; 456) " "
+        NAME@[456; 457)
+          IDENT@[456; 457) "c"
+        PARAM_LIST@[457; 477)
+          L_PAREN@[457; 458) "("
+          ATTR@[458; 465)
+            POUND@[458; 459) "#"
+            TOKEN_TREE@[459; 465)
+              L_BRACK@[459; 460) "["
+              IDENT@[460; 464) "attr"
+              R_BRACK@[464; 465) "]"
+          WHITESPACE@[465; 466) " "
+          SELF_PARAM@[466; 476)
+            SELF_KW@[466; 470) "self"
+            COLON@[470; 471) ":"
+            WHITESPACE@[471; 472) " "
+            PATH_TYPE@[472; 476)
+              PATH@[472; 476)
+                PATH_SEGMENT@[472; 476)
+                  NAME_REF@[472; 476)
+                    IDENT@[472; 476) "Self"
+          R_PAREN@[476; 477) ")"
+        WHITESPACE@[477; 478) " "
+        BLOCK@[478; 480)
+          L_CURLY@[478; 479) "{"
+          R_CURLY@[479; 480) "}"
+      WHITESPACE@[480; 486) "\n     "
+      FN_DEF@[486; 517)
+        FN_KW@[486; 488) "fn"
+        WHITESPACE@[488; 489) " "
+        NAME@[489; 490)
+          IDENT@[489; 490) "d"
+        PARAM_LIST@[490; 514)
+          L_PAREN@[490; 491) "("
+          ATTR@[491; 498)
+            POUND@[491; 492) "#"
+            TOKEN_TREE@[492; 498)
+              L_BRACK@[492; 493) "["
+              IDENT@[493; 497) "attr"
+              R_BRACK@[497; 498) "]"
+          WHITESPACE@[498; 499) " "
+          SELF_PARAM@[499; 513)
+            SELF_KW@[499; 503) "self"
+            COLON@[503; 504) ":"
+            WHITESPACE@[504; 505) " "
+            PATH_TYPE@[505; 513)
+              PATH@[505; 513)
+                PATH_SEGMENT@[505; 513)
+                  NAME_REF@[505; 507)
+                    IDENT@[505; 507) "Rc"
+                  TYPE_ARG_LIST@[507; 513)
+                    L_ANGLE@[507; 508) "<"
+                    TYPE_ARG@[508; 512)
+                      PATH_TYPE@[508; 512)
+                        PATH@[508; 512)
+                          PATH_SEGMENT@[508; 512)
+                            NAME_REF@[508; 512)
+                              IDENT@[508; 512) "Self"
+                    R_ANGLE@[512; 513) ">"
+          R_PAREN@[513; 514) ")"
+        WHITESPACE@[514; 515) " "
+        BLOCK@[515; 517)
+          L_CURLY@[515; 516) "{"
+          R_CURLY@[516; 517) "}"
+      WHITESPACE@[517; 518) "\n"
+      R_CURLY@[518; 519) "}"