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 // test impl_item_neg
// impl !Send for X {} // impl !Send for X {}
if p.at(IMPL_KW) {
p.error("expected type");
} else {
p.eat(EXCL); p.eat(EXCL);
if p.at(IMPL_KW) { impl_type(p);
p.error("expected type");
} else {
types::type_(p);
}
}
if p.eat(FOR_KW) { if p.eat(FOR_KW) {
types::type_(p); 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(1) == LIFETIME || p.nth(1) == IDENT)
&& (p.nth(2) == R_ANGLE || p.nth(2) == COMMA || p.nth(2) == COLON || p.nth(2) == EQ) && (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: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_ITEM@[0; 14)
IMPL_KW@[0; 4) IMPL_KW@[0; 4)
TYPE_PARAM_LIST@[4; 14) TYPE_PARAM_LIST@[4; 14)
@ -14,53 +14,35 @@ ROOT@[0; 54)
NAME_REF@[8; 13) NAME_REF@[8; 13)
IDENT@[8; 13) "Clone" IDENT@[8; 13) "Clone"
R_ANGLE@[13; 14) R_ANGLE@[13; 14)
err: `expected type` err: `expected trait or type`
err: `expected `{`` err: `expected `{``
WHITESPACE@[14; 15) WHITESPACE@[14; 15)
IMPL_ITEM@[15; 30) IMPL_ITEM@[15; 38)
IMPL_KW@[15; 19) IMPL_KW@[15; 19)
TYPE_PARAM_LIST@[19; 28) TYPE_PARAM_LIST@[19; 22)
L_ANGLE@[19; 20) L_ANGLE@[19; 20)
TYPE_PARAM@[20; 27) TYPE_PARAM@[20; 21)
NAME@[20; 21) NAME@[20; 21)
IDENT@[20; 21) "T" IDENT@[20; 21) "T"
COLON@[21; 22) R_ANGLE@[21; 22)
PATH_TYPE@[22; 27) WHITESPACE@[22; 23)
PATH@[22; 27) PATH_TYPE@[23; 34)
PATH_SEGMENT@[22; 27) PATH@[23; 34)
NAME_REF@[22; 27) PATH_SEGMENT@[23; 34)
IDENT@[22; 27) "Clone" NAME_REF@[23; 31)
R_ANGLE@[27; 28) IDENT@[23; 31) "OnceCell"
WHITESPACE@[28; 29) TYPE_ARG_LIST@[31; 34)
EXCL@[29; 30) L_ANGLE@[31; 32)
err: `expected type` TYPE_ARG@[32; 33)
err: `expected `{`` PATH_TYPE@[32; 33)
IMPL_ITEM@[30; 53) PATH@[32; 33)
IMPL_KW@[30; 34) PATH_SEGMENT@[32; 33)
TYPE_PARAM_LIST@[34; 37) NAME_REF@[32; 33)
L_ANGLE@[34; 35) IDENT@[32; 33) "T"
TYPE_PARAM@[35; 36) R_ANGLE@[33; 34)
NAME@[35; 36) WHITESPACE@[34; 35)
IDENT@[35; 36) "T" ITEM_LIST@[35; 38)
R_ANGLE@[36; 37) L_CURLY@[35; 36)
WHITESPACE@[37; 38) WHITESPACE@[36; 37)
PATH_TYPE@[38; 49) R_CURLY@[37; 38)
PATH@[38; 49) WHITESPACE@[38; 39)
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)