Enable parsing attributes for generic lifetimes and type parameters

This commit is contained in:
Ville Penttinen 2019-02-17 22:19:21 +02:00
parent a725dd4f7a
commit 58d14bcaf7
5 changed files with 85 additions and 9 deletions

View file

@ -1716,6 +1716,7 @@ impl ToOwned for LifetimeParam {
}
impl ast::AttrsOwner for LifetimeParam {}
impl LifetimeParam {
pub fn lifetime(&self) -> Option<&Lifetime> {
super::child_opt(self)
@ -4076,6 +4077,7 @@ impl ToOwned for TypeParam {
impl ast::NameOwner for TypeParam {}
impl ast::AttrsOwner for TypeParam {}
impl TypeParam {}
// TypeParamList

View file

@ -559,8 +559,11 @@ Grammar(
["lifetime_params", "LifetimeParam" ],
]
),
"TypeParam": ( traits: ["NameOwner"] ),
"LifetimeParam": ( options: [ "Lifetime" ] ),
"TypeParam": ( traits: ["NameOwner", "AttrsOwner"] ),
"LifetimeParam": (
options: [ "Lifetime"],
traits: ["AttrsOwner"],
),
"Lifetime": ( traits: ["AstToken"] ),
"WhereClause": (),
"ExprStmt": (

View file

@ -13,10 +13,20 @@ fn type_param_list(p: &mut Parser) {
p.bump();
while !p.at(EOF) && !p.at(R_ANGLE) {
let m = p.start();
// test generic_lifetime_type_attribute
// fn foo<#[derive(Lifetime)] 'a, #[derive(Type)] T>(_: &'a T) {
// }
attributes::outer_attributes(p);
match p.current() {
LIFETIME => lifetime_param(p),
IDENT => type_param(p),
_ => p.err_and_bump("expected type parameter"),
LIFETIME => lifetime_param(p, m),
IDENT => type_param(p, m),
_ => {
m.abandon(p);
p.err_and_bump("expected type parameter")
}
}
if !p.at(R_ANGLE) && !p.expect(COMMA) {
break;
@ -26,9 +36,8 @@ fn type_param_list(p: &mut Parser) {
m.complete(p, TYPE_PARAM_LIST);
}
fn lifetime_param(p: &mut Parser) {
fn lifetime_param(p: &mut Parser, m: Marker) {
assert!(p.at(LIFETIME));
let m = p.start();
p.bump();
if p.at(COLON) {
lifetime_bounds(p);
@ -36,9 +45,8 @@ fn lifetime_param(p: &mut Parser) {
m.complete(p, LIFETIME_PARAM);
}
fn type_param(p: &mut Parser) {
fn type_param(p: &mut Parser, m: Marker) {
assert!(p.at(IDENT));
let m = p.start();
name(p);
if p.at(COLON) {
bounds(p);

View file

@ -0,0 +1,2 @@
fn foo<#[derive(Lifetime)] 'a, #[derive(Type)] T>(_: &'a T) {
}

View file

@ -0,0 +1,61 @@
SOURCE_FILE@[0; 64)
FN_DEF@[0; 63)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
TYPE_PARAM_LIST@[6; 49)
L_ANGLE@[6; 7)
LIFETIME_PARAM@[7; 29)
ATTR@[7; 26)
POUND@[7; 8)
TOKEN_TREE@[8; 26)
L_BRACK@[8; 9)
IDENT@[9; 15) "derive"
TOKEN_TREE@[15; 25)
L_PAREN@[15; 16)
IDENT@[16; 24) "Lifetime"
R_PAREN@[24; 25)
R_BRACK@[25; 26)
WHITESPACE@[26; 27)
LIFETIME@[27; 29) "'a"
COMMA@[29; 30)
WHITESPACE@[30; 31)
TYPE_PARAM@[31; 48)
ATTR@[31; 46)
POUND@[31; 32)
TOKEN_TREE@[32; 46)
L_BRACK@[32; 33)
IDENT@[33; 39) "derive"
TOKEN_TREE@[39; 45)
L_PAREN@[39; 40)
IDENT@[40; 44) "Type"
R_PAREN@[44; 45)
R_BRACK@[45; 46)
WHITESPACE@[46; 47)
NAME@[47; 48)
IDENT@[47; 48) "T"
R_ANGLE@[48; 49)
PARAM_LIST@[49; 59)
L_PAREN@[49; 50)
PARAM@[50; 58)
PLACEHOLDER_PAT@[50; 51)
UNDERSCORE@[50; 51)
COLON@[51; 52)
WHITESPACE@[52; 53)
REFERENCE_TYPE@[53; 58)
AMP@[53; 54)
LIFETIME@[54; 56) "'a"
WHITESPACE@[56; 57)
PATH_TYPE@[57; 58)
PATH@[57; 58)
PATH_SEGMENT@[57; 58)
NAME_REF@[57; 58)
IDENT@[57; 58) "T"
R_PAREN@[58; 59)
WHITESPACE@[59; 60)
BLOCK@[60; 63)
L_CURLY@[60; 61)
WHITESPACE@[61; 62)
R_CURLY@[62; 63)
WHITESPACE@[63; 64)