mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
fix: specialization(with blindly parsing)
Change-Id: Ic5d2767e8781568d76d4d0013cd6081e95ae8a95
This commit is contained in:
parent
f7da575a98
commit
d04473accb
5 changed files with 149 additions and 1 deletions
|
@ -103,7 +103,21 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
|
||||||
p.bump_remap(T![auto]);
|
p.bump_remap(T![auto]);
|
||||||
has_mods = true;
|
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]);
|
p.bump_remap(T![default]);
|
||||||
has_mods = true;
|
has_mods = true;
|
||||||
}
|
}
|
||||||
|
@ -163,12 +177,25 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
|
||||||
// test default_impl
|
// test default_impl
|
||||||
// default impl Foo {}
|
// 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
|
// test unsafe_default_impl
|
||||||
// unsafe default impl Foo {}
|
// unsafe default impl Foo {}
|
||||||
T![impl] => {
|
T![impl] => {
|
||||||
traits::impl_block(p);
|
traits::impl_block(p);
|
||||||
m.complete(p, IMPL_BLOCK);
|
m.complete(p, IMPL_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
// test existential_type
|
// test existential_type
|
||||||
// existential type Foo: Fn() -> usize;
|
// existential type Foo: Fn() -> usize;
|
||||||
T![type] => {
|
T![type] => {
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
trait T {
|
||||||
|
default type T = Bar;
|
||||||
|
default fn foo() {}
|
||||||
|
}
|
|
@ -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
|
|
@ -0,0 +1,4 @@
|
||||||
|
impl T for Foo {
|
||||||
|
default type T = Bar;
|
||||||
|
default fn foo() {}
|
||||||
|
}
|
|
@ -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"
|
Loading…
Add table
Add a link
Reference in a new issue