From 3fb58c620ccf93487cc3b9b8718002481826b4c2 Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Wed, 7 Aug 2019 23:42:28 +0700 Subject: Add function parameters attributes --- crates/ra_parser/src/grammar/params.rs | 16 ++ crates/ra_syntax/src/ast/generated.rs | 2 + crates/ra_syntax/src/grammar.ron | 2 + .../test_data/parser/inline/ok/0006_self_param.rs | 6 + .../test_data/parser/inline/ok/0006_self_param.txt | 171 ++++++++++++++++++++- .../parser/inline/ok/0018_arb_self_types.rs | 2 + .../parser/inline/ok/0018_arb_self_types.txt | 79 +++++++++- .../inline/ok/0045_param_list_opt_patterns.rs | 1 + .../inline/ok/0045_param_list_opt_patterns.txt | 54 ++++++- .../test_data/parser/inline/ok/0099_param_list.rs | 2 + .../test_data/parser/inline/ok/0099_param_list.txt | 71 ++++++++- .../ok/0116_trait_fn_placeholder_parameter.rs | 1 + .../ok/0116_trait_fn_placeholder_parameter.txt | 61 +++++++- .../parser/inline/ok/0123_param_list_vararg.rs | 1 + .../parser/inline/ok/0123_param_list_vararg.txt | 57 ++++++- 15 files changed, 505 insertions(+), 21 deletions(-) diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index 723b56343..fce9dd218 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -5,12 +5,15 @@ use super::*; // 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)>(){} +// fn foo)>(){} pub(super) fn param_list_opt_patterns(p: &mut Parser) { list_(p, Flavor::OptionalPattern) } @@ -41,9 +44,12 @@ fn list_(p: &mut Parser, flavor: Flavor) { let m = p.start(); p.bump(); if flavor.type_required() { + attributes::outer_attributes(p); opt_self_param(p); } while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) { + attributes::outer_attributes(p); + if !p.at_ts(VALUE_PARAMETER_FIRST) { p.error("expected value parameter"); break; @@ -55,6 +61,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { } // test param_list_vararg // extern "C" { fn printf(format: *const i8, ...) -> i32; } + // extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; } if flavor.type_required() { p.eat(T![...]); } @@ -84,6 +91,7 @@ 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![:] @@ -107,6 +115,12 @@ 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; @@ -118,6 +132,8 @@ fn opt_self_param(p: &mut Parser) { // impl S { // fn a(self: &Self) {} // fn b(mut self: Box) {} + // fn c(#[attr] self: Self) {} + // fn d(#[attr] self: Rc) {} // } if p.at(T![:]) { types::ascription(p); diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index da8cf4ae8..f322e1d84 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs @@ -2013,6 +2013,7 @@ impl AstNode for Param { impl ast::TypeAscriptionOwner for Param {} +impl ast::AttrsOwner for Param {} impl Param { pub fn pat(&self) -> Option { super::child_opt(self) @@ -2667,6 +2668,7 @@ impl AstNode for SelfParam { impl ast::TypeAscriptionOwner for SelfParam {} +impl ast::AttrsOwner for SelfParam {} impl SelfParam {} // SlicePat diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 817dedfbf..f2c20573e 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron @@ -642,12 +642,14 @@ Grammar( "SelfParam": ( traits: [ "TypeAscriptionOwner", + "AttrsOwner", ] ), "Param": ( options: [ "Pat" ], traits: [ "TypeAscriptionOwner", + "AttrsOwner", ] ), "UseItem": ( diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rs b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rs index 80c0a43f5..7811f52c0 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.rs @@ -4,4 +4,10 @@ impl S { 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) {} } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.txt b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.txt index 8e210a6ca..5c75b6c75 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0006_self_param.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 128) - IMPL_BLOCK@[0; 127) +SOURCE_FILE@[0; 323) + IMPL_BLOCK@[0; 322) IMPL_KW@[0; 4) "impl" WHITESPACE@[4; 5) " " PATH_TYPE@[5; 6) @@ -8,7 +8,7 @@ SOURCE_FILE@[0; 128) NAME_REF@[5; 6) IDENT@[5; 6) "S" WHITESPACE@[6; 7) " " - ITEM_LIST@[7; 127) + ITEM_LIST@[7; 322) L_CURLY@[7; 8) "{" WHITESPACE@[8; 13) "\n " FN_DEF@[13; 26) @@ -111,6 +111,165 @@ SOURCE_FILE@[0; 128) BLOCK@[123; 125) L_CURLY@[123; 124) "{" R_CURLY@[124; 125) "}" - WHITESPACE@[125; 126) "\n" - R_CURLY@[126; 127) "}" - WHITESPACE@[127; 128) "\n" + 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" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rs b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rs index 6a170d5ac..077216dae 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.rs @@ -1,4 +1,6 @@ impl S { fn a(self: &Self) {} fn b(mut self: Box) {} + fn c(#[attr] self: Self) {} + fn d(#[attr] self: Rc) {} } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.txt b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.txt index 67d0de0f0..ca49bcc26 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0018_arb_self_types.txt @@ -1,5 +1,5 @@ -SOURCE_FILE@[0; 69) - IMPL_BLOCK@[0; 68) +SOURCE_FILE@[0; 137) + IMPL_BLOCK@[0; 136) IMPL_KW@[0; 4) "impl" WHITESPACE@[4; 5) " " PATH_TYPE@[5; 6) @@ -8,7 +8,7 @@ SOURCE_FILE@[0; 69) NAME_REF@[5; 6) IDENT@[5; 6) "S" WHITESPACE@[6; 7) " " - ITEM_LIST@[7; 68) + ITEM_LIST@[7; 136) L_CURLY@[7; 8) "{" WHITESPACE@[8; 13) "\n " FN_DEF@[13; 33) @@ -67,6 +67,73 @@ SOURCE_FILE@[0; 69) BLOCK@[64; 66) L_CURLY@[64; 65) "{" R_CURLY@[65; 66) "}" - WHITESPACE@[66; 67) "\n" - R_CURLY@[67; 68) "}" - WHITESPACE@[68; 69) "\n" + 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" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rs b/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rs index 9b93442c0..9833dd8f1 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.rs @@ -1 +1,2 @@ fn foo)>(){} +fn foo)>(){} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.txt b/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.txt index f85d6a4bc..0b377dfd4 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0045_param_list_opt_patterns.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 35) +SOURCE_FILE@[0; 78) FN_DEF@[0; 34) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " @@ -44,3 +44,55 @@ SOURCE_FILE@[0; 35) 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" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.rs b/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.rs index 9d55bedbb..83d870ba7 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.rs @@ -2,3 +2,5 @@ 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) {} diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.txt b/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.txt index 80d636819..a9c63fa93 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0099_param_list.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 67) +SOURCE_FILE@[0; 130) FN_DEF@[0; 9) FN_KW@[0; 2) "fn" WHITESPACE@[2; 3) " " @@ -97,3 +97,72 @@ SOURCE_FILE@[0; 67) 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" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.rs b/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.rs index 472cb8803..90c4dcd2d 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.rs @@ -1,3 +1,4 @@ trait Foo { fn bar(_: u64, mut x: i32); + fn bar(#[attr] _: u64, #[attr] mut x: i32); } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.txt b/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.txt index 158236c5a..b5c6e0a2a 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0116_trait_fn_placeholder_parameter.txt @@ -1,11 +1,11 @@ -SOURCE_FILE@[0; 46) - TRAIT_DEF@[0; 45) +SOURCE_FILE@[0; 94) + TRAIT_DEF@[0; 93) TRAIT_KW@[0; 5) "trait" WHITESPACE@[5; 6) " " NAME@[6; 9) IDENT@[6; 9) "Foo" WHITESPACE@[9; 10) " " - ITEM_LIST@[10; 45) + ITEM_LIST@[10; 93) L_CURLY@[10; 11) "{" WHITESPACE@[11; 16) "\n " FN_DEF@[16; 43) @@ -42,6 +42,55 @@ SOURCE_FILE@[0; 46) IDENT@[38; 41) "i32" R_PAREN@[41; 42) ")" SEMI@[42; 43) ";" - WHITESPACE@[43; 44) "\n" - R_CURLY@[44; 45) "}" - WHITESPACE@[45; 46) "\n" + 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" diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.rs b/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.rs index c59addaf4..8583ede05 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.rs +++ b/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.rs @@ -1 +1,2 @@ extern "C" { fn printf(format: *const i8, ...) -> i32; } +extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; } diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.txt b/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.txt index 836e8e55b..164ead2d8 100644 --- a/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.txt +++ b/crates/ra_syntax/test_data/parser/inline/ok/0123_param_list_vararg.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 57) +SOURCE_FILE@[0; 122) EXTERN_BLOCK@[0; 56) ABI@[0; 10) EXTERN_KW@[0; 6) "extern" @@ -47,3 +47,58 @@ SOURCE_FILE@[0; 57) 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) "(" + ATTR@[80; 87) + POUND@[80; 81) "#" + TOKEN_TREE@[81; 87) + L_BRACK@[81; 82) "[" + IDENT@[82; 86) "attr" + R_BRACK@[86; 87) "]" + WHITESPACE@[87; 88) " " + PARAM@[88; 105) + BIND_PAT@[88; 94) + NAME@[88; 94) + IDENT@[88; 94) "format" + COLON@[94; 95) ":" + WHITESPACE@[95; 96) " " + POINTER_TYPE@[96; 105) + STAR@[96; 97) "*" + CONST_KW@[97; 102) "const" + WHITESPACE@[102; 103) " " + PATH_TYPE@[103; 105) + PATH@[103; 105) + PATH_SEGMENT@[103; 105) + NAME_REF@[103; 105) + IDENT@[103; 105) "i8" + COMMA@[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" -- cgit v1.2.3