@@ -338,14 +338,99 @@ def generate_object(writer, object)
338338 start_modules ( writer , namespaces )
339339
340340 if object . struct?
341+ is_root_table = false
341342 parent = "::FlatBuffers::Struct"
342343 else
343- parent = "::FlatBuffers::Table"
344+ is_root_table = ( object . name == @schema . root_table &.name )
345+ if is_root_table
346+ parent = "::FlatBuffers::RootTable"
347+ else
348+ parent = "::FlatBuffers::Table"
349+ end
344350 end
345351 generate_documentation ( writer , object . documentation )
346352 writer << "class #{ to_class_name ( name ) } < #{ parent } "
347353 writer . indent
348354
355+ if is_root_table
356+ writer << "class << self"
357+ writer . indent
358+
359+ writer << "def file_identifier"
360+ writer . indent
361+ writer << to_ruby_code ( @schema . file_ident )
362+ writer . end
363+ writer << ""
364+ writer << "def file_extension"
365+ writer . indent
366+ writer << to_ruby_code ( @schema . file_ext )
367+ writer . end
368+
369+ writer . end
370+ writer << ""
371+ end
372+
373+ generate_object_fields ( writer , object )
374+
375+ writer << "Data = define_data"
376+ writer << ""
377+
378+ generate_object_methods ( writer , object , namespaces )
379+
380+ writer . end # class
381+
382+ end_modules ( writer , namespaces )
383+ end
384+
385+ def generate_object_fields ( writer , object )
386+ writer << "FIELDS = ["
387+ writer . indent
388+
389+ offset_sorted_fields = object . fields &.sort_by ( &:offset )
390+ offset_sorted_fields &.each do |field |
391+ # Skip writing deprecated fields altogether.
392+ next if field . deprecated?
393+
394+ method_name = to_method_name ( field . name )
395+ type = field . type
396+ base_type = type . base_type
397+ if base_type == Reflection ::BaseType ::BOOL
398+ method_name = "#{ method_name } ?" . delete_prefix ( "is_" )
399+ end
400+ ruby_offset = to_ruby_code ( field . offset )
401+ case base_type
402+ when Reflection ::BaseType ::OBJ
403+ object = @schema . objects [ type . index ]
404+ *object_namespaces , object_name = denamespace ( object . name )
405+ klass = to_absolute_class_name ( @outer_namespaces ,
406+ object_namespaces ,
407+ object_name )
408+ ruby_base_type = to_ruby_code ( klass )
409+ when Reflection ::BaseType ::VECTOR
410+ element_base_type = type . element
411+ if element_base_type == Reflection ::BaseType ::OBJ
412+ object = @schema . objects [ type . index ]
413+ *object_namespaces , object_name = denamespace ( object . name )
414+ klass = to_absolute_class_name ( @outer_namespaces ,
415+ object_namespaces ,
416+ object_name )
417+ ruby_base_type = "[#{ to_ruby_code ( klass ) } ]"
418+ else
419+ ruby_base_type = "[:#{ to_lower_snake_case ( element_base_type . name ) } ]"
420+ end
421+ else
422+ ruby_base_type = ":#{ to_lower_snake_case ( base_type . name ) } "
423+ end
424+ writer << ( "::FlatBuffers::Field.new(" +
425+ ":#{ method_name } , #{ ruby_offset } , #{ ruby_base_type } )," )
426+ end
427+
428+ writer . unindent
429+ writer << "]"
430+ writer << ""
431+ end
432+
433+ def generate_object_methods ( writer , object , namespaces )
349434 n_processed_fields = 0
350435 object . fields &.each do |field |
351436 # Skip writing deprecated fields altogether.
@@ -474,10 +559,6 @@ def generate_object(writer, object)
474559
475560 n_processed_fields += 1
476561 end
477-
478- writer . end # class
479-
480- end_modules ( writer , namespaces )
481562 end
482563
483564 def generate_documentation ( writer , documentation )
0 commit comments