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 12
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 16
def build
  unless container_info.find_instance_method info.name
    container_class.class_eval getter_def
  end
  container_class.class_eval setter_def if info.writable?
end
getter_def() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 23
      def getter_def
        builder = return_value_builder

        field_ptr = builder.new_variable
        typed_ptr = builder.new_variable

        return "        def #{info.name}
          #{field_ptr} = @struct.to_ptr + #{info.offset}
          #{typed_ptr} = GirFFI::InOutPointer.new(#{field_type_tag_or_class.inspect}, #{field_ptr})
          #{builder.callarg} = #{typed_ptr}.to_value
          #{builder.post.join("\n")}
          #{builder.retval}
        end
".reset_indentation
      end
setter_def() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 40
      def setter_def
        builder = setter_builder

        field_ptr = builder.new_variable
        typed_ptr = builder.new_variable

        return "        def #{info.name}= #{builder.inarg}
          #{field_ptr} = @struct.to_ptr + #{info.offset}
          #{typed_ptr} = GirFFI::InOutPointer.new(#{field_type_tag_or_class.inspect}, #{field_ptr})
          #{builder.pre.join("\n          ")}
          #{typed_ptr}.set_value #{builder.callarg}
        end
".reset_indentation
      end

Private Instance Methods

container_class() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 66
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 74
def container_info
  @container_info ||= info.container
end
container_module() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 70
def container_module
  @container_module ||= Object.const_get(container_info.safe_namespace)
end
field_symbol() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 78
def field_symbol
  @info.name.to_sym
end
field_type_tag_or_class() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 62
def field_type_tag_or_class
  @field_type_tag_or_class ||= info.field_type.tag_or_class
end
return_value_builder() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 82
def return_value_builder
  vargen = VariableNameGenerator.new
  @rv_builder ||= ReturnValueBuilder.new vargen, @info.field_type
end
setter_builder() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 87
def setter_builder
  vargen = VariableNameGenerator.new
  argument_info = SetterArgumentInfo.new "value", @info.field_type
  ArgumentBuilder.new vargen, argument_info
end
struct_class() click to toggle source
# File lib/gir_ffi/builders/field_builder.rb, line 58
def struct_class
  container_class::Struct
end