Skip to content

Commit 8760890

Browse files
bors[bot]eupn
andcommitted
Merge #1661
1661: Parse function parameters attributes r=matklad a=eupn Fixes #1397. The [RFC-2565](https://github.com/rust-lang/rfcs/blob/master/text/2565-formal-function-parameter-attributes.md) specifies `#[attributes]` to function parameters: ```rust fn foo(#[attr] a, #[unused] b, #[must_use] ...) { // ... } ``` This PR adds those attributes into grammar and to the parser, extending corresponding inline tests. Co-authored-by: Evgenii P <[email protected]>
2 parents de4523f + 6fa2d82 commit 8760890

9 files changed

+571
-1
lines changed

crates/ra_parser/src/grammar/params.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,20 @@ fn list_(p: &mut Parser, flavor: Flavor) {
4141
let m = p.start();
4242
p.bump();
4343
if flavor.type_required() {
44+
// test self_param_outer_attr
45+
// fn f(#[must_use] self) {}
46+
attributes::outer_attributes(p);
4447
opt_self_param(p);
4548
}
46-
while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) {
49+
while !p.at(EOF) && !p.at(ket) {
50+
// test param_outer_arg
51+
// fn f(#[attr1] pat: Type) {}
52+
attributes::outer_attributes(p);
53+
54+
if flavor.type_required() && p.at(T![...]) {
55+
break;
56+
}
57+
4758
if !p.at_ts(VALUE_PARAMETER_FIRST) {
4859
p.error("expected value parameter");
4960
break;

crates/ra_syntax/src/ast/generated.rs

+2
Original file line numberDiff line numberDiff line change
@@ -2013,6 +2013,7 @@ impl AstNode for Param {
20132013

20142014

20152015
impl ast::TypeAscriptionOwner for Param {}
2016+
impl ast::AttrsOwner for Param {}
20162017
impl Param {
20172018
pub fn pat(&self) -> Option<Pat> {
20182019
super::child_opt(self)
@@ -2667,6 +2668,7 @@ impl AstNode for SelfParam {
26672668

26682669

26692670
impl ast::TypeAscriptionOwner for SelfParam {}
2671+
impl ast::AttrsOwner for SelfParam {}
26702672
impl SelfParam {}
26712673

26722674
// SlicePat

crates/ra_syntax/src/grammar.ron

+2
Original file line numberDiff line numberDiff line change
@@ -642,12 +642,14 @@ Grammar(
642642
"SelfParam": (
643643
traits: [
644644
"TypeAscriptionOwner",
645+
"AttrsOwner",
645646
]
646647
),
647648
"Param": (
648649
options: [ "Pat" ],
649650
traits: [
650651
"TypeAscriptionOwner",
652+
"AttrsOwner",
651653
]
652654
),
653655
"UseItem": (
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn f(#[must_use] self) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
SOURCE_FILE@[0; 26)
2+
FN_DEF@[0; 25)
3+
FN_KW@[0; 2) "fn"
4+
WHITESPACE@[2; 3) " "
5+
NAME@[3; 4)
6+
IDENT@[3; 4) "f"
7+
PARAM_LIST@[4; 22)
8+
L_PAREN@[4; 5) "("
9+
ATTR@[5; 16)
10+
POUND@[5; 6) "#"
11+
TOKEN_TREE@[6; 16)
12+
L_BRACK@[6; 7) "["
13+
IDENT@[7; 15) "must_use"
14+
R_BRACK@[15; 16) "]"
15+
WHITESPACE@[16; 17) " "
16+
SELF_PARAM@[17; 21)
17+
SELF_KW@[17; 21) "self"
18+
R_PAREN@[21; 22) ")"
19+
WHITESPACE@[22; 23) " "
20+
BLOCK@[23; 25)
21+
L_CURLY@[23; 24) "{"
22+
R_CURLY@[24; 25) "}"
23+
WHITESPACE@[25; 26) "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
fn f(#[attr1] pat: Type) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
SOURCE_FILE@[0; 28)
2+
FN_DEF@[0; 27)
3+
FN_KW@[0; 2) "fn"
4+
WHITESPACE@[2; 3) " "
5+
NAME@[3; 4)
6+
IDENT@[3; 4) "f"
7+
PARAM_LIST@[4; 24)
8+
L_PAREN@[4; 5) "("
9+
ATTR@[5; 13)
10+
POUND@[5; 6) "#"
11+
TOKEN_TREE@[6; 13)
12+
L_BRACK@[6; 7) "["
13+
IDENT@[7; 12) "attr1"
14+
R_BRACK@[12; 13) "]"
15+
WHITESPACE@[13; 14) " "
16+
PARAM@[14; 23)
17+
BIND_PAT@[14; 17)
18+
NAME@[14; 17)
19+
IDENT@[14; 17) "pat"
20+
COLON@[17; 18) ":"
21+
WHITESPACE@[18; 19) " "
22+
PATH_TYPE@[19; 23)
23+
PATH@[19; 23)
24+
PATH_SEGMENT@[19; 23)
25+
NAME_REF@[19; 23)
26+
IDENT@[19; 23) "Type"
27+
R_PAREN@[23; 24) ")"
28+
WHITESPACE@[24; 25) " "
29+
BLOCK@[25; 27)
30+
L_CURLY@[25; 26) "{"
31+
R_CURLY@[26; 27) "}"
32+
WHITESPACE@[27; 28) "\n"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
fn g1(#[attr1] #[attr2] pat: Type) {}
2+
fn g2(#[attr1] x: u8) {}
3+
4+
extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; }
5+
6+
fn foo<F: FnMut(#[attr] &mut Foo<'a>)>(){}
7+
8+
trait Foo {
9+
fn bar(#[attr] _: u64, # [attr] mut x: i32);
10+
}
11+
12+
impl S {
13+
fn f(#[must_use] self) {}
14+
fn g1(#[attr] self) {}
15+
fn g2(#[attr] &self) {}
16+
fn g3<'a>(#[attr] &mut self) {}
17+
fn g4<'a>(#[attr] &'a self) {}
18+
fn g5<'a>(#[attr] &'a mut self) {}
19+
fn c(#[attr] self: Self) {}
20+
fn d(#[attr] self: Rc<Self>) {}
21+
}

0 commit comments

Comments
 (0)