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.
- checksums.yaml +7 -0
- data/{History.txt → Changelog.md} +93 -61
- data/{DESIGN.rdoc → DESIGN.md} +7 -7
- data/README.md +5 -7
- data/TODO.md +90 -0
- data/lib/ffi-glib.rb +0 -1
- data/lib/ffi-glib/array.rb +13 -29
- data/lib/ffi-glib/array_methods.rb +13 -0
- data/lib/ffi-glib/container_class_methods.rb +6 -1
- data/lib/ffi-glib/hash_table.rb +3 -2
- data/lib/ffi-glib/list.rb +3 -17
- data/lib/ffi-glib/list_methods.rb +22 -3
- data/lib/ffi-glib/ptr_array.rb +19 -19
- data/lib/ffi-glib/s_list.rb +3 -17
- data/lib/ffi-gobject.rb +10 -17
- data/lib/ffi-gobject/object.rb +19 -9
- data/lib/ffi-gobject/object_class.rb +14 -0
- data/lib/ffi-gobject/ruby_closure.rb +4 -5
- data/lib/ffi-gobject/value.rb +7 -5
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi-base.rb +0 -2
- data/lib/gir_ffi-base/gobject.rb +1 -0
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/lib/gir_ffi/arg_helper.rb +18 -8
- data/lib/gir_ffi/builders/argument_builder.rb +62 -55
- data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
- data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
- data/lib/gir_ffi/builders/callback_builder.rb +19 -9
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
- data/lib/gir_ffi/builders/enum_builder.rb +16 -16
- data/lib/gir_ffi/builders/field_builder.rb +36 -15
- data/lib/gir_ffi/builders/function_builder.rb +32 -27
- data/lib/gir_ffi/builders/interface_builder.rb +14 -4
- data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
- data/lib/gir_ffi/builders/module_builder.rb +22 -35
- data/lib/gir_ffi/builders/null_convertor.rb +9 -0
- data/lib/gir_ffi/builders/object_builder.rb +11 -14
- data/lib/gir_ffi/builders/property_builder.rb +107 -9
- data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
- data/lib/gir_ffi/builders/signal_builder.rb +18 -58
- data/lib/gir_ffi/builders/struct_builder.rb +1 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
- data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
- data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
- data/lib/gir_ffi/builders/with_layout.rb +10 -8
- data/lib/gir_ffi/builders/with_methods.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +42 -8
- data/lib/gir_ffi/class_base.rb +1 -2
- data/lib/gir_ffi/enum_base.rb +26 -4
- data/lib/gir_ffi/error_argument_info.rb +21 -0
- data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
- data/lib/gir_ffi/g_type.rb +25 -0
- data/lib/gir_ffi/in_out_pointer.rb +3 -14
- data/lib/gir_ffi/in_pointer.rb +20 -21
- data/lib/gir_ffi/info_ext.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
- data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
- data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
- data/lib/gir_ffi/interface_base.rb +8 -3
- data/lib/gir_ffi/module_base.rb +3 -5
- data/lib/gir_ffi/object_base.rb +8 -0
- data/lib/gir_ffi/receiver_argument_info.rb +21 -0
- data/lib/gir_ffi/receiver_type_info.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +23 -0
- data/lib/gir_ffi/signal_base.rb +1 -1
- data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
- data/lib/gir_ffi/struct_base.rb +10 -9
- data/lib/gir_ffi/type_base.rb +1 -0
- data/lib/gir_ffi/type_map.rb +3 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
- data/lib/gir_ffi/union_base.rb +4 -21
- data/lib/gir_ffi/user_data_argument_info.rb +21 -0
- data/lib/gir_ffi/user_data_type_info.rb +17 -0
- data/lib/gir_ffi/user_defined_type_info.rb +18 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +8 -0
- data/lib/gir_ffi/vfunc_implementation.rb +11 -0
- data/lib/gir_ffi/zero_terminated.rb +18 -24
- data/test/base_test_helper.rb +2 -3
- data/test/ffi-glib/array_test.rb +3 -3
- data/test/ffi-glib/ruby_closure_test.rb +3 -3
- data/test/ffi-gobject/value_test.rb +15 -1
- data/test/ffi-gobject_test.rb +2 -1
- data/test/gir_ffi/arg_helper_test.rb +21 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
- data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
- data/test/gir_ffi/builders/field_builder_test.rb +18 -3
- data/test/gir_ffi/builders/function_builder_test.rb +30 -12
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
- data/test/gir_ffi/builders/module_builder_test.rb +0 -39
- data/test/gir_ffi/builders/object_builder_test.rb +27 -27
- data/test/gir_ffi/builders/property_builder_test.rb +110 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
- data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
- data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
- data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
- data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
- data/test/gir_ffi/g_type_test.rb +29 -0
- data/test/gir_ffi/in_pointer_test.rb +28 -9
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
- data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
- data/test/gir_ffi/interface_base_test.rb +9 -3
- data/test/gir_ffi/object_base_test.rb +1 -2
- data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
- data/test/gir_ffi/type_map_test.rb +1 -1
- data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
- data/test/gir_ffi_test.rb +5 -5
- data/test/gir_ffi_test_helper.rb +4 -0
- data/test/integration/generated_gimarshallingtests_test.rb +163 -59
- data/test/integration/generated_gobject_test.rb +21 -8
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +361 -101
- data/test/lib/autogen.sh +5 -1
- metadata +51 -35
- data/TODO.rdoc +0 -63
- data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
- 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
|
-
|
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
|
-
|
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/
|
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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
-
|
21
|
-
|
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
|
30
|
-
@
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
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 ||=
|
53
|
-
"#{
|
108
|
+
@capture ||= capture_variable_names.any? ?
|
109
|
+
"#{capture_variable_names.join(", ")} = " :
|
54
110
|
""
|
55
111
|
end
|
56
112
|
|
57
|
-
def
|
58
|
-
@
|
113
|
+
def capture_variable_names
|
114
|
+
@capture_variable_names ||=
|
115
|
+
all_builders.map(&:capture_variable_name).compact
|
59
116
|
end
|
60
117
|
|
61
|
-
def
|
62
|
-
@
|
118
|
+
def all_builders
|
119
|
+
@all_builders ||= [return_value_builder] + argument_builders
|
63
120
|
end
|
64
121
|
|
65
|
-
def
|
66
|
-
@
|
122
|
+
def call_arguments
|
123
|
+
@call_arguments ||= argument_builders.map(&:call_argument_name).compact
|
67
124
|
end
|
68
125
|
|
69
|
-
def
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
83
|
-
@
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
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
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
102
|
-
@
|
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
|
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
|
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
2
|
+
module Builders
|
3
3
|
# Creates property getter and setter code for a given IPropertyInfo.
|
4
|
-
class
|
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
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|