parse impl type

This commit is contained in:
csmoe 2018-09-25 22:00:43 +08:00
parent cacb32d88a
commit edf1cc3582
3 changed files with 44 additions and 57 deletions

View File

@ -54,16 +54,8 @@ pub(super) fn impl_item(p: &mut Parser) {
// test impl_item_neg
// impl !Send for X {}
if p.at(IMPL_KW) {
p.error("expected type");
} else {
p.eat(EXCL);
if p.at(IMPL_KW) {
p.error("expected type");
} else {
types::type_(p);
}
}
impl_type(p);
if p.eat(FOR_KW) {
types::type_(p);
}
@ -123,3 +115,17 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
(p.nth(1) == LIFETIME || p.nth(1) == IDENT)
&& (p.nth(2) == R_ANGLE || p.nth(2) == COMMA || p.nth(2) == COLON || p.nth(2) == EQ)
}
// impl Type {}
// ^^^^
// impl Trait for T {}
// ^^^^^
pub(crate) fn impl_type(p: &mut Parser) {
if p.at(IMPL_KW) {
p.error("expected trait or type");
return;
}
types::type_(p);
}

View File

@ -1,4 +1,3 @@
impl<T: Clone>
impl<T:Clone>
!impl<T> OnceCell<T> {
impl<T> OnceCell<T> {
}

View File

@ -1,4 +1,4 @@
ROOT@[0; 54)
ROOT@[0; 39)
IMPL_ITEM@[0; 14)
IMPL_KW@[0; 4)
TYPE_PARAM_LIST@[4; 14)
@ -14,53 +14,35 @@ ROOT@[0; 54)
NAME_REF@[8; 13)
IDENT@[8; 13) "Clone"
R_ANGLE@[13; 14)
err: `expected type`
err: `expected trait or type`
err: `expected `{``
WHITESPACE@[14; 15)
IMPL_ITEM@[15; 30)
IMPL_ITEM@[15; 38)
IMPL_KW@[15; 19)
TYPE_PARAM_LIST@[19; 28)
TYPE_PARAM_LIST@[19; 22)
L_ANGLE@[19; 20)
TYPE_PARAM@[20; 27)
TYPE_PARAM@[20; 21)
NAME@[20; 21)
IDENT@[20; 21) "T"
COLON@[21; 22)
PATH_TYPE@[22; 27)
PATH@[22; 27)
PATH_SEGMENT@[22; 27)
NAME_REF@[22; 27)
IDENT@[22; 27) "Clone"
R_ANGLE@[27; 28)
WHITESPACE@[28; 29)
EXCL@[29; 30)
err: `expected type`
err: `expected `{``
IMPL_ITEM@[30; 53)
IMPL_KW@[30; 34)
TYPE_PARAM_LIST@[34; 37)
L_ANGLE@[34; 35)
TYPE_PARAM@[35; 36)
NAME@[35; 36)
IDENT@[35; 36) "T"
R_ANGLE@[36; 37)
WHITESPACE@[37; 38)
PATH_TYPE@[38; 49)
PATH@[38; 49)
PATH_SEGMENT@[38; 49)
NAME_REF@[38; 46)
IDENT@[38; 46) "OnceCell"
TYPE_ARG_LIST@[46; 49)
L_ANGLE@[46; 47)
TYPE_ARG@[47; 48)
PATH_TYPE@[47; 48)
PATH@[47; 48)
PATH_SEGMENT@[47; 48)
NAME_REF@[47; 48)
IDENT@[47; 48) "T"
R_ANGLE@[48; 49)
WHITESPACE@[49; 50)
ITEM_LIST@[50; 53)
L_CURLY@[50; 51)
WHITESPACE@[51; 52)
R_CURLY@[52; 53)
WHITESPACE@[53; 54)
R_ANGLE@[21; 22)
WHITESPACE@[22; 23)
PATH_TYPE@[23; 34)
PATH@[23; 34)
PATH_SEGMENT@[23; 34)
NAME_REF@[23; 31)
IDENT@[23; 31) "OnceCell"
TYPE_ARG_LIST@[31; 34)
L_ANGLE@[31; 32)
TYPE_ARG@[32; 33)
PATH_TYPE@[32; 33)
PATH@[32; 33)
PATH_SEGMENT@[32; 33)
NAME_REF@[32; 33)
IDENT@[32; 33) "T"
R_ANGLE@[33; 34)
WHITESPACE@[34; 35)
ITEM_LIST@[35; 38)
L_CURLY@[35; 36)
WHITESPACE@[36; 37)
R_CURLY@[37; 38)
WHITESPACE@[38; 39)