class GirFFI::Builders::ArgumentBuilderCollection
Class representing the argument and return value builders for a method, callback mapping function or marshaller. Implements collecting the conversion code and parameter and variable names for use by function builders.
Attributes
return_value_builder[R]
Public Class Methods
new(return_value_builder, argument_builders, receiver_builder: nil, error_argument_builder: nil)
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 12 def initialize(return_value_builder, argument_builders, receiver_builder: nil, error_argument_builder: nil) @receiver_builder = receiver_builder @error_argument_builder = error_argument_builder @base_argument_builders = argument_builders @return_value_builder = return_value_builder set_up_argument_relations end
Public Instance Methods
call_argument_names()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 34 def call_argument_names @call_argument_names ||= argument_builders.map(&:call_argument_name).compact end
capture_variable_names()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 29 def capture_variable_names @capture_variable_names ||= all_builders.map(&:capture_variable_name).compact end
has_return_values?()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 56 def has_return_values? return_value_names.any? end
method_argument_names()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 38 def method_argument_names @method_argument_names ||= begin base, block = split_off_block_argument args = base_argument_names(base) args << "&#{block.method_argument_name}" if block args end end
parameter_preparation()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 21 def parameter_preparation builders_for_pre_conversion.map(&:pre_conversion).flatten end
return_value_conversion()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 25 def return_value_conversion builders_for_post_conversion.map(&:post_conversion).flatten end
return_value_name()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 48 def return_value_name return_value_builder.return_value_name end
return_value_names()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 52 def return_value_names @return_value_names ||= all_builders.map(&:return_value_name).compact end
Private Instance Methods
all_builders()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 102 def all_builders @all_builders ||= [return_value_builder] + argument_builders end
argument_builders()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 62 def argument_builders @argument_builders ||= @base_argument_builders.dup.tap do |builders| builders.unshift @receiver_builder if @receiver_builder builders.push @error_argument_builder if @error_argument_builder end end
base_argument_names(arguments)
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 134 def base_argument_names(arguments) required_found = false arguments.reverse.map do |it| name = it.method_argument_name if it.allow_none? && !required_found "#{name} = nil" else required_found = true name end end.compact.reverse end
builders_for_post_conversion()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 114 def builders_for_post_conversion @builders_for_post_conversion ||= sorted_base_argument_builders.dup.tap do |builders| builders.unshift @receiver_builder if @receiver_builder builders.unshift @error_argument_builder if @error_argument_builder builders.push return_value_builder end end
builders_for_pre_conversion()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 106 def builders_for_pre_conversion @builders_for_pre_conversion ||= sorted_base_argument_builders.dup.tap do |builders| builders.unshift @receiver_builder if @receiver_builder builders.push @error_argument_builder if @error_argument_builder end end
set_up_argument_relations()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 69 def set_up_argument_relations set_up_user_data_relations set_up_destroy_notifier_relations set_up_length_argument_relations end
set_up_destroy_notifier_relations()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 83 def set_up_destroy_notifier_relations @base_argument_builders.each do |bldr| if (idx = bldr.destroy_idx) >= 0 @base_argument_builders[idx].mark_as_destroy_notifier bldr end end end
set_up_length_argument_relations()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 91 def set_up_length_argument_relations all_builders.each do |bldr| idx = bldr.array_length_idx next if idx < 0 other = @base_argument_builders[idx] bldr.length_arg = other other.array_arg = bldr end end
set_up_user_data_relations()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 75 def set_up_user_data_relations @base_argument_builders.each do |bldr| if (idx = bldr.closure_idx) >= 0 @base_argument_builders[idx].mark_as_user_data bldr end end end
sorted_base_argument_builders()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 123 def sorted_base_argument_builders @sorted_base_argument_builders ||= @base_argument_builders .sort_by.with_index { |arg, i| [arg.array_length_idx, i] } end
split_off_block_argument()
click to toggle source
# File lib/gir_ffi/builders/argument_builder_collection.rb, line 128 def split_off_block_argument builders_with_name = argument_builders.select(&:method_argument_name) blocks, base = builders_with_name.partition(&:block_argument?) return base, blocks.first end