gir_ffi 0.6.7 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/{History.txt → Changelog.md} +93 -61
  3. data/{DESIGN.rdoc → DESIGN.md} +7 -7
  4. data/README.md +5 -7
  5. data/TODO.md +90 -0
  6. data/lib/ffi-glib.rb +0 -1
  7. data/lib/ffi-glib/array.rb +13 -29
  8. data/lib/ffi-glib/array_methods.rb +13 -0
  9. data/lib/ffi-glib/container_class_methods.rb +6 -1
  10. data/lib/ffi-glib/hash_table.rb +3 -2
  11. data/lib/ffi-glib/list.rb +3 -17
  12. data/lib/ffi-glib/list_methods.rb +22 -3
  13. data/lib/ffi-glib/ptr_array.rb +19 -19
  14. data/lib/ffi-glib/s_list.rb +3 -17
  15. data/lib/ffi-gobject.rb +10 -17
  16. data/lib/ffi-gobject/object.rb +19 -9
  17. data/lib/ffi-gobject/object_class.rb +14 -0
  18. data/lib/ffi-gobject/ruby_closure.rb +4 -5
  19. data/lib/ffi-gobject/value.rb +7 -5
  20. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  21. data/lib/gir_ffi-base.rb +0 -2
  22. data/lib/gir_ffi-base/gobject.rb +1 -0
  23. data/lib/gir_ffi-base/gobject/lib.rb +1 -1
  24. data/lib/gir_ffi.rb +2 -0
  25. data/lib/gir_ffi/arg_helper.rb +18 -8
  26. data/lib/gir_ffi/builders/argument_builder.rb +62 -55
  27. data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
  28. data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
  29. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
  31. data/lib/gir_ffi/builders/callback_builder.rb +19 -9
  32. data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
  33. data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
  34. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
  35. data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
  36. data/lib/gir_ffi/builders/enum_builder.rb +16 -16
  37. data/lib/gir_ffi/builders/field_builder.rb +36 -15
  38. data/lib/gir_ffi/builders/function_builder.rb +32 -27
  39. data/lib/gir_ffi/builders/interface_builder.rb +14 -4
  40. data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
  41. data/lib/gir_ffi/builders/module_builder.rb +22 -35
  42. data/lib/gir_ffi/builders/null_convertor.rb +9 -0
  43. data/lib/gir_ffi/builders/object_builder.rb +11 -14
  44. data/lib/gir_ffi/builders/property_builder.rb +107 -9
  45. data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
  46. data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
  47. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
  48. data/lib/gir_ffi/builders/signal_builder.rb +18 -58
  49. data/lib/gir_ffi/builders/struct_builder.rb +1 -2
  50. data/lib/gir_ffi/builders/type_builder.rb +1 -0
  51. data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
  52. data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
  53. data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
  54. data/lib/gir_ffi/builders/with_layout.rb +10 -8
  55. data/lib/gir_ffi/builders/with_methods.rb +1 -1
  56. data/lib/gir_ffi/callback_base.rb +42 -8
  57. data/lib/gir_ffi/class_base.rb +1 -2
  58. data/lib/gir_ffi/enum_base.rb +26 -4
  59. data/lib/gir_ffi/error_argument_info.rb +21 -0
  60. data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
  61. data/lib/gir_ffi/g_type.rb +25 -0
  62. data/lib/gir_ffi/in_out_pointer.rb +3 -14
  63. data/lib/gir_ffi/in_pointer.rb +20 -21
  64. data/lib/gir_ffi/info_ext.rb +2 -0
  65. data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
  66. data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
  67. data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
  68. data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
  69. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
  70. data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
  71. data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
  72. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
  73. data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
  74. data/lib/gir_ffi/interface_base.rb +8 -3
  75. data/lib/gir_ffi/module_base.rb +3 -5
  76. data/lib/gir_ffi/object_base.rb +8 -0
  77. data/lib/gir_ffi/receiver_argument_info.rb +21 -0
  78. data/lib/gir_ffi/receiver_type_info.rb +27 -0
  79. data/lib/gir_ffi/return_value_info.rb +23 -0
  80. data/lib/gir_ffi/signal_base.rb +1 -1
  81. data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
  82. data/lib/gir_ffi/struct_base.rb +10 -9
  83. data/lib/gir_ffi/type_base.rb +1 -0
  84. data/lib/gir_ffi/type_map.rb +3 -0
  85. data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
  86. data/lib/gir_ffi/union_base.rb +4 -21
  87. data/lib/gir_ffi/user_data_argument_info.rb +21 -0
  88. data/lib/gir_ffi/user_data_type_info.rb +17 -0
  89. data/lib/gir_ffi/user_defined_type_info.rb +18 -4
  90. data/lib/gir_ffi/version.rb +1 -1
  91. data/lib/gir_ffi/vfunc_base.rb +8 -0
  92. data/lib/gir_ffi/vfunc_implementation.rb +11 -0
  93. data/lib/gir_ffi/zero_terminated.rb +18 -24
  94. data/test/base_test_helper.rb +2 -3
  95. data/test/ffi-glib/array_test.rb +3 -3
  96. data/test/ffi-glib/ruby_closure_test.rb +3 -3
  97. data/test/ffi-gobject/value_test.rb +15 -1
  98. data/test/ffi-gobject_test.rb +2 -1
  99. data/test/gir_ffi/arg_helper_test.rb +21 -2
  100. data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
  101. data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
  102. data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
  103. data/test/gir_ffi/builders/field_builder_test.rb +18 -3
  104. data/test/gir_ffi/builders/function_builder_test.rb +30 -12
  105. data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
  106. data/test/gir_ffi/builders/module_builder_test.rb +0 -39
  107. data/test/gir_ffi/builders/object_builder_test.rb +27 -27
  108. data/test/gir_ffi/builders/property_builder_test.rb +110 -0
  109. data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
  110. data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
  111. data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
  112. data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
  113. data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
  114. data/test/gir_ffi/g_type_test.rb +29 -0
  115. data/test/gir_ffi/in_pointer_test.rb +28 -9
  116. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
  117. data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
  118. data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
  119. data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
  120. data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
  121. data/test/gir_ffi/interface_base_test.rb +9 -3
  122. data/test/gir_ffi/object_base_test.rb +1 -2
  123. data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
  124. data/test/gir_ffi/type_map_test.rb +1 -1
  125. data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
  126. data/test/gir_ffi_test.rb +5 -5
  127. data/test/gir_ffi_test_helper.rb +4 -0
  128. data/test/integration/generated_gimarshallingtests_test.rb +163 -59
  129. data/test/integration/generated_gobject_test.rb +21 -8
  130. data/test/integration/generated_pango_test.rb +2 -2
  131. data/test/integration/generated_regress_test.rb +361 -101
  132. data/test/lib/autogen.sh +5 -1
  133. metadata +51 -35
  134. data/TODO.rdoc +0 -63
  135. data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
  136. data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -8,22 +8,32 @@ module GirFFI
