mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-26 20:09:19 +00:00
Merge #6965
6965: Properly attach attributes to Param instead of parent ParamList r=matklad a=Veykril Fixes #2783, fixes #2781 The problem with `let _a = [0,#[cfg(feature = "L")]0];` has already been fixed some time ago it seems: <details> <summary>Syntax Tree for the const item</summary> ``` LET_STMT@200..236 LET_KW@200..203 "let" WHITESPACE@203..204 " " IDENT_PAT@204..206 NAME@204..206 IDENT@204..206 "_a" WHITESPACE@206..207 " " EQ@207..208 "=" WHITESPACE@208..209 " " ARRAY_EXPR@209..235 L_BRACK@209..210 "[" LITERAL@210..211 INT_NUMBER@210..211 "0" COMMA@211..212 "," LITERAL@212..234 ATTR@212..233 POUND@212..213 "#" L_BRACK@213..214 "[" PATH@214..217 PATH_SEGMENT@214..217 NAME_REF@214..217 IDENT@214..217 "cfg" TOKEN_TREE@217..232 L_PAREN@217..218 "(" IDENT@218..225 "feature" WHITESPACE@225..226 " " EQ@226..227 "=" WHITESPACE@227..228 " " STRING@228..231 "\"L\"" R_PAREN@231..232 ")" R_BRACK@232..233 "]" INT_NUMBER@233..234 "0" R_BRACK@234..235 "]" SEMICOLON@235..236 ";" ``` </details> Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
9bb9fbab3a
7 changed files with 199 additions and 147 deletions
|
@ -156,11 +156,13 @@ fn tuple_expr(p: &mut Parser) -> CompletedMarker {
|
|||
let mut saw_expr = false;
|
||||
while !p.at(EOF) && !p.at(T![')']) {
|
||||
saw_expr = true;
|
||||
if !p.at_ts(EXPR_FIRST) {
|
||||
p.error("expected expression");
|
||||
|
||||
// test tuple_attrs
|
||||
// const A: (i64, i64) = (1, #[cfg(test)] 2);
|
||||
if !expr_with_attrs(p) {
|
||||
break;
|
||||
}
|
||||
expr(p);
|
||||
|
||||
if !p.at(T![')']) {
|
||||
saw_comma = true;
|
||||
p.expect(T![,]);
|
||||
|
|
|
@ -47,20 +47,23 @@ fn list_(p: &mut Parser, flavor: Flavor) {
|
|||
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);
|
||||
opt_self_param(p, 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);
|
||||
|
||||
if !p.at_ts(PARAM_FIRST) {
|
||||
p.error("expected value parameter");
|
||||
m.abandon(p);
|
||||
break;
|
||||
}
|
||||
let param = param(p, flavor);
|
||||
let param = param(p, m, flavor);
|
||||
if !p.at(ket) {
|
||||
p.expect(T![,]);
|
||||
}
|
||||
|
@ -77,9 +80,8 @@ const PARAM_FIRST: TokenSet = patterns::PATTERN_FIRST.union(types::TYPE_FIRST);
|
|||
|
||||
struct Variadic(bool);
|
||||
|
||||
fn param(p: &mut Parser, flavor: Flavor) -> Variadic {
|
||||
fn param(p: &mut Parser, m: Marker, flavor: Flavor) -> Variadic {
|
||||
let mut res = Variadic(false);
|
||||
let m = p.start();
|
||||
match flavor {
|
||||
// test param_list_vararg
|
||||
// extern "C" { fn printf(format: *const i8, ...) -> i32; }
|
||||
|
@ -151,10 +153,8 @@ 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) {
|
||||
let m;
|
||||
fn opt_self_param(p: &mut Parser, m: Marker) {
|
||||
if p.at(T![self]) || p.at(T![mut]) && p.nth(1) == T![self] {
|
||||
m = p.start();
|
||||
p.eat(T![mut]);
|
||||
p.eat(T![self]);
|
||||
// test arb_self_types
|
||||
|
@ -174,9 +174,8 @@ fn opt_self_param(p: &mut Parser) {
|
|||
(T![&], T![mut], T![self], _) => 3,
|
||||
(T![&], LIFETIME_IDENT, T![self], _) => 3,
|
||||
(T![&], LIFETIME_IDENT, T![mut], T![self]) => 4,
|
||||
_ => return,
|
||||
_ => return m.abandon(p),
|
||||
};
|
||||
m = p.start();
|
||||
p.bump_any();
|
||||
if p.at(LIFETIME_IDENT) {
|
||||
lifetime(p);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue