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
# File lib/protobuf/generators/file_generator.rb, line 90 def print_file_comment puts "# encoding: utf-8" puts puts "##" puts "# This file is auto-generated. DO NOT EDIT!" puts "#" end
print_generic_requires()
click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 98 def print_generic_requires print_require("protobuf/message") print_require("protobuf/rpc/service") if descriptor.service.count > 0 puts end
print_import_requires()
click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 104 def print_import_requires return if descriptor.dependency.empty? header "Imports" descriptor.dependency.each do |dependency| print_require(convert_filename(dependency)) end puts end
print_package(&block)
click to toggle source
# File lib/protobuf/generators/file_generator.rb, line 116 def print_package(&block) namespaces = descriptor.package.split('.') namespaces.reverse.reduce(block) do |previous, namespace| -> { print_module(namespace, &previous) } end.call end
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