@@ -89,7 +89,7 @@ macro_rules! parse {
89
89
state: parse_class,
90
90
buffer: $buffer,
91
91
stack: {
92
- ruby_name: { } ,
92
+ ruby_name: uninitialized ,
93
93
pub : false ,
94
94
reopen: false ,
95
95
$( $stack) *
@@ -103,7 +103,7 @@ macro_rules! parse {
103
103
state: parse_class,
104
104
buffer: { #[ ruby_name = $ruby_name: tt] $( $rest: tt) * } ,
105
105
stack: {
106
- ruby_name: { } ,
106
+ ruby_name: uninitialized ,
107
107
pub : false ,
108
108
reopen: false ,
109
109
$( $stack: tt) *
@@ -169,7 +169,7 @@ macro_rules! parse {
169
169
state: parse_class,
170
170
buffer: { class $name: tt $( $rest: tt) * } ,
171
171
stack: {
172
- ruby_name: { } ,
172
+ ruby_name: uninitialized ,
173
173
$( $stack: tt) *
174
174
}
175
175
} => {
@@ -195,15 +195,15 @@ macro_rules! parse {
195
195
}
196
196
} => {
197
197
parse! {
198
- state: parse_class_body ,
198
+ state: parse_struct ,
199
199
buffer: { $( $body) * } ,
200
200
stack: {
201
201
class: {
202
202
type : class,
203
203
rust_name: $name,
204
204
ruby_name: $ruby_name,
205
205
meta: { pub : $pub, reopen: $reopen } ,
206
- struct : uninitialized ,
206
+ struct : ( ) ,
207
207
methods: [ ]
208
208
} ,
209
209
program: { $( $rest) * } ,
@@ -212,23 +212,25 @@ macro_rules! parse {
212
212
}
213
213
} ;
214
214
215
- // STATE: parse_class_body
215
+ // STATE: parse_struct
216
216
217
217
{
218
- state: parse_class_body ,
218
+ state: parse_struct ,
219
219
buffer: { struct { $( $struct: tt) * } $( $rest: tt) * } ,
220
220
stack: {
221
221
class: {
222
222
type : class,
223
- rust_name: $rust_name: ident ,
223
+ rust_name: $rust_name: tt ,
224
224
ruby_name: $ruby_name: tt,
225
- meta: $meta : tt,
226
- struct : uninitialized ,
227
- methods : [ ]
225
+ meta: { pub : $pub : tt, reopen : $reopen : tt } ,
226
+ struct : ( ) ,
227
+ methods: [ ]
228
228
} ,
229
229
$( $stack: tt) *
230
230
}
231
231
} => {
232
+ assert_not_reopen!( { reopen: $reopen } , "Cannot define a struct in `reopen class`" ) ;
233
+
232
234
parse! {
233
235
state: parse_methods,
234
236
buffer: { $( $rest) * } ,
@@ -237,7 +239,7 @@ macro_rules! parse {
237
239
type : class,
238
240
rust_name: $rust_name,
239
241
ruby_name: $ruby_name,
240
- meta: $meta ,
242
+ meta: { pub : $pub , reopen : $reopen } ,
241
243
struct : { $( $struct) * } ,
242
244
methods: [ ]
243
245
} ,
@@ -247,34 +249,14 @@ macro_rules! parse {
247
249
} ;
248
250
249
251
{
250
- state: parse_class_body ,
252
+ state: parse_struct ,
251
253
buffer: $buffer: tt,
252
- stack: {
253
- class: {
254
- type : class,
255
- rust_name: $rust_name: ident,
256
- ruby_name: $ruby_name: tt,
257
- meta: $meta: tt,
258
- struct : uninitialized,
259
- methods : [ ]
260
- } ,
261
- $( $stack: tt) *
262
- }
254
+ stack: $stack: tt
263
255
} => {
264
256
parse! {
265
257
state: parse_methods,
266
258
buffer: $buffer,
267
- stack: {
268
- class: {
269
- type : class,
270
- rust_name: $rust_name,
271
- ruby_name: $ruby_name,
272
- meta: $meta,
273
- struct : ( ) ,
274
- methods: [ ]
275
- } ,
276
- $( $stack) *
277
- }
259
+ stack: $stack
278
260
}
279
261
} ;
280
262
@@ -342,7 +324,8 @@ macro_rules! parse {
342
324
$( $stack: tt) *
343
325
}
344
326
} => {
345
- assert_struct!( true , $class) ;
327
+ assert_not_reopen!( $class, "Cannot define `initialize` in `reopen class`" ) ;
328
+ assert_has_struct!( $class, "Cannot define `initialize` without a `struct`" ) ;
346
329
347
330
parse! {
348
331
state: parse_arguments_helix,
@@ -578,7 +561,7 @@ macro_rules! parse {
578
561
$( $stack: tt) *
579
562
}
580
563
} => {
581
- assert_no_explict_return_for_initializer!( $type, -> ) ;
564
+ assert_no_explict_return_for_initializer!( { type : $type } , "`def initialize` cannot have an explicit return type" ) ;
582
565
583
566
parse! {
584
567
state: finish_method,
@@ -716,4 +699,91 @@ macro_rules! parse {
716
699
}
717
700
}
718
701
} ;
702
+
703
+ // Catch all
704
+
705
+ { $( $state: tt) * } => {
706
+ parse_error!(
707
+ "Unknonw parser state. " ,
708
+ "This is possibly a bug in Helix itself, please file an issue " ,
709
+ "with the following debug information:\n \n " ,
710
+ format_parser_state!( $( $state) * )
711
+ ) ;
712
+ } ;
713
+ }
714
+
715
+ #[ doc( hidden) ]
716
+ #[ macro_export]
717
+ macro_rules! parse_error {
718
+ ( $( $message: expr) ,* ) => { compile_error!( concat!( "Parse Error! " , $( $message) ,* ) ) ; } ;
719
+ }
720
+
721
+ #[ doc( hidden) ]
722
+ #[ macro_export]
723
+ macro_rules! format_parser_state {
724
+ {
725
+ state: $state: tt,
726
+ buffer: $buffer: tt,
727
+ stack: $stack: tt
728
+ } => {
729
+ concat!( "{\n " ,
730
+ " state: " , stringify!( $state) , ",\n " ,
731
+ " buffer: " , stringify!( $buffer) , ",\n " ,
732
+ " stack: " , stringify!( $stack) , ",\n " ,
733
+ "}" )
734
+ } ;
735
+
736
+ { $( $state: tt) * } => { concat!( "(CORRUPTED)\n " , stringify!( $( $state) * ) ) } ;
737
+ }
738
+
739
+ #[ doc( hidden) ]
740
+ #[ macro_export]
741
+ macro_rules! assert_not_reopen {
742
+ {
743
+ {
744
+ type : class,
745
+ rust_name: $rust_name: tt,
746
+ ruby_name: $ruby_name: tt,
747
+ meta: { pub : $pub: tt, reopen: $reopen: tt } ,
748
+ struct : $struct: tt,
749
+ methods: $methods: tt
750
+ } ,
751
+ $( $message: expr) ,*
752
+ } => { assert_not_reopen!( { reopen: $reopen } , $( $message) ,* ) ; } ;
753
+
754
+ { { reopen: true } , $( $message: expr) ,* } => { parse_error!( $( $message) ,* ) ; } ;
755
+ { { reopen: false } , $( $message: expr) ,* } => { } ;
756
+ }
757
+
758
+ #[ doc( hidden) ]
759
+ #[ macro_export]
760
+ macro_rules! assert_has_struct {
761
+ {
762
+ {
763
+ type : class,
764
+ rust_name: $rust_name: tt,
765
+ ruby_name: $ruby_name: tt,
766
+ meta: $meta: tt,
767
+ struct : $struct: tt,
768
+ methods: $methods: tt
769
+ } ,
770
+ $( $message: expr) ,*
771
+ } => { assert_has_struct!( { struct : $struct } , $( $message) ,* ) ; } ;
772
+
773
+ { { struct : ( ) } , $( $message: expr) ,* } => { parse_error!( $( $message) ,* ) ; } ;
774
+ { { struct : $struct: tt } , $( $message: expr) ,* } => { } ;
775
+ }
776
+
777
+ #[ doc( hidden) ]
778
+ #[ macro_export]
779
+ macro_rules! assert_valid_self_arg {
780
+ ( self ) => { } ;
781
+ }
782
+
783
+ #[ doc( hidden) ]
784
+ #[ macro_export]
785
+ macro_rules! assert_no_explict_return_for_initializer {
786
+ ( { type : instance_method } , $( $message: expr) ,* ) => { } ;
787
+ ( { type : class_method } , $( $message: expr) ,* ) => { } ;
788
+ ( { type : initializer } , $( $message: expr) ,* ) => { parse_error!( $( $message) ,* ) ; } ;
719
789
}
0 commit comments