File tree Expand file tree Collapse file tree 9 files changed +75
-6
lines changed
parser/event_parser/grammar/items Expand file tree Collapse file tree 9 files changed +75
-6
lines changed Original file line number Diff line number Diff line change @@ -91,6 +91,8 @@ Grammar(
91
91
"USE_ITEM" ,
92
92
"STATIC_ITEM" ,
93
93
"CONST_ITEM" ,
94
+ "TRAIT_ITEM" ,
95
+ "IMPL_ITEM" ,
94
96
95
97
"EXTERN_BLOCK" ,
96
98
"ENUM_VARIANT" ,
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ use super::*;
3
3
mod structs;
4
4
mod use_item;
5
5
mod consts;
6
+ mod traits;
6
7
7
8
pub ( super ) fn mod_contents ( p : & mut Parser , stop_on_r_curly : bool ) {
8
9
attributes:: inner_attributes ( p) ;
@@ -80,6 +81,22 @@ fn item(p: &mut Parser) {
80
81
CONST_ITEM
81
82
}
82
83
} ,
84
+ // TODO: auto trait
85
+ // test unsafe_trait
86
+ // unsafe trait T {}
87
+ UNSAFE_KW if la == TRAIT_KW => {
88
+ p. bump ( ) ;
89
+ traits:: trait_item ( p) ;
90
+ TRAIT_ITEM
91
+ }
92
+ // TODO: default impl
93
+ // test unsafe_impl
94
+ // unsafe impl Foo {}
95
+ UNSAFE_KW if la == IMPL_KW => {
96
+ p. bump ( ) ;
97
+ traits:: impl_item ( p) ;
98
+ IMPL_ITEM
99
+ }
83
100
MOD_KW => {
84
101
mod_item ( p) ;
85
102
MOD_ITEM
@@ -131,6 +148,7 @@ fn extern_block(p: &mut Parser) {
131
148
p. bump ( ) ;
132
149
p. expect ( R_CURLY ) ;
133
150
}
151
+
134
152
fn mod_item ( p : & mut Parser ) {
135
153
assert ! ( p. at( MOD_KW ) ) ;
136
154
p. bump ( ) ;
Original file line number Diff line number Diff line change
1
+ use super :: * ;
2
+
3
+ pub ( super ) fn trait_item ( p : & mut Parser ) {
4
+ assert ! ( p. at( TRAIT_KW ) ) ;
5
+ p. bump ( ) ;
6
+ p. expect ( IDENT ) ;
7
+ p. expect ( L_CURLY ) ;
8
+ p. expect ( R_CURLY ) ;
9
+ }
10
+
11
+ pub ( super ) fn impl_item ( p : & mut Parser ) {
12
+ assert ! ( p. at( IMPL_KW ) ) ;
13
+ p. bump ( ) ;
14
+ p. expect ( IDENT ) ;
15
+ p. expect ( L_CURLY ) ;
16
+ p. expect ( R_CURLY ) ;
17
+ }
Original file line number Diff line number Diff line change @@ -92,6 +92,8 @@ pub enum SyntaxKind {
92
92
USE_ITEM ,
93
93
STATIC_ITEM ,
94
94
CONST_ITEM ,
95
+ TRAIT_ITEM ,
96
+ IMPL_ITEM ,
95
97
EXTERN_BLOCK ,
96
98
ENUM_VARIANT ,
97
99
NAMED_FIELD ,
@@ -207,6 +209,8 @@ impl SyntaxKind {
207
209
USE_ITEM => & SyntaxInfo { name : "USE_ITEM" } ,
208
210
STATIC_ITEM => & SyntaxInfo { name : "STATIC_ITEM" } ,
209
211
CONST_ITEM => & SyntaxInfo { name : "CONST_ITEM" } ,
212
+ TRAIT_ITEM => & SyntaxInfo { name : "TRAIT_ITEM" } ,
213
+ IMPL_ITEM => & SyntaxInfo { name : "IMPL_ITEM" } ,
210
214
EXTERN_BLOCK => & SyntaxInfo { name : "EXTERN_BLOCK" } ,
211
215
ENUM_VARIANT => & SyntaxInfo { name : "ENUM_VARIANT" } ,
212
216
NAMED_FIELD => & SyntaxInfo { name : "NAMED_FIELD" } ,
Original file line number Diff line number Diff line change
1
+ unsafe trait T { }
Original file line number Diff line number Diff line change
1
+ FILE@[0; 18)
2
+ TRAIT_ITEM@[0; 18)
3
+ UNSAFE_KW@[0; 6)
4
+ WHITESPACE@[6; 7)
5
+ TRAIT_KW@[7; 12)
6
+ WHITESPACE@[12; 13)
7
+ IDENT@[13; 14) "T"
8
+ WHITESPACE@[14; 15)
9
+ L_CURLY@[15; 16)
10
+ R_CURLY@[16; 17)
11
+ WHITESPACE@[17; 18)
Original file line number Diff line number Diff line change
1
+ unsafe impl Foo { }
Original file line number Diff line number Diff line change
1
+ FILE@[0; 19)
2
+ IMPL_ITEM@[0; 19)
3
+ UNSAFE_KW@[0; 6)
4
+ WHITESPACE@[6; 7)
5
+ IMPL_KW@[7; 11)
6
+ WHITESPACE@[11; 12)
7
+ IDENT@[12; 15) "Foo"
8
+ WHITESPACE@[15; 16)
9
+ L_CURLY@[16; 17)
10
+ R_CURLY@[17; 18)
11
+ WHITESPACE@[18; 19)
Original file line number Diff line number Diff line change @@ -79,16 +79,20 @@ fn collect_tests(s: &str) -> Vec<Test> {
79
79
. map ( str:: trim_left)
80
80
. group_by ( |line| line. starts_with ( prefix) ) ;
81
81
82
- for ( is_comment, block) in comment_blocks. into_iter ( ) {
82
+ ' outer : for ( is_comment, block) in comment_blocks. into_iter ( ) {
83
83
if !is_comment {
84
84
continue ;
85
85
}
86
86
let mut block = block. map ( |line| & line[ prefix. len ( ) ..] ) ;
87
- let first = block. next ( ) . unwrap ( ) ;
88
- if !first. starts_with ( "test " ) {
89
- continue ;
90
- }
91
- let name = first[ "test " . len ( ) ..] . to_string ( ) ;
87
+
88
+ let name = loop {
89
+ match block. next ( ) {
90
+ Some ( line) if line. starts_with ( "test " ) =>
91
+ break line[ "test " . len ( ) ..] . to_string ( ) ,
92
+ Some ( _) => ( ) ,
93
+ None => continue ' outer,
94
+ }
95
+ } ;
92
96
let text: String = itertools:: join ( block. chain ( :: std:: iter:: once ( "" ) ) , "\n " ) ;
93
97
assert ! ( !text. trim( ) . is_empty( ) && text. ends_with( "\n " ) ) ;
94
98
res. push ( Test { name, text } )
You can’t perform that action at this time.
0 commit comments