diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index e85147e9e28..424d0476d28 100644 --- a/crates/ra_parser/src/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs @@ -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] => { diff --git a/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.rs b/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.rs new file mode 100644 index 00000000000..15ba8f4a85e --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.rs @@ -0,0 +1,4 @@ +trait T { + default type T = Bar; + default fn foo() {} +} diff --git a/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.txt b/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.txt new file mode 100644 index 00000000000..7da4e243ff5 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/err/0014_default_fn_type.txt @@ -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 diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.rs new file mode 100644 index 00000000000..8f5d6111399 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.rs @@ -0,0 +1,4 @@ +impl T for Foo { + default type T = Bar; + default fn foo() {} +} diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.txt new file mode 100644 index 00000000000..384b203d38b --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0132_default_fn_type.txt @@ -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"