/
property_builder.rb
128 lines (107 loc) · 3.13 KB
/
property_builder.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
module GirFFI
module Builders
# Creates property getter and setter code for a given IPropertyInfo.
class PropertyBuilder
def initialize property_info
@info = property_info
end
def build
setup_getter
setup_setter
end
def setup_getter
container_class.class_eval getter_def unless container_defines_getter_method?
end
def container_defines_getter_method?
container_info.find_instance_method getter_name
end
def setup_setter
container_class.class_eval setter_def
end
# TODO: Fix argument builders so converting_getter_def can always be used.
def getter_def
case type_info.tag
when :glist, :ghash
converting_getter_def
else
simple_getter_def
end
end
# TODO: Fix argument builders so converting_setter_def can always be used.
def setter_def
case type_info.flattened_tag
when :glist, :ghash, :strv
converting_setter_def
else
simple_setter_def
end
end
private
# TODO: Use a builder like MarshallingMethodBuilder
def converting_getter_def
capture = getter_builder.capture_variable_name
<<-CODE.reset_indentation
def #{getter_name}
#{capture} = get_property("#{property_name}").get_value_plain
#{getter_builder.post_conversion.join("\n")}
#{getter_builder.return_value_name}
end
CODE
end
def simple_getter_def
<<-CODE.reset_indentation
def #{getter_name}
get_property("#{property_name}").get_value
end
CODE
end
def getter_builder
@getter_builder ||= ReturnValueBuilder.new(VariableNameGenerator.new,
argument_info)
end
def converting_setter_def
<<-CODE.reset_indentation
def #{setter_name} value
#{setter_builder.pre_conversion.join("\n")}
set_property("#{property_name}", #{setter_builder.call_argument_name})
end
CODE
end
def simple_setter_def
<<-CODE.reset_indentation
def #{setter_name} value
set_property("#{property_name}", value)
end
CODE
end
def setter_builder
@setter_builder ||= ArgumentBuilder.new(VariableNameGenerator.new,
argument_info)
end
def property_name
@info.name
end
def getter_name
@info.getter_name
end
def setter_name
@info.setter_name
end
def type_info
@type_info ||= @info.property_type
end
def argument_info
@argument_info ||= FieldArgumentInfo.new('value', type_info)
end
def container_class
@container_class ||= container_module.const_get(container_info.safe_name)
end
def container_module
@container_module ||= Object.const_get(container_info.safe_namespace)
end
def container_info
@container_info ||= @info.container
end
end
end
end