@@ -119,7 +119,7 @@ fn write_node_field_accessor(
119119 if field. optional {
120120 writeln ! (
121121 file,
122- " pub fn {}(&self) -> Option<{rust_type}> {{" ,
122+ " pub fn {}(&self) -> Option<{rust_type}<'a> > {{" ,
123123 field. name,
124124 ) ?;
125125 writeln ! (
@@ -132,14 +132,18 @@ fn write_node_field_accessor(
132132 writeln ! ( file, " }} else {{" ) ?;
133133 writeln ! (
134134 file,
135- " Some({rust_type} {{ parser: self.parser, pointer: ptr }})"
135+ " Some({rust_type} {{ parser: self.parser, pointer: ptr, marker: PhantomData }})"
136136 ) ?;
137137 writeln ! ( file, " }}" ) ?;
138138 } else {
139- writeln ! ( file, " pub fn {}(&self) -> {rust_type} {{" , field. name) ?;
140139 writeln ! (
141140 file,
142- " {rust_type} {{ parser: self.parser, pointer: unsafe {{ (*self.pointer).{} }} }}" ,
141+ " pub fn {}(&self) -> {rust_type}<'a> {{" ,
142+ field. name
143+ ) ?;
144+ writeln ! (
145+ file,
146+ " {rust_type} {{ parser: self.parser, pointer: unsafe {{ (*self.pointer).{} }}, marker: PhantomData }}" ,
143147 field. c_name( )
144148 ) ?;
145149 }
@@ -334,19 +338,24 @@ fn generate(config: &Config) -> Result<(), Box<dyn Error>> {
334338 for node in & config. nodes {
335339 writeln ! ( file, "#[allow(dead_code)]" ) ?; // TODO: Remove this once all nodes that need parser are implemented
336340 writeln ! ( file, "#[derive(Debug)]" ) ?;
337- writeln ! ( file, "pub struct {} {{" , node. rust_name) ?;
341+ writeln ! ( file, "pub struct {}<'a> {{" , node. rust_name) ?;
338342 writeln ! ( file, " parser: *mut rbs_parser_t," ) ?;
339343 writeln ! (
340344 file,
341345 " pointer: *mut {}," ,
342346 convert_name( & node. name, CIdentifier :: Type )
343347 ) ?;
348+ writeln ! (
349+ file,
350+ " marker: PhantomData<&'a mut {}>" ,
351+ convert_name( & node. name, CIdentifier :: Type )
352+ ) ?;
344353 writeln ! ( file, "}}\n " ) ?;
345354
346- writeln ! ( file, "impl {} {{" , node. rust_name) ?;
355+ writeln ! ( file, "impl<'a> {}<'a> {{" , node. rust_name) ?;
347356 writeln ! ( file, " /// Converts this node to a generic node." ) ?;
348357 writeln ! ( file, " #[must_use]" ) ?;
349- writeln ! ( file, " pub fn as_node(self) -> Node {{" ) ?;
358+ writeln ! ( file, " pub fn as_node(self) -> Node<'a> {{" ) ?;
350359 writeln ! ( file, " Node::{}(self)" , node. variant_name( ) ) ?;
351360 writeln ! ( file, " }}" ) ?;
352361 writeln ! ( file) ?;
@@ -461,7 +470,7 @@ fn generate(config: &Config) -> Result<(), Box<dyn Error>> {
461470 field. name . as_str ( )
462471 } ;
463472 if field. optional {
464- writeln ! ( file, " pub fn {name}(&self) -> Option<Node> {{" ) ?;
473+ writeln ! ( file, " pub fn {name}(&self) -> Option<Node<'a> > {{" ) ?;
465474 writeln ! (
466475 file,
467476 " let ptr = unsafe {{ (*self.pointer).{} }};" ,
@@ -472,7 +481,7 @@ fn generate(config: &Config) -> Result<(), Box<dyn Error>> {
472481 " if ptr.is_null() {{ None }} else {{ Some(Node::new(self.parser, ptr)) }}"
473482 ) ?;
474483 } else {
475- writeln ! ( file, " pub fn {name}(&self) -> Node {{" ) ?;
484+ writeln ! ( file, " pub fn {name}(&self) -> Node<'a> {{" ) ?;
476485 writeln ! (
477486 file,
478487 " unsafe {{ Node::new(self.parser, (*self.pointer).{}) }}" ,
@@ -501,18 +510,18 @@ fn generate(config: &Config) -> Result<(), Box<dyn Error>> {
501510
502511 // Generate the Node enum to wrap all of the structs
503512 writeln ! ( file, "#[derive(Debug)]" ) ?;
504- writeln ! ( file, "pub enum Node {{" ) ?;
513+ writeln ! ( file, "pub enum Node<'a> {{" ) ?;
505514 for node in & config. nodes {
506515 let variant_name = node
507516 . rust_name
508517 . strip_suffix ( "Node" )
509518 . unwrap_or ( & node. rust_name ) ;
510519
511- writeln ! ( file, " {variant_name}({})," , node. rust_name) ?;
520+ writeln ! ( file, " {variant_name}({}<'a> )," , node. rust_name) ?;
512521 }
513522 writeln ! ( file, "}}" ) ?;
514523
515- writeln ! ( file, "impl Node {{" ) ?;
524+ writeln ! ( file, "impl Node<'_> {{" ) ?;
516525 writeln ! ( file, " #[allow(clippy::missing_safety_doc)]" ) ?;
517526 writeln ! (
518527 file,
@@ -525,7 +534,7 @@ fn generate(config: &Config) -> Result<(), Box<dyn Error>> {
525534
526535 writeln ! (
527536 file,
528- " rbs_node_type::{enum_name} => Self::{}({} {{ parser, pointer: node.cast::<{c_type}>() }})," ,
537+ " rbs_node_type::{enum_name} => Self::{}({} {{ parser, pointer: node.cast::<{c_type}>(), marker: PhantomData }})," ,
529538 node. variant_name( ) ,
530539 node. rust_name,
531540 ) ?;
0 commit comments