1415: fix: specialization r=matklad a=csmoe

Closes #1402 
r? @matklad 

Co-authored-by: csmoe <csmoe@msn.com>
This commit is contained in:
bors[bot] 2019-06-24 10:10:05 +00:00
commit 67ecc88f66
5 changed files with 149 additions and 1 deletions

View File

@ -103,7 +103,21 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
p.bump_remap(T![auto]);
has_mods = true;
}
if p.at(IDENT) && p.at_contextual_kw("default") && p.nth(1) == T![impl] {
if p.at(IDENT)
&& p.at_contextual_kw("default")
&& (match p.nth(1) {
T![impl] => true,
T![fn] | T![type] => {
if let ItemFlavor::Mod = flavor {
true
} else {
false
}
}
_ => false,
})
{
p.bump_remap(T![default]);
has_mods = true;
}
@ -163,12 +177,25 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
// test default_impl
// default impl Foo {}
// test_err default_fn_type
// trait T {
// default type T = Bar;
// default fn foo() {}
// }
// test default_fn_type
// impl T for Foo {
// default type T = Bar;
// default fn foo() {}
// }
// test unsafe_default_impl
// unsafe default impl Foo {}
T![impl] => {
traits::impl_block(p);
m.complete(p, IMPL_BLOCK);
}
// test existential_type
// existential type Foo: Fn() -> usize;
T![type] => {

View File

@ -0,0 +1,4 @@
trait T {
default type T = Bar;
default fn foo() {}
}

View File

@ -0,0 +1,58 @@
SOURCE_FILE@[0; 62)
TRAIT_DEF@[0; 61)
TRAIT_KW@[0; 5) "trait"
WHITESPACE@[5; 6) " "
NAME@[6; 7)
IDENT@[6; 7) "T"
WHITESPACE@[7; 8) " "
ITEM_LIST@[8; 61)
L_CURLY@[8; 9) "{"
WHITESPACE@[9; 14) "\n "
MACRO_CALL@[14; 21)
PATH@[14; 21)
PATH_SEGMENT@[14; 21)
NAME_REF@[14; 21)
IDENT@[14; 21) "default"
WHITESPACE@[21; 22) " "
TYPE_ALIAS_DEF@[22; 35)
TYPE_KW@[22; 26) "type"
WHITESPACE@[26; 27) " "
NAME@[27; 28)
IDENT@[27; 28) "T"
WHITESPACE@[28; 29) " "
EQ@[29; 30) "="
WHITESPACE@[30; 31) " "
PATH_TYPE@[31; 34)
PATH@[31; 34)
PATH_SEGMENT@[31; 34)
NAME_REF@[31; 34)
IDENT@[31; 34) "Bar"
SEMI@[34; 35) ";"
WHITESPACE@[35; 40) "\n "
MACRO_CALL@[40; 47)
PATH@[40; 47)
PATH_SEGMENT@[40; 47)
NAME_REF@[40; 47)
IDENT@[40; 47) "default"
WHITESPACE@[47; 48) " "
FN_DEF@[48; 59)
FN_KW@[48; 50) "fn"
WHITESPACE@[50; 51) " "
NAME@[51; 54)
IDENT@[51; 54) "foo"
PARAM_LIST@[54; 56)
L_PAREN@[54; 55) "("
R_PAREN@[55; 56) ")"
WHITESPACE@[56; 57) " "
BLOCK@[57; 59)
L_CURLY@[57; 58) "{"
R_CURLY@[58; 59) "}"
WHITESPACE@[59; 60) "\n"
R_CURLY@[60; 61) "}"
WHITESPACE@[61; 62) "\n"
error 21: expected EXCL
error 21: expected `{`, `[`, `(`
error 21: expected SEMI
error 47: expected EXCL
error 47: expected `{`, `[`, `(`
error 47: expected SEMI

View File

@ -0,0 +1,4 @@
impl T for Foo {
default type T = Bar;
default fn foo() {}
}

View File

@ -0,0 +1,55 @@
SOURCE_FILE@[0; 69)
IMPL_BLOCK@[0; 68)
IMPL_KW@[0; 4) "impl"
WHITESPACE@[4; 5) " "
PATH_TYPE@[5; 6)
PATH@[5; 6)
PATH_SEGMENT@[5; 6)
NAME_REF@[5; 6)
IDENT@[5; 6) "T"
WHITESPACE@[6; 7) " "
FOR_KW@[7; 10) "for"
WHITESPACE@[10; 11) " "
PATH_TYPE@[11; 14)
PATH@[11; 14)
PATH_SEGMENT@[11; 14)
NAME_REF@[11; 14)
IDENT@[11; 14) "Foo"
WHITESPACE@[14; 15) " "
ITEM_LIST@[15; 68)
L_CURLY@[15; 16) "{"
WHITESPACE@[16; 21) "\n "
TYPE_ALIAS_DEF@[21; 42)
DEFAULT_KW@[21; 28) "default"
WHITESPACE@[28; 29) " "
TYPE_KW@[29; 33) "type"
WHITESPACE@[33; 34) " "
NAME@[34; 35)
IDENT@[34; 35) "T"
WHITESPACE@[35; 36) " "
EQ@[36; 37) "="
WHITESPACE@[37; 38) " "
PATH_TYPE@[38; 41)
PATH@[38; 41)
PATH_SEGMENT@[38; 41)
NAME_REF@[38; 41)
IDENT@[38; 41) "Bar"
SEMI@[41; 42) ";"
WHITESPACE@[42; 47) "\n "
FN_DEF@[47; 66)
DEFAULT_KW@[47; 54) "default"
WHITESPACE@[54; 55) " "
FN_KW@[55; 57) "fn"
WHITESPACE@[57; 58) " "
NAME@[58; 61)
IDENT@[58; 61) "foo"
PARAM_LIST@[61; 63)
L_PAREN@[61; 62) "("
R_PAREN@[62; 63) ")"
WHITESPACE@[63; 64) " "
BLOCK@[64; 66)
L_CURLY@[64; 65) "{"
R_CURLY@[65; 66) "}"
WHITESPACE@[66; 67) "\n"
R_CURLY@[67; 68) "}"
WHITESPACE@[68; 69) "\n"