8
8
  class InterfaceBuilder < RegisteredTypeBuilder
9
9
  include WithMethods
10
10
 
11
+ def interface_struct
12
+ @interface_struct ||= Builder.build_class iface_struct_info
13
+ end
14
+
11
15
  private
12
16
 
13
17
  # FIXME: The word 'class' is not really correct.
14
18
  def instantiate_class
15
- @klass = optionally_define_constant(namespace_module, @classname) do
16
- ::Module.new
17
- end
19
+ klass
18
20
  setup_module unless already_set_up
19
21
  end
20
22
 
23
+ def klass
24
+ @klass ||= get_or_define_module namespace_module, @classname
25
+ end
26
+
21
27
  def setup_module
22
- @klass.extend InterfaceBase
28
+ klass.extend InterfaceBase
23
29
  setup_constants
24
30
  stub_methods
25
31
  setup_gtype_getter
26
32
  end
33
+
34
+ def iface_struct_info
35
+ @iface_struct_info ||= info.iface_struct
36
+ end
27
37
  end
28
38
  end
29
39
  end
@@ -1,4 +1,5 @@
1
- require 'gir_ffi/builders/return_value_builder'
1
+ require 'gir_ffi/builders/callback_argument_builder'
2
+ require 'gir_ffi/builders/callback_return_value_builder'
2
3
 
