@@ -40,9 +40,6 @@ enum NodeFieldType {
40
40
#[ serde( rename = "uint32" ) ]
41
41
UInt32 ,
42
42
43
- #[ serde( rename = "flags" ) ]
44
- Flags ,
45
-
46
43
#[ serde( rename = "integer" ) ]
47
44
Integer ,
48
45
@@ -85,6 +82,8 @@ struct Flags {
85
82
struct Node {
86
83
name : String ,
87
84
85
+ flags : Option < String > ,
86
+
88
87
#[ serde( default ) ]
89
88
fields : Vec < NodeField > ,
90
89
@@ -235,6 +234,28 @@ fn write_node(file: &mut File, flags: &[Flags], node: &Node) -> Result<(), Box<d
235
234
writeln ! ( file, " let pointer: *mut pm_location_t = unsafe {{ &mut (*self.pointer).base.location }};" ) ?;
236
235
writeln ! ( file, " Location::new(self.parser, unsafe {{ &(*pointer) }})" ) ?;
237
236
writeln ! ( file, " }}" ) ?;
237
+ writeln ! ( file) ?;
238
+ writeln ! ( file, " /// Returns the flags of this node." ) ?;
239
+ writeln ! ( file, " #[must_use]" ) ?;
240
+ writeln ! ( file, " pub fn flags(&self) -> pm_node_flags_t {{" ) ?;
241
+ writeln ! ( file, " unsafe {{ (*self.pointer).base.flags }}" ) ?;
242
+ writeln ! ( file, " }}" ) ?;
243
+
244
+ if let Some ( kind) = & node. flags {
245
+ let our_flags = flags. iter ( ) . filter ( |f| & f. name == kind) . collect :: < Vec < _ > > ( ) ;
246
+ assert ! ( our_flags. len( ) == 1 ) ;
247
+
248
+ for flag in our_flags {
249
+ for value in & flag. values {
250
+ writeln ! ( file) ?;
251
+ writeln ! ( file, " /// {}" , value. comment) ?;
252
+ writeln ! ( file, " #[must_use]" ) ?;
253
+ writeln ! ( file, " pub fn {}(&self) -> bool {{" , accessor_func_name( & value. name) ) ?;
254
+ writeln ! ( file, " (self.flags() & {}) != 0" , enum_const_name( & flag. name, & value. name) ) ?;
255
+ writeln ! ( file, " }}" ) ?;
256
+ }
257
+ }
258
+ }
238
259
239
260
for field in & node. fields {
240
261
writeln ! ( file) ?;
@@ -335,27 +356,6 @@ fn write_node(file: &mut File, flags: &[Flags], node: &Node) -> Result<(), Box<d
335
356
writeln ! ( file, " unsafe {{ (*self.pointer).{} }}" , field. name) ?;
336
357
writeln ! ( file, " }}" ) ?;
337
358
} ,
338
- NodeFieldType :: Flags => {
339
- let Some ( NodeFieldKind :: Concrete ( kind) ) = & field. kind else {
340
- panic ! ( "Flag fields must have a concrete kind" ) ;
341
- } ;
342
- let our_flags = flags. iter ( ) . filter ( |f| & f. name == kind) . collect :: < Vec < _ > > ( ) ;
343
- assert ! ( our_flags. len( ) == 1 ) ;
344
-
345
- writeln ! ( file, " fn {}(&self) -> pm_node_flags_t {{" , field. name) ?;
346
- writeln ! ( file, " unsafe {{ (*self.pointer).base.flags }}" ) ?;
347
- writeln ! ( file, " }}" ) ?;
348
-
349
- for flag in our_flags {
350
- for value in & flag. values {
351
- writeln ! ( file, " /// {}" , value. comment) ?;
352
- writeln ! ( file, " #[must_use]" ) ?;
353
- writeln ! ( file, " pub fn {}(&self) -> bool {{" , accessor_func_name( & value. name) ) ?;
354
- writeln ! ( file, " (self.{}() & {}) != 0" , field. name, enum_const_name( & flag. name, & value. name) ) ?;
355
- writeln ! ( file, " }}" ) ?;
356
- }
357
- }
358
- } ,
359
359
NodeFieldType :: Integer => {
360
360
writeln ! ( file, " pub fn {}(&self) -> Integer<'pr> {{" , field. name) ?;
361
361
writeln ! ( file, " Integer::new(unsafe {{ &(*self.pointer).{} }})" , field. name) ?;
0 commit comments