Correctly parse attributes on fn parameters
This commit is contained in:
parent
0a64713845
commit
022a0f061e
@ -41,22 +41,32 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
||||
FnDef | FnTrait | FnPointer => (T!['('], T![')']),
|
||||
};
|
||||
|
||||
let m = p.start();
|
||||
let list_marker = p.start();
|
||||
p.bump(bra);
|
||||
|
||||
let mut param_marker = None;
|
||||
if let FnDef = flavor {
|
||||
// test self_param_outer_attr
|
||||
// fn f(#[must_use] self) {}
|
||||
let m = p.start();
|
||||
attributes::outer_attrs(p);
|
||||
opt_self_param(p, m);
|
||||
match opt_self_param(p, m) {
|
||||
Ok(()) => {}
|
||||
Err(m) => param_marker = Some(m),
|
||||
}
|
||||
}
|
||||
|
||||
while !p.at(EOF) && !p.at(ket) {
|
||||
// test param_outer_arg
|
||||
// fn f(#[attr1] pat: Type) {}
|
||||
let m = p.start();
|
||||
attributes::outer_attrs(p);
|
||||
let m = match param_marker.take() {
|
||||
Some(m) => m,
|
||||
None => {
|
||||
let m = p.start();
|
||||
attributes::outer_attrs(p);
|
||||
m
|
||||
}
|
||||
};
|
||||
|
||||
if !p.at_ts(PARAM_FIRST) {
|
||||
p.error("expected value parameter");
|
||||
@ -72,8 +82,12 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(m) = param_marker {
|
||||
m.abandon(p);
|
||||
}
|
||||
|
||||
p.expect(ket);
|
||||
m.complete(p, PARAM_LIST);
|
||||
list_marker.complete(p, PARAM_LIST);
|
||||
}
|
||||
|
||||
const PARAM_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST);
|
||||
@ -153,7 +167,7 @@ fn variadic_param(p: &mut Parser) -> bool {
|
||||
// fn d(&'a mut self, x: i32) {}
|
||||
// fn e(mut self) {}
|
||||
// }
|
||||
fn opt_self_param(p: &mut Parser, m: Marker) {
|
||||
fn opt_self_param(p: &mut Parser, m: Marker) -> Result<(), Marker> {
|
||||
if p.at(T![self]) || p.at(T![mut]) && p.nth(1) == T![self] {
|
||||
p.eat(T![mut]);
|
||||
self_as_name(p);
|
||||
@ -176,7 +190,7 @@ fn opt_self_param(p: &mut Parser, m: Marker) {
|
||||
| (T![&], LIFETIME_IDENT, T![self], _)
|
||||
| (T![&], LIFETIME_IDENT, T![mut], T![self])
|
||||
) {
|
||||
return m.abandon(p);
|
||||
return Err(m);
|
||||
}
|
||||
p.bump(T![&]);
|
||||
if p.at(LIFETIME_IDENT) {
|
||||
@ -189,6 +203,7 @@ fn opt_self_param(p: &mut Parser, m: Marker) {
|
||||
if !p.at(T![')']) {
|
||||
p.expect(T![,]);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn self_as_name(p: &mut Parser) {
|
||||
|
@ -6,16 +6,16 @@ SOURCE_FILE@0..28
|
||||
IDENT@3..4 "f"
|
||||
PARAM_LIST@4..24
|
||||
L_PAREN@4..5 "("
|
||||
ATTR@5..13
|
||||
POUND@5..6 "#"
|
||||
L_BRACK@6..7 "["
|
||||
PATH@7..12
|
||||
PATH_SEGMENT@7..12
|
||||
NAME_REF@7..12
|
||||
IDENT@7..12 "attr1"
|
||||
R_BRACK@12..13 "]"
|
||||
WHITESPACE@13..14 " "
|
||||
PARAM@14..23
|
||||
PARAM@5..23
|
||||
ATTR@5..13
|
||||
POUND@5..6 "#"
|
||||
L_BRACK@6..7 "["
|
||||
PATH@7..12
|
||||
PATH_SEGMENT@7..12
|
||||
NAME_REF@7..12
|
||||
IDENT@7..12 "attr1"
|
||||
R_BRACK@12..13 "]"
|
||||
WHITESPACE@13..14 " "
|
||||
IDENT_PAT@14..17
|
||||
NAME@14..17
|
||||
IDENT@14..17 "pat"
|
||||
|
@ -6,25 +6,25 @@ SOURCE_FILE@0..519
|
||||
IDENT@3..5 "g1"
|
||||
PARAM_LIST@5..34
|
||||
L_PAREN@5..6 "("
|
||||
ATTR@6..14
|
||||
POUND@6..7 "#"
|
||||
L_BRACK@7..8 "["
|
||||
PATH@8..13
|
||||
PATH_SEGMENT@8..13
|
||||
NAME_REF@8..13
|
||||
IDENT@8..13 "attr1"
|
||||
R_BRACK@13..14 "]"
|
||||
WHITESPACE@14..15 " "
|
||||
ATTR@15..23
|
||||
POUND@15..16 "#"
|
||||
L_BRACK@16..17 "["
|
||||
PATH@17..22
|
||||
PATH_SEGMENT@17..22
|
||||
NAME_REF@17..22
|
||||
IDENT@17..22 "attr2"
|
||||
R_BRACK@22..23 "]"
|
||||
WHITESPACE@23..24 " "
|
||||
PARAM@24..33
|
||||
PARAM@6..33
|
||||
ATTR@6..14
|
||||
POUND@6..7 "#"
|
||||
L_BRACK@7..8 "["
|
||||
PATH@8..13
|
||||
PATH_SEGMENT@8..13
|
||||
NAME_REF@8..13
|
||||
IDENT@8..13 "attr1"
|
||||
R_BRACK@13..14 "]"
|
||||
WHITESPACE@14..15 " "
|
||||
ATTR@15..23
|
||||
POUND@15..16 "#"
|
||||
L_BRACK@16..17 "["
|
||||
PATH@17..22
|
||||
PATH_SEGMENT@17..22
|
||||
NAME_REF@17..22
|
||||
IDENT@17..22 "attr2"
|
||||
R_BRACK@22..23 "]"
|
||||
WHITESPACE@23..24 " "
|
||||
IDENT_PAT@24..27
|
||||
NAME@24..27
|
||||
IDENT@24..27 "pat"
|
||||
@ -48,16 +48,16 @@ SOURCE_FILE@0..519
|
||||
IDENT@41..43 "g2"
|
||||
PARAM_LIST@43..59
|
||||
L_PAREN@43..44 "("
|
||||
ATTR@44..52
|
||||
POUND@44..45 "#"
|
||||
L_BRACK@45..46 "["
|
||||
PATH@46..51
|
||||
PATH_SEGMENT@46..51
|
||||
NAME_REF@46..51
|
||||
IDENT@46..51 "attr1"
|
||||
R_BRACK@51..52 "]"
|
||||
WHITESPACE@52..53 " "
|
||||
PARAM@53..58
|
||||
PARAM@44..58
|
||||
ATTR@44..52
|
||||
POUND@44..45 "#"
|
||||
L_BRACK@45..46 "["
|
||||
PATH@46..51
|
||||
PATH_SEGMENT@46..51
|
||||
NAME_REF@46..51
|
||||
IDENT@46..51 "attr1"
|
||||
R_BRACK@51..52 "]"
|
||||
WHITESPACE@52..53 " "
|
||||
IDENT_PAT@53..54
|
||||
NAME@53..54
|
||||
IDENT@53..54 "x"
|
||||
@ -203,16 +203,16 @@ SOURCE_FILE@0..519
|
||||
IDENT@193..196 "bar"
|
||||
PARAM_LIST@196..233
|
||||
L_PAREN@196..197 "("
|
||||
ATTR@197..204
|
||||
POUND@197..198 "#"
|
||||
L_BRACK@198..199 "["
|
||||
PATH@199..203
|
||||
PATH_SEGMENT@199..203
|
||||
NAME_REF@199..203
|
||||
IDENT@199..203 "attr"
|
||||
R_BRACK@203..204 "]"
|
||||
WHITESPACE@204..205 " "
|
||||
PARAM@205..211
|
||||
PARAM@197..211
|
||||
ATTR@197..204
|
||||
POUND@197..198 "#"
|
||||
L_BRACK@198..199 "["
|
||||
PATH@199..203
|
||||
PATH_SEGMENT@199..203
|
||||
NAME_REF@199..203
|
||||
IDENT@199..203 "attr"
|
||||
R_BRACK@203..204 "]"
|
||||
WHITESPACE@204..205 " "
|
||||
WILDCARD_PAT@205..206
|
||||
UNDERSCORE@205..206 "_"
|
||||
COLON@206..207 ":"
|
||||
|
Loading…
x
Reference in New Issue
Block a user