class GirFFI::Builders::FieldBuilder

Creates field getter and setter code for a given IFieldInfo.

Attributes

info[R]

Public Class Methods

new(field_info) click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 212
def initialize(field_info)
  @info = field_info
end

Public Instance Methods

build() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 216
def build
  setup_getter
  setup_setter
end
container_defines_getter_method?() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 225
def container_defines_getter_method?
  container_info.find_instance_method info.name
end
getter_def() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 233
def getter_def
  getter_builder = GetterBuilder.new(info)
  getter_builder.method_definition
end
setter_def() click to toggle source

TODO: Use MethodTemplate

# File lib/gir_ffi/builders/field_builder.rb, line 239
      def setter_def
        builder = setter_builder

        field_ptr = builder.new_variable
        typed_ptr = builder.new_variable

        "        def #{info.name}= #{builder.method_argument_name}
          #{field_ptr} = @struct.to_ptr + #{info.offset}
          #{typed_ptr} = GirFFI::InOutPointer.new(#{field_type_tag}, #{field_ptr})
          #{builder.pre_conversion.join("\n          ")}
          #{typed_ptr}.set_value #{builder.call_argument_name}
        end
".reset_indentation
      end
setup_getter() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 221
def setup_getter
  container_class.class_eval getter_def unless container_defines_getter_method?
end
setup_setter() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 229
def setup_setter
  container_class.class_eval setter_def if info.writable?
end

Private Instance Methods

container_class() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 261
def container_class
  @container_class ||= container_module.const_get(container_info.safe_name)
end
container_info() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 269
def container_info
  @container_info ||= info.container
end
container_module() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 265
def container_module
  @container_module ||= Object.const_get(container_info.safe_namespace)
end
field_argument_info() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 277
def field_argument_info
  @field_argument_info ||= FieldArgumentInfo.new 'value', field_type
end
field_type() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 273
def field_type
  @field_type ||= @info.field_type
end
field_type_tag() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 257
def field_type_tag
  @field_type_tag ||= info.field_type.tag_or_class.inspect
end
setter_builder() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 281
def setter_builder
  @setter_builder ||= ArgumentBuilder.new(VariableNameGenerator.new,
                                          field_argument_info)
end