class Protobuf::Generators::FileGenerator

Attributes

output_file[R]

Public Class Methods

new(*args) click to toggle source
Calls superclass method Protobuf::Generators::Base::new
# File lib/protobuf/generators/file_generator.rb, line 11
def initialize(*args)
  super
  @output_file = ::Google::Protobuf::Compiler::CodeGeneratorResponse::File.new(:name => file_name)
  @extension_fields = Hash.new { |h, k| h[k] = [] }
  @known_messages = []
  @dangling_messages = {}
end

Public Instance Methods

compile() click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 23
def compile
  run_once(:compile) do
    map_extensions(descriptor, [descriptor.package])

    print_file_comment
    print_generic_requires
    # print_import_requires

    print_package do
      group = GroupGenerator.new(current_indent)
      group.add_enums(descriptor.enum_type, :namespace => [descriptor.package])
      group.add_message_declarations(descriptor.message_type)
      group.add_messages(descriptor.message_type, :extension_fields => @extension_fields, :namespace => [descriptor.package])
      group.add_extended_messages(unknown_extensions)
      group.add_services(descriptor.service)

      group.add_header(:enum, 'Enum Classes')
      group.add_header(:message_declaration, 'Message Classes')
      group.add_header(:message, 'Message Fields')
      group.add_header(:extended_message, 'Extended Message Fields')
      group.add_header(:service, 'Service Classes')
      print group.to_s
    end

  end
end
file_name() click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 19
def file_name
  convert_filename(descriptor.name, false)
end
generate_output_file() click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 56
def generate_output_file
  compile
  output_file.content = to_s
  output_file
end
map_extensions(descriptor, namespaces) click to toggle source

Recursively map out all extensions known in this file. The key is the type_name of the message being extended, and the value is an array of field descriptors.

# File lib/protobuf/generators/file_generator.rb, line 66
def map_extensions(descriptor, namespaces)
  # Record all the message descriptor name's we encounter (should be the whole tree).
  if descriptor.is_a?(::Google::Protobuf::DescriptorProto)
    if fully_qualified_token?(descriptor.name)
      @known_messages << descriptor.name
    else
      fully_qualified_namespace = ".#{namespaces.join('.')}"
      @known_messages << fully_qualified_namespace
    end
  end

  descriptor.extension.each do |field_descriptor|
    @extension_fields[field_descriptor.extendee] << field_descriptor
  end

  [:message_type, :nested_type].each do |type|
    next unless descriptor.respond_to_has_and_present?(type)

    descriptor.public_send(type).each do |type_descriptor|
      map_extensions(type_descriptor, (namespaces + [type_descriptor.name]))
    end
  end
end
print_file_comment() click to toggle source
print_generic_requires() click to toggle source
print_import_requires() click to toggle source
print_package(&block) click to toggle source
unknown_extensions() click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 50
def unknown_extensions
  @unknown_extensions ||= @extension_fields.reject do |k, _|
    @known_messages.include?(k)
  end
end

Private Instance Methods

convert_filename(filename, for_require = true) click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 125
def convert_filename(filename, for_require = true)
  filename.sub(/\.proto/, (for_require ? '.pb' : '.pb.rb'))
end
fully_qualified_token?(token) click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 129
def fully_qualified_token?(token)
  token[0] == '.'
end