3
4
  module GirFFI
4
5
  module Builders
@@ -6,33 +7,71 @@ module GirFFI
6
7
  # handler. This method converts arguments from C to Ruby, and the
7
8
  # result from Ruby to C.
8
9
  class MappingMethodBuilder
9
- # TODO: Make CallbackArgumentBuilder accept argument name
10
- # TODO: Fix name of #post method
11
- class CallbackArgumentBuilder < ReturnValueBuilder
12
- def post
13
- if specialized_type_tag == :enum
14
- ["#{retname} = #{argument_class_name}[#{callarg}]"]
15
- else
16
- super
10
+ def self.for_callback argument_infos, return_type_info
11
+ vargen = VariableNameGenerator.new
12
+ argument_builders = argument_infos.map {|arg|
13
+ CallbackArgumentBuilder.new vargen, arg }
14
+ set_up_argument_relations argument_infos, argument_builders
15
+ new return_type_info, vargen, argument_builders
16
+ end
17
+
18
+ def self.for_signal receiver_info, argument_infos, user_data_info, return_type_info
19
+ vargen = VariableNameGenerator.new
20
+
21
+ receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
22
+ argument_builders = argument_infos.map {|arg|
23
+ CallbackArgumentBuilder.new vargen, arg }
24
+ user_data_builder = CallbackArgumentBuilder.new vargen, user_data_info
25
+
26
+ set_up_argument_relations argument_infos, argument_builders
27
+ user_data_builder.is_closure = true
28
+
29
+ argument_builders.unshift receiver_builder
30
+ argument_builders.push user_data_builder
31
+
32
+ new return_type_info, vargen, argument_builders
33
+ end
34
+
35
+ def self.for_vfunc receiver_info, argument_infos, return_type_info
36
+ vargen = VariableNameGenerator.new
37
+
38
+ receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
39
+ argument_builders = argument_infos.map {|arg|
40
+ CallbackArgumentBuilder.new vargen, arg }
41
+
42
+ set_up_argument_relations argument_infos, argument_builders
43
+
44
+ argument_builders.unshift receiver_builder
45
+
46
+ new return_type_info, vargen, argument_builders
47
+ end
48
+
49
+ def self.set_up_argument_relations argument_infos, argument_builders
50
+ argument_infos.each do |arg|
51
+ if (idx = arg.closure) >= 0
52
+ argument_builders[idx].is_closure = true
17
53
  end
18
54
  end
55
+ argument_builders.each do |bldr|
56
+ if (idx = bldr.array_length_idx) >= 0
57
+ other = argument_builders[idx]
19
58
 
20
- def retval
21
- if specialized_type_tag == :enum
22
- retname
23
- else
24
- super
59
+ bldr.length_arg = other
60
+ other.array_arg = bldr
25
61
  end
26
62
  end
27
63
  end
28
64
 
29
- def initialize argument_infos, return_type_info
30
- @argument_infos = argument_infos
65
+ def initialize return_type_info, vargen, argument_builders
66
+ @vargen = vargen
67
+ @argument_builders = argument_builders
68
+
31
69
  @return_type_info = return_type_info
32
70
  end
33
71
 
34
- attr_reader :argument_infos
35
72
  attr_reader :return_type_info
73
+ attr_reader :vargen
74
+ attr_reader :argument_builders
36
75
 
37
76
  def method_definition
38
77
  code = "def self.call_with_argument_mapping(#{method_arguments.join(', ')})"
@@ -41,46 +80,59 @@ module GirFFI
41
80
  end
42
81
 
43
82
  def method_lines
