From 30dc6d782dfc9bb9177ff44d8bef8d2db0f4b8dd Mon Sep 17 00:00:00 2001 From: Nathan Froyd Date: Sat, 13 Dec 2025 08:31:57 -0500 Subject: [PATCH] [rust] add `len()`/`is_empty()` to `ConstantList` --- rust/ruby-prism/src/lib.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/rust/ruby-prism/src/lib.rs b/rust/ruby-prism/src/lib.rs index 34e1517be2..af430e1495 100644 --- a/rust/ruby-prism/src/lib.rs +++ b/rust/ruby-prism/src/lib.rs @@ -255,6 +255,18 @@ impl<'pr> ConstantList<'pr> { marker: PhantomData, } } + + /// Returns the length of the list. + #[must_use] + pub const fn len(&self) -> usize { + unsafe { self.pointer.as_ref().size } + } + + /// Returns whether the list is empty. + #[must_use] + pub const fn is_empty(&self) -> bool { + self.len() == 0 + } } impl<'pr> IntoIterator for &ConstantList<'pr> { @@ -811,11 +823,27 @@ mod tests { assert!(!node.as_program_node().unwrap().statements().body().is_empty()); let module = node.as_program_node().unwrap().statements().body().iter().next().unwrap(); let module = module.as_module_node().unwrap(); + + assert_eq!(module.locals().len(), 1); + assert!(!module.locals().is_empty()); + let locals = module.locals().iter().collect::>(); assert_eq!(locals.len(), 1); assert_eq!(locals[0].as_slice(), b"x"); + + let source = "module Foo; end"; + let result = parse(source.as_ref()); + + let node = result.node(); + assert_eq!(node.as_program_node().unwrap().statements().body().len(), 1); + assert!(!node.as_program_node().unwrap().statements().body().is_empty()); + let module = node.as_program_node().unwrap().statements().body().iter().next().unwrap(); + let module = module.as_module_node().unwrap(); + + assert_eq!(module.locals().len(), 0); + assert!(module.locals().is_empty()); } #[test]