@@ -92,7 +92,9 @@ pub trait NodeExt: Sized {
92
92
fn ancestors ( & self ) -> impl Iterator < Item = Self > ;
93
93
fn children_of ( node : Self ) -> impl Iterator < Item = Self > ;
94
94
fn next_siblings ( & self ) -> impl Iterator < Item = Self > ;
95
+ fn arguments ( & self ) -> impl Iterator < Item = ( Option < Self > , Option < Self > ) > ;
95
96
fn arguments_values ( & self ) -> impl Iterator < Item = Self > ;
97
+ fn arguments_names ( & self ) -> impl Iterator < Item = Self > ;
96
98
}
97
99
98
100
impl < ' tree > NodeExt for Node < ' tree > {
@@ -249,21 +251,37 @@ impl<'tree> NodeExt for Node<'tree> {
249
251
} )
250
252
}
251
253
252
- /// Takes a call node and iterates over the values of its arguments
253
- fn arguments_values ( & self ) -> impl Iterator < Item = Node < ' tree > > {
254
+ /// Iterator over argument names and values. Either of `name` and `value`
255
+ /// may be absent, but not both.
256
+ fn arguments ( & self ) -> impl Iterator < Item = ( Option < Node < ' tree > > , Option < Node < ' tree > > ) > {
254
257
self . child_by_field_name ( "arguments" )
255
258
// Create iterator that unpacks Option with `flat_map()`
256
259
. into_iter ( )
257
260
. flat_map ( Self :: children_of)
258
261
. filter_map ( |node| {
259
- // This takes care of non-argument nodes like `(` and `)`
260
- if node. kind ( ) == "argument" {
261
- node. child_by_field_name ( "value" )
262
- } else {
263
- None
262
+ if node. kind ( ) != "argument" {
263
+ return None ;
264
264
}
265
+
266
+ let name = node. child_by_field_name ( "name" ) ;
267
+ let value = node. child_by_field_name ( "value" ) ;
268
+
269
+ // Likely not possible but just in case
270
+ if value. is_none ( ) && name. is_none ( ) {
271
+ return None ;
272
+ }
273
+
274
+ Some ( ( name, value) )
265
275
} )
266
276
}
277
+
278
+ fn arguments_names ( & self ) -> impl Iterator < Item = Node < ' tree > > {
279
+ self . arguments ( ) . filter_map ( |( name, _value) | name)
280
+ }
281
+
282
+ fn arguments_values ( & self ) -> impl Iterator < Item = Node < ' tree > > {
283
+ self . arguments ( ) . filter_map ( |( _name, value) | value)
284
+ }
267
285
}
268
286
269
287
/// First, recurse through children to find the smallest
0 commit comments