From 245bf8df12898b147c160a2fcf23dc4ff8a527f7 Mon Sep 17 00:00:00 2001 From: Alex Rocha Date: Wed, 19 Nov 2025 17:26:13 -0800 Subject: [PATCH] Handle rbs_node and rbs_node_list types This adds support for `rbs_node` and `rbs_node_list` field types in the bindings generator. This enables access to child nodes and node lists from parent AST nodes. We handle fields named `type` (which is a Rust keyword) by escaping the accessor method to `r#type()` and correctly mapping to the underlying `type_` field in the C struct. --- rust/ruby-rbs/build.rs | 24 ++++++++++++++++++++++++ rust/ruby-rbs/src/lib.rs | 4 ++++ 2 files changed, 28 insertions(+) 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 {