diff --git a/rust/ruby-rbs/build.rs b/rust/ruby-rbs/build.rs index 84ed084dd..beec0238e 100644 --- a/rust/ruby-rbs/build.rs +++ b/rust/ruby-rbs/build.rs @@ -147,6 +147,30 @@ fn generate(config: &Config) -> Result<(), Box> { )?; writeln!(file, " }}")?; } + "rbs_node" => { + let name = if field.name == "type" { + "type_" + } else { + field.name.as_str() + }; + + writeln!(file, " pub fn {}(&self) -> Node {{", name)?; + writeln!( + file, + " unsafe {{ Node::new(self.parser, (*self.pointer).{}) }}", + name + )?; + writeln!(file, " }}")?; + } + "rbs_node_list" => { + writeln!(file, " pub fn {}(&self) -> NodeList {{", field.name)?; + writeln!( + file, + " NodeList::new(self.parser, unsafe {{ (*self.pointer).{} }})", + field.name + )?; + writeln!(file, " }}")?; + } _ => eprintln!("Unknown field type: {}", field.c_type), } } diff --git a/rust/ruby-rbs/src/lib.rs b/rust/ruby-rbs/src/lib.rs index 21905538c..13fb8a9ea 100644 --- a/rust/ruby-rbs/src/lib.rs +++ b/rust/ruby-rbs/src/lib.rs @@ -66,6 +66,10 @@ pub struct NodeList { } impl NodeList { + pub fn new(parser: *mut rbs_parser_t, pointer: *mut rbs_node_list_t) -> Self { + Self { parser, pointer } + } + /// Returns an iterator over the nodes. #[must_use] pub fn iter(&self) -> NodeListIter {