Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/parser/src/grammar/items/traits.rs56
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast (renamed from crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast)0
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rs (renamed from crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rs)0
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast148
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs3
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rast (renamed from crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast)2
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0079_impl_def.rast14
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0079_impl_def.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0079_impl_item.rast14
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0079_impl_item.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast41
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rs5
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rast97
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rs2
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rast (renamed from crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rast)2
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rast35
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rast29
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rast30
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rast26
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rs1
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rast96
-rw-r--r--crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rs2
29 files changed, 300 insertions, 312 deletions
diff --git a/crates/parser/src/grammar/items/traits.rs b/crates/parser/src/grammar/items/traits.rs
index 569fc58a1c..dd1ecf97e4 100644
--- a/crates/parser/src/grammar/items/traits.rs
+++ b/crates/parser/src/grammar/items/traits.rs
@@ -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 {
@@ -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]) {
@@ -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;
@@ -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!['}']) {
@@ -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,
@@ -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;
}
diff --git a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast
index dc7f6295b2..dc7f6295b2 100644
--- a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rast
diff --git a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rs b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rs
index f108514879..f108514879 100644
--- a/crates/syntax/test_data/parser/inline/ok/0021_impl_item_list.rs
+++ b/crates/syntax/test_data/parser/inline/ok/0021_assoc_item_list.rs
diff --git a/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast b/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast
index 3638462f8b..f7814abaa4 100644
--- a/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rast
@@ -1,125 +1,31 @@
- [email protected] "Display"
diff --git a/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs b/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs
index 32761dd03d..dcd9a71144 100644
--- a/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs
+++ b/crates/syntax/test_data/parser/inline/ok/0041_trait_item.rs
@@ -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; }
diff --git a/crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rs b/crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rs
deleted file mode 100644
index b7527c8705..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rs
+++ /dev/null
@@ -1 +0,0 @@
-impl !Send for X {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast b/crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rast
index 4368930cc9..4ab352223b 100644
--- a/crates/syntax/test_data/parser/inline/ok/0063_impl_def_neg.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rast
@@ -15,7 +15,7 @@ [email protected]
diff --git a/crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rs b/crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rs
new file mode 100644
index 0000000000..a7bd4b048d
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0063_impl_item_neg.rs
@@ -0,0 +1 @@
+impl !Send for S {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rast b/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rast
deleted file mode 100644
index 209711fc49..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rast
+++ /dev/null
@@ -1,14 +0,0 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rs b/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rs
deleted file mode 100644
index d6337f6b3a..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0079_impl_def.rs
+++ /dev/null
@@ -1 +0,0 @@
-impl Foo {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rast b/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rast
new file mode 100644
index 0000000000..6516a78f83
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rast
@@ -0,0 +1,14 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rs b/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rs
new file mode 100644
index 0000000000..647799d7c1
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0079_impl_item.rs
@@ -0,0 +1 @@
+impl S {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast b/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast
deleted file mode 100644
index 24ac1d66a4..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rast
+++ /dev/null
@@ -1,41 +0,0 @@
- [email protected] "//! This is a doc com ..."
- [email protected] "\"This is also a doc c ..."
diff --git a/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rs b/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rs
deleted file mode 100644
index 4d68cceb71..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0118_impl_inner_attributes.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-enum F{}
-impl F {
- //! This is a doc comment
- #![doc("This is also a doc comment")]
-}
diff --git a/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rast b/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rast
index dac50410e4..6bcbd0f1c6 100644
--- a/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rast
@@ -1,4 +1,4 @@
@@ -31,98 +31,3 @@ [email protected]
diff --git a/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rs b/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rs
index 4bd428ee46..71d76789fa 100644
--- a/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rs
+++ b/crates/syntax/test_data/parser/inline/ok/0151_trait_alias.rs
@@ -1,3 +1 @@
trait Z<U> = T<U>;
-trait Z<U> = T<U> where U: Copy;
-trait Z<U> = where Self: T<U>;
diff --git a/crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rs b/crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rs
deleted file mode 100644
index 8d68864693..0000000000
--- a/crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rs
+++ /dev/null
@@ -1 +0,0 @@
-impl const Send for X {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rast b/crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rast
index dcd39535b4..925dfa2f11 100644
--- a/crates/syntax/test_data/parser/inline/ok/0161_impl_def_const.rast
+++ b/crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rast
@@ -16,7 +16,7 @@ [email protected]
diff --git a/crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rs b/crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rs
new file mode 100644
index 0000000000..3252d6f362
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0161_impl_item_const.rs
@@ -0,0 +1 @@
+impl const Send for S {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rast b/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rast
new file mode 100644
index 0000000000..f7af2e30e8
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rast
@@ -0,0 +1,35 @@
+ [email protected] "Display"
diff --git a/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rs b/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rs
new file mode 100644
index 0000000000..4a51926a6b
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0174_trait_item_generic_params.rs
@@ -0,0 +1 @@
+trait X<U: Debug + Display> {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rast b/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rast
new file mode 100644
index 0000000000..f025e32520
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rast
@@ -0,0 +1,29 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rs b/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rs
new file mode 100644
index 0000000000..e6ad2b56af
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0175_trait_item_bounds.rs
@@ -0,0 +1 @@
+trait T: Hash + Clone {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rast b/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rast
new file mode 100644
index 0000000000..85105b4043
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rast
@@ -0,0 +1,30 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rs b/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rs
new file mode 100644
index 0000000000..52a6a806f3
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0176_trait_item_where_clause.rs
@@ -0,0 +1 @@
+trait T where Self: Copy {}
diff --git a/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rast b/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rast
new file mode 100644
index 0000000000..65b4743d14
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rast
@@ -0,0 +1,26 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rs b/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rs
new file mode 100644
index 0000000000..915e2c9327
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0177_assoc_item_list_inner_attrs.rs
@@ -0,0 +1 @@
+impl S { #![attr] }
diff --git a/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rast b/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rast
new file mode 100644
index 0000000000..929182f8ee
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rast
@@ -0,0 +1,96 @@
diff --git a/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rs b/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rs
new file mode 100644
index 0000000000..a90d54b010
--- /dev/null
+++ b/crates/syntax/test_data/parser/inline/ok/0177_trait_alias_where_clause.rs
@@ -0,0 +1,2 @@
+trait Z<U> = T<U> where U: Copy;
+trait Z<U> = where Self: T<U>;