44
- lines = argument_builders.map(&:post).flatten +
45
- ["#{capture}_proc.call(#{call_arguments.join(', ')})"] +
46
- return_value_builder.post
47
- lines << "return #{return_value_builder.retval}" if return_value_builder.is_relevant?
48
- lines
83
+ parameter_preparation + call_to_proc + return_value_conversion + return_value
84
+ end
85
+
86
+ def return_value
87
+ if return_value_builder.is_relevant?
88
+ ["return #{return_value_builder.return_value_name}"]
89
+ else
90
+ []
91
+ end
92
+ end
93
+
94
+ def return_value_conversion
95
+ all_builders.map(&:post_conversion).flatten
96
+ end
97
+
98
+ def call_to_proc
99
+ ["#{capture}_proc.call(#{call_arguments.join(', ')})"]
100
+ end
101
+
102
+ def parameter_preparation
103
+ argument_builders.sort_by {|arg|
104
+ arg.type_info.array_length}.map(&:pre_conversion).flatten
49
105
  end
50
106
 
51
107
  def capture
52
- @capture ||= return_value_builder.is_relevant? ?
53
- "#{return_value_builder.callarg} = " :
108
+ @capture ||= capture_variable_names.any? ?
109
+ "#{capture_variable_names.join(", ")} = " :
54
110
  ""
55
111
  end
56
112
 
57
- def call_arguments
58
- @call_arguments ||= argument_builders.map(&:retval)
113
+ def capture_variable_names
114
+ @capture_variable_names ||=
115
+ all_builders.map(&:capture_variable_name).compact
59
116
  end
60
117
 
61
- def method_arguments
62
- @method_arguments ||= argument_builders.map(&:callarg).unshift('_proc')
118
+ def all_builders
119
+ @all_builders ||= [return_value_builder] + argument_builders
63
120
  end
64
121
 
65
- def return_value_builder
66
- @return_value_builder ||= ReturnValueBuilder.new(vargen, return_type_info)
122
+ def call_arguments
123
+ @call_arguments ||= argument_builders.map(&:call_argument_name).compact
67
124
  end
68
125
 
69
- def argument_builders
70
- unless defined?(@argument_builders)
71
- @argument_builders = argument_infos.map {|arg|
72
- CallbackArgumentBuilder.new vargen, arg.argument_type }
73
- argument_infos.each do |arg|
74
- if (idx = arg.closure) >= 0
75
- @argument_builders[idx].is_closure = true
76
- end
77
- end
78
- end
79
- @argument_builders
126
+ def method_arguments
127
+ @method_arguments ||= argument_builders.map(&:method_argument_name).unshift('_proc')
128
+ end
129
+
130
+ def return_value_info
131
+ @return_value_info ||= ReturnValueInfo.new(return_type_info)
80
132
  end
81
133
 
82
- def vargen
83
- @vargen ||= GirFFI::VariableNameGenerator.new
134
+ def return_value_builder
135
+ @return_value_builder ||= CallbackReturnValueBuilder.new(vargen, return_value_info)
84
136
  end
85
137
  end
86
138
  end
@@ -18,44 +18,40 @@ module GirFFI
18
18
  end
19
19
 
20
20
  def generate
21
- build_module
21
+ modul
22
22
  end
23
23
 
24
24
  def setup_method method
25
25
  go = function_introspection_data method.to_s
26
+ return false unless go
26
27
 
27
- return false if go.nil?
28
-
29
- modul = build_module
30
-
31
- Builder.attach_ffi_function libmodule, go
32
- definition = function_definition go
33
- modul.class_eval definition
28
+ Builder.attach_ffi_function lib, go
29
+ modul.class_eval FunctionBuilder.new(go).generate
34
30
 
35
31
  true
36
32
  end
37
33
 
38
34
  def build_namespaced_class classname
39
35
  info = gir.find_by_name @namespace, classname.to_s
40
- if info.nil?
36
+ unless info
41
37
  raise NameError.new(
42
38
  "Class #{classname} not found in namespace #{@namespace}")
43
39
  end
44
40
  Builder.build_class info
45
41
  end
46
42
 
47
- def build_module
43
+ private
44
+
45
+ def modul
48
46
  unless defined? @module
49
47
  build_dependencies
50
48
  instantiate_module
51
- setup_lib_for_ffi
49
+ setup_lib_for_ffi unless lib_already_set_up
52
50
  setup_module unless already_set_up
