class GirFFI::Builders::FunctionBuilder

Implements the creation of a Ruby function definition out of a GIR IFunctionInfo.

Public Class Methods

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

Public Instance Methods

generate() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 16
def generate
  vargen = GirFFI::VariableNameGenerator.new
  @argument_builders = @info.args.map {|arg| ArgumentBuilder.new vargen, arg }
  @return_value_builder = ReturnValueBuilder.new(vargen,
                                                 @info.return_type,
                                                 @info.constructor?,
                                                 @info.skip_return?)

  link_array_length_arguments
  setup_error_argument vargen
  return filled_out_template
end

Private Instance Methods

capture() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 88
def capture
  if has_capture?
    "#{@return_value_builder.callarg} = "
  else
    ""
  end
end
cleanup() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 105
def cleanup
  @argument_builders.map {|item| item.cleanup}
end
filled_out_template() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 53
def filled_out_template
  meta = @info.method? ? '' : "self."

  code = "def #{meta}#{@info.safe_name} #{method_arguments.join(', ')}\n"
  code << method_body
  code << "\nend\n"
end
function_call() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 67
def function_call
  "#{capture}#{libmodule}.#{@info.symbol} #{function_call_arguments.join(', ')}"
end
function_call_arguments() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 75
def function_call_arguments
  ca = @argument_builders.map(&:callarg)
  ca << @errarg.callarg
  ca.unshift "self" if @info.method?
  ca.compact
end
has_capture?() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 118
def has_capture?
  @return_value_builder.is_relevant?
end
has_return_values?() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 114
def has_return_values?
  !return_values.empty?
end
libmodule() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 31
def libmodule
  Object.const_get(@info.safe_namespace)::Lib
end
method_arguments() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 71
def method_arguments
  @argument_builders.map(&:inarg).compact
end
method_body() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 61
def method_body
  lines = preparation << function_call << post_processing << cleanup
  lines << "return #{return_values.join(', ')}" if has_return_values?
  lines.flatten.join("\n").indent
end
post_processing() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 96
def post_processing
  # FIXME: Sorting knows too much about internals of ArgumentBuilder.
  args = @argument_builders.sort_by {|arg| arg.type_info.array_length}
  args << @return_value_builder
  args.unshift @errarg

  args.map {|arg| arg.post}
end
preparation() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 82
def preparation
  pr = @argument_builders.map(&:pre)
  pr << @errarg.pre
  pr.flatten
end
return_values() click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 109
def return_values
  @return_values ||= ([@return_value_builder.retval] +
                      @argument_builders.map(&:retval)).compact
end
setup_error_argument(vargen) click to toggle source
# File lib/gir_ffi/builders/function_builder.rb, line 48
def setup_error_argument vargen
  klass = @info.throws? ? ErrorArgumentBuilder : NullArgumentBuilder
  @errarg = klass.new vargen, nil, nil, :error
end