@@ -13,6 +13,7 @@ use crate::visitor::class;
1313use crate :: visitor:: enumeration;
1414use crate :: visitor:: function;
1515use crate :: visitor:: global;
16+ use crate :: visitor:: unions;
1617pub struct ClangAstDataProvider {
1718 pub paths : Vec < String > ,
1819}
@@ -69,6 +70,7 @@ fn select_clang_ast_objects(
6970 match table. as_str ( ) {
7071 "classes" => select_classes ( env, path, fields_names, titles, fields_values) ,
7172 "enums" => select_enumss ( env, path, fields_names, titles, fields_values) ,
73+ "unions" => select_unions ( env, path, fields_names, titles, fields_values) ,
7274 "functions" => select_functions ( env, path, fields_names, titles, fields_values) ,
7375 "globals" => select_variables ( env, path, fields_names, titles, fields_values) ,
7476 _ => select_values ( env, titles, fields_values) ,
@@ -245,6 +247,70 @@ fn select_enumss(
245247 Ok ( Group { rows } )
246248}
247249
250+ fn select_unions (
251+ env : & mut Environment ,
252+ path : & str ,
253+ fields_names : & [ String ] ,
254+ titles : & [ String ] ,
255+ fields_values : & [ Box < dyn Expression > ] ,
256+ ) -> Result < Group , String > {
257+ let mut rows: Vec < Row > = vec ! [ ] ;
258+
259+ let names_len = fields_names. len ( ) as i64 ;
260+ let values_len = fields_values. len ( ) as i64 ;
261+ let padding = names_len - values_len;
262+
263+ let ast_unions = unions:: select_clang_unions ( path) ;
264+ for union_node in ast_unions. iter ( ) {
265+ let mut values: Vec < Value > = Vec :: with_capacity ( fields_names. len ( ) ) ;
266+
267+ for index in 0 ..names_len {
268+ let field_name = & fields_names[ index as usize ] ;
269+
270+ if ( index - padding) >= 0 {
271+ let value = & fields_values[ ( index - padding) as usize ] ;
272+ if value. as_any ( ) . downcast_ref :: < SymbolExpression > ( ) . is_none ( ) {
273+ let evaluated = evaluate_expression ( env, value, titles, & values) ?;
274+ values. push ( evaluated) ;
275+ continue ;
276+ }
277+ }
278+
279+ if field_name == "name" {
280+ values. push ( Value :: Text ( union_node. name . to_owned ( ) ) ) ;
281+ continue ;
282+ }
283+
284+ if field_name == "file" {
285+ values. push ( Value :: Text ( union_node. location . file . to_string ( ) ) ) ;
286+ continue ;
287+ }
288+
289+ if field_name == "line" {
290+ values. push ( Value :: Integer ( union_node. location . line . into ( ) ) ) ;
291+ continue ;
292+ }
293+
294+ if field_name == "column" {
295+ values. push ( Value :: Integer ( union_node. location . column . into ( ) ) ) ;
296+ continue ;
297+ }
298+
299+ if field_name == "offset" {
300+ values. push ( Value :: Integer ( union_node. location . offset . into ( ) ) ) ;
301+ continue ;
302+ }
303+
304+ values. push ( Value :: Null ) ;
305+ }
306+
307+ let row = Row { values } ;
308+ rows. push ( row) ;
309+ }
310+
311+ Ok ( Group { rows } )
312+ }
313+
248314fn select_functions (
249315 env : & mut Environment ,
250316 path : & str ,
0 commit comments