Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 30 additions & 26 deletions crates/parser/src/grammar/items/traits.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,39 @@
use super::*;

// test trait_item
// trait T<U>: Hash + Clone where U: Copy {}
// trait X<U: Debug + Display>: Hash + Clone where U: Copy {}
// trait T { fn new() -> Self; }
pub(super) fn trait_(p: &mut Parser, m: Marker) {
assert!(p.at(T![trait]));
p.bump(T![trait]);
name_r(p, ITEM_RECOVERY_SET);

// test trait_item_generic_params
// trait X<U: Debug + Display> {}
type_params::opt_generic_param_list(p);
// test trait_alias
// trait Z<U> = T<U>;
// trait Z<U> = T<U> where U: Copy;
// trait Z<U> = where Self: T<U>;

if p.eat(T![=]) {
// test trait_alias
// trait Z<U> = T<U>;
type_params::bounds_without_colon(p);

// test trait_alias_where_clause
// trait Z<U> = T<U> where U: Copy;
// trait Z<U> = where Self: T<U>;
type_params::opt_where_clause(p);
p.expect(T![;]);
m.complete(p, TRAIT);
return;
}

if p.at(T![:]) {
// test trait_item_bounds
// trait T: Hash + Clone {}
type_params::bounds(p);
}

// test trait_item_where_clause
// trait T where Self: Copy {}
type_params::opt_where_clause(p);

if p.at(T!['{']) {
assoc_item_list(p);
} else {
Expand All @@ -31,24 +42,23 @@ pub(super) fn trait_(p: &mut Parser, m: Marker) {
m.complete(p, TRAIT);
}

// test impl_def
// impl Foo {}
// test impl_item
// impl S {}
pub(super) fn impl_(p: &mut Parser, m: Marker) {
assert!(p.at(T![impl]));
p.bump(T![impl]);
if choose_type_params_over_qpath(p) {
if p.at(T![<]) && not_a_qualified_path(p) {
type_params::opt_generic_param_list(p);
}

// test impl_def_const
// impl const Send for X {}
// test impl_item_const
// impl const Send for S {}
p.eat(T![const]);

// FIXME: never type
// impl ! {}

// test impl_def_neg
// impl !Send for X {}
// test impl_item_neg
// impl !Send for S {}
p.eat(T![!]);
impl_type(p);
if p.eat(T![for]) {
Expand All @@ -63,7 +73,7 @@ pub(super) fn impl_(p: &mut Parser, m: Marker) {
m.complete(p, IMPL);
}

// test impl_item_list
// test assoc_item_list
// impl F {
// type A = i32;
// const B: i32 = 92;
Expand All @@ -72,14 +82,11 @@ pub(super) fn impl_(p: &mut Parser, m: Marker) {
// }
pub(crate) fn assoc_item_list(p: &mut Parser) {
assert!(p.at(T!['{']));

let m = p.start();
p.bump(T!['{']);
// test impl_inner_attributes
// enum F{}
// impl F {
// //! This is a doc comment
// #![doc("This is also a doc comment")]
// }
// test assoc_item_list_inner_attrs
// impl S { #![attr] }
attributes::inner_attrs(p);

while !p.at(EOF) && !p.at(T!['}']) {
Expand All @@ -95,7 +102,7 @@ pub(crate) fn assoc_item_list(p: &mut Parser) {

// test impl_type_params
// impl<const N: u32> Bar<N> {}
fn choose_type_params_over_qpath(p: &Parser) -> bool {
fn not_a_qualified_path(p: &Parser) -> bool {
// There's an ambiguity between generic parameters and qualified paths in impls.
// If we see `<` it may start both, so we have to inspect some following tokens.
// The following combinations can only start generics,
Expand All @@ -112,9 +119,6 @@ fn choose_type_params_over_qpath(p: &Parser) -> bool {
// we disambiguate it in favor of generics (`impl<T> ::absolute::Path<T> { ... }`)
// because this is what almost always expected in practice, qualified paths in impls
// (`impl <Type>::AssocTy { ... }`) aren't even allowed by type checker at the moment.
if !p.at(T![<]) {
return false;
}
if p.nth(1) == T![#] || p.nth(1) == T![>] || p.nth(1) == T![const] {
return true;
}
Expand Down
148 changes: 27 additions & 121 deletions crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast
Original file line number Diff line number Diff line change
@@ -1,125 +1,31 @@
SOURCE_FILE@0..101
TRAIT@0..41
SOURCE_FILE@0..30
TRAIT@0..29
TRAIT_KW@0..5 "trait"
WHITESPACE@5..6 " "
NAME@6..7
IDENT@6..7 "T"
GENERIC_PARAM_LIST@7..10
L_ANGLE@7..8 "<"
TYPE_PARAM@8..9
NAME@8..9
IDENT@8..9 "U"
R_ANGLE@9..10 ">"
COLON@10..11 ":"
WHITESPACE@11..12 " "
TYPE_BOUND_LIST@12..24
TYPE_BOUND@12..16
PATH_TYPE@12..16
PATH@12..16
PATH_SEGMENT@12..16
NAME_REF@12..16
IDENT@12..16 "Hash"
WHITESPACE@16..17 " "
PLUS@17..18 "+"
WHITESPACE@18..19 " "
TYPE_BOUND@19..24
PATH_TYPE@19..24
PATH@19..24
PATH_SEGMENT@19..24
NAME_REF@19..24
IDENT@19..24 "Clone"
WHITESPACE@24..25 " "
WHERE_CLAUSE@25..38
WHERE_KW@25..30 "where"
WHITESPACE@30..31 " "
WHERE_PRED@31..38
PATH_TYPE@31..32
PATH@31..32
PATH_SEGMENT@31..32
NAME_REF@31..32
IDENT@31..32 "U"
COLON@32..33 ":"
WHITESPACE@33..34 " "
TYPE_BOUND_LIST@34..38
TYPE_BOUND@34..38
PATH_TYPE@34..38
PATH@34..38
PATH_SEGMENT@34..38
NAME_REF@34..38
IDENT@34..38 "Copy"
WHITESPACE@38..39 " "
ASSOC_ITEM_LIST@39..41
L_CURLY@39..40 "{"
R_CURLY@40..41 "}"
WHITESPACE@41..42 "\n"
TRAIT@42..100
TRAIT_KW@42..47 "trait"
WHITESPACE@47..48 " "
NAME@48..49
IDENT@48..49 "X"
GENERIC_PARAM_LIST@49..69
L_ANGLE@49..50 "<"
TYPE_PARAM@50..68
NAME@50..51
IDENT@50..51 "U"
COLON@51..52 ":"
WHITESPACE@52..53 " "
TYPE_BOUND_LIST@53..68
TYPE_BOUND@53..58
PATH_TYPE@53..58
PATH@53..58
PATH_SEGMENT@53..58
NAME_REF@53..58
IDENT@53..58 "Debug"
WHITESPACE@58..59 " "
PLUS@59..60 "+"
WHITESPACE@60..61 " "
TYPE_BOUND@61..68
PATH_TYPE@61..68
PATH@61..68
PATH_SEGMENT@61..68
NAME_REF@61..68
IDENT@61..68 "Display"
R_ANGLE@68..69 ">"
COLON@69..70 ":"
WHITESPACE@70..71 " "
TYPE_BOUND_LIST@71..83
TYPE_BOUND@71..75
PATH_TYPE@71..75
PATH@71..75
PATH_SEGMENT@71..75
NAME_REF@71..75
IDENT@71..75 "Hash"
WHITESPACE@75..76 " "
PLUS@76..77 "+"
WHITESPACE@77..78 " "
TYPE_BOUND@78..83
PATH_TYPE@78..83
PATH@78..83
PATH_SEGMENT@78..83
NAME_REF@78..83
IDENT@78..83 "Clone"
WHITESPACE@83..84 " "
WHERE_CLAUSE@84..97
WHERE_KW@84..89 "where"
WHITESPACE@89..90 " "
WHERE_PRED@90..97
PATH_TYPE@90..91
PATH@90..91
PATH_SEGMENT@90..91
NAME_REF@90..91
IDENT@90..91 "U"
COLON@91..92 ":"
WHITESPACE@92..93 " "
TYPE_BOUND_LIST@93..97
TYPE_BOUND@93..97
PATH_TYPE@93..97
PATH@93..97
PATH_SEGMENT@93..97
NAME_REF@93..97
IDENT@93..97 "Copy"
WHITESPACE@97..98 " "
ASSOC_ITEM_LIST@98..100
L_CURLY@98..99 "{"
R_CURLY@99..100 "}"
WHITESPACE@100..101 "\n"
WHITESPACE@7..8 " "
ASSOC_ITEM_LIST@8..29
L_CURLY@8..9 "{"
WHITESPACE@9..10 " "
FN@10..27
FN_KW@10..12 "fn"
WHITESPACE@12..13 " "
NAME@13..16
IDENT@13..16 "new"
PARAM_LIST@16..18
L_PAREN@16..17 "("
R_PAREN@17..18 ")"
WHITESPACE@18..19 " "
RET_TYPE@19..26
THIN_ARROW@19..21 "->"
WHITESPACE@21..22 " "
PATH_TYPE@22..26
PATH@22..26
PATH_SEGMENT@22..26
NAME_REF@22..26
IDENT@22..26 "Self"
SEMICOLON@26..27 ";"
WHITESPACE@27..28 " "
R_CURLY@28..29 "}"
WHITESPACE@29..30 "\n"
3 changes: 1 addition & 2 deletions crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
trait T<U>: Hash + Clone where U: Copy {}
trait X<U: Debug + Display>: Hash + Clone where U: Copy {}
trait T { fn new() -> Self; }

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ SOURCE_FILE@0..20
PATH@15..16
PATH_SEGMENT@15..16
NAME_REF@15..16
IDENT@15..16 "X"
IDENT@15..16 "S"
WHITESPACE@16..17 " "
ASSOC_ITEM_LIST@17..19
L_CURLY@17..18 "{"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
impl !Send for S {}
14 changes: 0 additions & 14 deletions crates/syntax/test_data/parser/inline/ok/0079_impl_def.rast

This file was deleted.

1 change: 0 additions & 1 deletion crates/syntax/test_data/parser/inline/ok/0079_impl_def.rs

This file was deleted.

14 changes: 14 additions & 0 deletions crates/syntax/test_data/parser/inline/ok/0079_impl_item.rast
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
SOURCE_FILE@0..10
IMPL@0..9
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 "S"
WHITESPACE@6..7 " "
ASSOC_ITEM_LIST@7..9
L_CURLY@7..8 "{"
R_CURLY@8..9 "}"
WHITESPACE@9..10 "\n"
1 change: 1 addition & 0 deletions crates/syntax/test_data/parser/inline/ok/0079_impl_item.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
impl S {}

This file was deleted.

This file was deleted.

Loading