53
51
  end
54
52
  @module
55
53
  end
56
54
 
57
- private
58
-
59
55
  def build_dependencies
60
56
  deps = gir.dependencies @namespace
61
57
  deps.each {|dep|
@@ -78,40 +74,31 @@ module GirFFI
78
74
  end
79
75
 
80
76
  def setup_lib_for_ffi
81
- @lib = get_or_define_module @module, :Lib
82
-
83
- unless (class << @lib; self.include? GirFFI::Library; end)
84
- @lib.extend GirFFI::Library
85
- @lib.ffi_lib_flags :global, :lazy
86
- libspec = gir.shared_library(@namespace)
87
- unless libspec.nil?
88
- @lib.ffi_lib(*libspec.split(/,/))
89
- end
77
+ lib.extend FFI::Library
78
+ lib.ffi_lib_flags :global, :lazy
79
+ if shared_library_specification
80
+ lib.ffi_lib(*shared_library_specification.split(/,/))
90
81
  end
91
82
  end
92
83
 
93
- def sub_builder info
94
- if info.info_type == :function
95
- FunctionBuilder.new info
96
- else
97
- TypeBuilder.builder_for info
98
- end
84
+ def shared_library_specification
85
+ @shared_library_specification ||= gir.shared_library(@namespace)
86
+ end
87
+
88
+ def lib_already_set_up
89
+ (class << lib; self; end).include? FFI::Library
99
90
  end
100
91
 
101
- def libmodule
102
- @module.const_get(:Lib)
92
+ def lib
93
+ @lib ||= get_or_define_module modul, :Lib
103
94
  end
104
95
 
105
96
  def function_introspection_data function
106
97
  info = gir.find_by_name @namespace, function.to_s
107
- return nil if info.nil?
98
+ return unless info
108
99
  info.info_type == :function ? info : nil
109
100
  end
110
101
 
111
- def function_definition info
112
- FunctionBuilder.new(info).generate
113
- end
114
-
115
102
  def gir
116
103
  unless defined? @gir
117
104
  @gir = GObjectIntrospection::IRepository.default
@@ -0,0 +1,9 @@
1
+ class GirFFI::Builders::NullConvertor
2
+ def initialize argument_name
3
+ @argument_name = argument_name
4
+ end
5
+
6
+ def conversion
7
+ @argument_name
8
+ end
9
+ end
@@ -26,6 +26,10 @@ module GirFFI
26
26
  raise "Property #{property_name} not found"
27
27
  end
28
28
 
29
+ def object_class_struct
30
+ @object_class_struct ||= Builder.build_class object_class_struct_info
31
+ end
32
+
29
33
  private
30
34
 
31
35
  def setup_class
@@ -67,19 +71,10 @@ module GirFFI
67
71
  end
68
72
  end
69
73
 
70
- # TODO: Unify with field accessor setup.
71
74
  def setup_property_accessors
72
75
  info.properties.each do |prop|
73
- setup_accessors_for_property_info prop
74
- end
75
- end
76
-
77
- def setup_accessors_for_property_info prop
78
- builder = Builder::Property.new prop
79
- unless info.find_instance_method prop.getter_name
80
- @klass.class_eval builder.getter_def
76
+ PropertyBuilder.new(prop).build
81
77
  end
82
- @klass.class_eval builder.setter_def
83
78
  end
84
79
 
85
80
  # TODO: Guard agains accidental invocation of undefined vfuncs.
@@ -94,7 +89,7 @@ module GirFFI
94
89
 
95
90
  def define_vfunc_invoker vfunc_name, invoker_name
96
91
  return if vfunc_name == invoker_name
97
- @klass.class_eval "
92
+ klass.class_eval "
98
93
  def #{vfunc_name} *args, &block
99
94
  #{invoker_name}(*args, &block)
100
95
  end
@@ -103,9 +98,7 @@ module GirFFI
103
98
 
104
99
  def setup_interfaces
105
100
  interfaces.each do |iface|
106
- @klass.class_eval do
107
- include iface
108
- end
101
+ klass.send :include, iface
109
102
  end
110
103
  end
111
104
 
@@ -118,6 +111,10 @@ module GirFFI
118
111
  GirFFI::Builder.build_class ifinfo
119
112
  end
120
113
  end
114
+
115
+ def object_class_struct_info
116
+ @object_class_struct_info ||= info.class_struct
117
+ end
121
118
  end
122
119
  end
123
120
  end
@@ -1,26 +1,124 @@
1
1
  module GirFFI
2
- module Builder
2
+ module Builders
3
3
  # Creates property getter and setter code for a given IPropertyInfo.
4
- class Property
4
+ class PropertyBuilder
5
5
  def initialize property_info
6
6
  @info = property_info
7
7
  end
8
8
 
9
+ def build
10
+ setup_getter
11
+ setup_setter
12
+ end
13
+
14
+ def setup_getter
15
+ container_class.class_eval getter_def unless container_defines_getter_method?
16
+ end
17
+
18
+ def container_defines_getter_method?
19
+ container_info.find_instance_method @info.name
20
+ end
21
+
22
+ def setup_setter
23
+ container_class.class_eval setter_def
24
+ end
25
+
9
26
  def getter_def
10
- return <<-CODE
11
- def #{@info.getter_name}
12
- get_property "#{@info.name}"
27
+ case type_info.tag
28
+ when :glist, :ghash
29
+ converting_getter_def
30
+ else
31
+ simple_getter_def
13
32
  end
14
- CODE
15
33
  end
16
34
 
17
35
  def setter_def
18
- return <<-CODE
19
- def #{@info.getter_name}= value
20
- set_property "#{@info.name}", value
36
+ case type_info.flattened_tag
37
+ when :glist, :ghash, :strv
38
+ converting_setter_def
39
+ else
40
+ simple_setter_def
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def converting_getter_def
47
+ return <<-CODE.reset_indentation
48
+ def #{getter_name}
49
+ #{getter_builder.capture_variable_name} = get_property("#{property_name}").get_value_plain
50
+ #{getter_builder.post_conversion.join("\n")}
51
+ #{getter_builder.return_value_name}
52
+ end
53
+ CODE
54
+ end
55
+
56
+ def simple_getter_def
57
+ return <<-CODE.reset_indentation
58
+ def #{getter_name}
59
+ get_property("#{property_name}").get_value
60
+ end
61
+ CODE
62
+ end
63
+
64
+ def getter_builder
65
+ @getter_builder ||= ReturnValueBuilder.new(VariableNameGenerator.new,
66
+ argument_info)
67
+ end
68
+
69
+ def converting_setter_def
70
+ return <<-CODE.reset_indentation
71
+ def #{setter_name} value
72
+ #{setter_builder.pre_conversion.join("\n")}
73
+ set_property("#{property_name}", #{setter_builder.callarg})
21
74
  end
22
75
  CODE
23
76
  end
77
+
78
+ def simple_setter_def
79
+ return <<-CODE.reset_indentation
80
+ def #{setter_name} value
81
+ set_property("#{property_name}", value)
82
+ end
83
+ CODE
84
+ end
85
+
86
+ def setter_builder
87
+ @setter_builder ||= ArgumentBuilder.new(VariableNameGenerator.new,
88
+ argument_info)
89
+ end
90
+
91
+ def property_name
92
+ @info.name
93
+ end
94
+
95
+ def getter_name
96
+ @info.getter_name
97
+ end
98
+
99
+ def setter_name
100
+ @info.setter_name
101
+ end
102
+
103
+ def type_info
104
+ @type_info ||= @info.property_type
105
+ end
106
+
107
+ def argument_info
108
+ @argument_info ||= FieldArgumentInfo.new("value", type_info)
109
+ end
110
+
111
+ def container_class
112
+ @container_class ||= container_module.const_get(container_info.safe_name)
113
+ end
114
+
115
+ def container_module
116
+ @container_module ||= Object.const_get(container_info.safe_namespace)
117
+ end
118
+
119
+ def container_info
120
+ @container_info ||= @info.container
121
+ end
24
122
  end
25
123
  end
26
124
  end