class GirFFI::Builders::FieldBuilder

Creates field getter and setter code for a given IFieldInfo.

Attributes

container_class[R]
info[R]

Public Class Methods

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

Public Instance Methods

build() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 238
def build
  setup_getter
  setup_setter
end
container_defines_getter_method?() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 250
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 261
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 267
      def setter_def
        builder = setter_builder

        field_ptr = builder.new_variable

        <<~CODE
          def #{info.name}= #{builder.method_argument_name}
            #{field_ptr} = @struct.to_ptr
            #{builder.pre_conversion.join("\n  ")}
            #{value_storage(field_ptr, builder)}
          end
        CODE
      end
setup_getter() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 243
def setup_getter
  return if container_defines_getter_method?
  return if hidden_struct_type?

  container_class.class_eval getter_def, __FILE__, __LINE__
end
setup_setter() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 254
def setup_setter
  return unless info.writable?
  return if hidden_struct_type?

  container_class.class_eval setter_def, __FILE__, __LINE__
end

Private Instance Methods

container_info() click to toggle source

TODO: Inject container_info on initialization

# File lib/gir_ffi/builders/field_builder.rb, line 295
def container_info
  @container_info ||= info.container
end
field_argument_info() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 303
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 299
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 288
def field_type_tag
  @field_type_tag ||= field_type.tag_or_class
end
hidden_struct_type?() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 312
def hidden_struct_type?
  field_type.hidden_struct_type?
end
setter_builder() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 307
def setter_builder
  @setter_builder ||= ArgumentBuilder.new(VariableNameGenerator.new,
                                          field_argument_info)
end
value_storage(typed_ptr, builder) click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 283
def value_storage(typed_ptr, builder)
  PointerValueConvertor.new(field_type_tag)
    .value_to_pointer(typed_ptr, builder.call_argument_name, info.offset)
end