Enable parsing attributes for generic lifetimes and type parameters
This commit is contained in:
parent
a725dd4f7a
commit
58d14bcaf7
5 changed files with 85 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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": (
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
fn foo<#[derive(Lifetime)] 'a, #[derive(Type)] T>(_: &'a T) {
|
||||
}
|
|
@ -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)
|
Loading…
Add table
Reference in a new issue