raap 0.5.0 → 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 +4 -4
- data/.rubocop.yml +3 -1
- data/README.md +63 -2
- data/Rakefile +3 -1
- data/lib/raap/cli.rb +30 -15
- data/lib/raap/coverage.rb +188 -0
- data/lib/raap/function_type.rb +36 -16
- data/lib/raap/method_property.rb +47 -16
- data/lib/raap/method_type.rb +17 -8
- data/lib/raap/minitest.rb +2 -2
- data/lib/raap/rbs.rb +42 -0
- data/lib/raap/symbolic_caller.rb +2 -2
- data/lib/raap/type.rb +53 -45
- data/lib/raap/type_substitution.rb +7 -3
- data/lib/raap/value/interface.rb +13 -24
- data/lib/raap/value/intersection.rb +7 -8
- data/lib/raap/value/module.rb +1 -1
- data/lib/raap/value/variable.rb +1 -1
- data/lib/raap/version.rb +1 -1
- data/lib/raap.rb +2 -0
- data/lib/shims.rb +38 -0
- data/public/example.webp +0 -0
- data/rbs_collection.lock.yaml +5 -5
- data/sig/raap.rbs +52 -11
- metadata +7 -4
data/lib/raap/method_type.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module RaaP
|
4
4
|
class MethodType
|
5
|
-
attr_reader :rbs
|
5
|
+
attr_reader :rbs, :original_rbs
|
6
6
|
|
7
7
|
def initialize(method, type_params_decl: [], type_args: [], self_type: nil, instance_type: nil, class_type: nil)
|
8
8
|
rbs =
|
@@ -20,17 +20,19 @@ module RaaP
|
|
20
20
|
params = (type_params_decl + rbs.type_params).uniq
|
21
21
|
ts = TypeSubstitution.new(params, type_args)
|
22
22
|
|
23
|
-
@
|
24
|
-
@
|
23
|
+
@original_rbs = rbs
|
24
|
+
@rbs = ts.method_type_sub(rbs, self_type: self_type, instance_type: instance_type, class_type: class_type)
|
25
|
+
function_or_untypedfunction = __skip__ = @rbs.type
|
26
|
+
@fun_type = FunctionType.new(function_or_untypedfunction)
|
25
27
|
end
|
26
28
|
|
27
29
|
def pick_arguments(size: 10)
|
28
|
-
SymbolicCaller.new(arguments_to_symbolic_call(size:)).eval
|
30
|
+
SymbolicCaller.new(arguments_to_symbolic_call(size: size)).eval
|
29
31
|
end
|
30
32
|
|
31
33
|
def arguments_to_symbolic_call(size: 10)
|
32
|
-
args, kwargs = @fun_type.arguments_to_symbolic_call(size:)
|
33
|
-
block = pick_block(size:)
|
34
|
+
args, kwargs = @fun_type.arguments_to_symbolic_call(size: size)
|
35
|
+
block = pick_block(size: size)
|
34
36
|
|
35
37
|
[args, kwargs, block]
|
36
38
|
end
|
@@ -40,8 +42,15 @@ module RaaP
|
|
40
42
|
return nil if block.nil?
|
41
43
|
return nil if (block.required == false) && [true, false].sample
|
42
44
|
|
43
|
-
fixed_return_value = Type.new(block.type.return_type).pick(size:)
|
44
|
-
Proc.new
|
45
|
+
fixed_return_value = Type.new(block.type.return_type).pick(size: size)
|
46
|
+
Proc.new do
|
47
|
+
block.type.each_param.with_index do |_param, i|
|
48
|
+
Coverage.log("block_param_#{i}")
|
49
|
+
end
|
50
|
+
|
51
|
+
Coverage.new_type_with_log("block_return", block.type.return_type)
|
52
|
+
fixed_return_value
|
53
|
+
end
|
45
54
|
end
|
46
55
|
|
47
56
|
def check_return(return_value)
|
data/lib/raap/minitest.rb
CHANGED
@@ -13,7 +13,7 @@ module RaaP
|
|
13
13
|
method_type = RaaP::MethodType.new(type)
|
14
14
|
size_step.each do |size|
|
15
15
|
# TODO assert_send_type
|
16
|
-
args, kwargs, _block = method_type.pick_arguments(size:)
|
16
|
+
args, kwargs, _block = method_type.pick_arguments(size: size)
|
17
17
|
return_value = yield(*args, **kwargs)
|
18
18
|
i = BindCall.inspect(return_value)
|
19
19
|
c = BindCall.class(return_value)
|
@@ -30,7 +30,7 @@ module RaaP
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
size_step.each do |size|
|
33
|
-
values = types.map { |t| t.pick(size:) }
|
33
|
+
values = types.map { |t| t.pick(size: size) }
|
34
34
|
assert yield(*values)
|
35
35
|
end
|
36
36
|
end
|
data/lib/raap/rbs.rb
CHANGED
@@ -26,6 +26,48 @@ module RaaP
|
|
26
26
|
::RBS::Parser.parse_method_type(method_type, require_eof: true) or raise
|
27
27
|
end
|
28
28
|
|
29
|
+
def self.parse_member(member_type)
|
30
|
+
_, _, decls = ::RBS::Parser.parse_signature(<<~RBS)
|
31
|
+
module MemberScope
|
32
|
+
#{member_type}
|
33
|
+
end
|
34
|
+
RBS
|
35
|
+
decl = decls.first or raise
|
36
|
+
raise unless decl.is_a?(::RBS::AST::Declarations::Module)
|
37
|
+
|
38
|
+
member = decl.members.first or raise
|
39
|
+
raise unless member.is_a?(::RBS::AST::Members::Attribute)
|
40
|
+
|
41
|
+
member.tap do |m|
|
42
|
+
m = __skip__ = m
|
43
|
+
_shift_location(m.type, -m.location.start_pos)
|
44
|
+
_shift_location(m, -m.location.start_pos)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def self._shift_location(localable, shift)
|
49
|
+
return if localable.location.nil?
|
50
|
+
|
51
|
+
l = localable.instance_variable_get("@location")
|
52
|
+
localable.instance_variable_set(
|
53
|
+
"@location",
|
54
|
+
::RBS::Location.new(
|
55
|
+
buffer: ::RBS::Buffer.new(
|
56
|
+
name: l.buffer.name,
|
57
|
+
content: l.buffer.content[-shift..l.end_pos],
|
58
|
+
),
|
59
|
+
start_pos: l.start_pos + shift,
|
60
|
+
end_pos: l.end_pos + shift,
|
61
|
+
)
|
62
|
+
)
|
63
|
+
case localable
|
64
|
+
when ::RBS::Types::Union
|
65
|
+
localable.types.each { |t| _shift_location(t, shift) }
|
66
|
+
when ::RBS::Types::Optional
|
67
|
+
_shift_location(localable.type, shift)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
29
71
|
def self.find_alias_decl(type_name, method_name)
|
30
72
|
env.class_decls[type_name].decls.each do |d|
|
31
73
|
d.decl.members.each do |member|
|
data/lib/raap/symbolic_caller.rb
CHANGED
data/lib/raap/type.rb
CHANGED
@@ -24,6 +24,7 @@ module RaaP
|
|
24
24
|
def self.register(type_name, &block)
|
25
25
|
raise ArgumentError, "block is required" unless block
|
26
26
|
|
27
|
+
type_name = "::#{type_name}" if !type_name.start_with?("::")
|
27
28
|
GENERATORS[type_name] = __skip__ = block
|
28
29
|
end
|
29
30
|
|
@@ -52,28 +53,29 @@ module RaaP
|
|
52
53
|
method_type = MethodType.new(maped_rbs_method_type)
|
53
54
|
|
54
55
|
begin
|
55
|
-
args, kwargs, block = method_type.arguments_to_symbolic_call(size:)
|
56
|
+
args, kwargs, block = method_type.arguments_to_symbolic_call(size: size)
|
56
57
|
[:call, base, :new, args, kwargs, block]
|
57
58
|
rescue
|
58
59
|
$stderr.puts "Fail with `#{rbs_method_type}`"
|
59
60
|
raise
|
60
61
|
end
|
61
62
|
else
|
62
|
-
[:call, Value::Module, :new, [type.to_s], { size: }, nil]
|
63
|
+
[:call, Value::Module, :new, [type.to_s], { size: size }, nil]
|
63
64
|
end
|
64
65
|
end
|
65
66
|
|
66
67
|
# Special class case
|
67
68
|
register("::Array") do
|
68
69
|
instance = __skip__ = type
|
69
|
-
t = instance.args[0] ? Type.new(instance.args[0], range:) : Type.random
|
70
|
+
t = instance.args[0] ? Type.new(instance.args[0], range: range) : Type.random
|
70
71
|
array(t)
|
71
72
|
end
|
72
|
-
register("::Binding") {
|
73
|
+
register("::Binding") { binding }
|
73
74
|
register("::Complex") { complex }
|
74
|
-
register("::Data") {
|
75
|
+
register("::Data") { Data.define }
|
75
76
|
register("::Encoding") { encoding }
|
76
|
-
register("::FalseClass") {
|
77
|
+
register("::FalseClass") { false }
|
78
|
+
register("::File") { File.open("/dev/null") }
|
77
79
|
register("::Float") { float }
|
78
80
|
register("::Hash") do
|
79
81
|
instance = __skip__ = type
|
@@ -82,18 +84,18 @@ module RaaP
|
|
82
84
|
dict(key, value)
|
83
85
|
end
|
84
86
|
register("::Integer") { integer }
|
85
|
-
register("::IO") {
|
86
|
-
register("::Method") {
|
87
|
-
register("::NilClass") {
|
88
|
-
register("::Proc") {
|
87
|
+
register("::IO") { $stdout }
|
88
|
+
register("::Method") { temp_method_object }
|
89
|
+
register("::NilClass") { nil }
|
90
|
+
register("::Proc") { Proc.new {} }
|
89
91
|
register("::Rational") { rational }
|
90
|
-
register("::Regexp") { sized { |size| Regexp.new(string.pick(size:)) } }
|
92
|
+
register("::Regexp") { sized { |size| Regexp.new(string.pick(size: size)) } }
|
91
93
|
register("::String") { string }
|
92
|
-
register("::Struct") {
|
94
|
+
register("::Struct") { Struct.new(:foo, :bar).new }
|
93
95
|
register("::Symbol") { symbol }
|
94
|
-
register("::Time") {
|
95
|
-
register("::TrueClass") {
|
96
|
-
register("::UnboundMethod") {
|
96
|
+
register("::Time") { [:call, Time, :now, [], {}, nil] }
|
97
|
+
register("::TrueClass") { true }
|
98
|
+
register("::UnboundMethod") { temp_method_object.unbind }
|
97
99
|
|
98
100
|
attr_reader :type
|
99
101
|
attr_reader :range
|
@@ -118,11 +120,11 @@ module RaaP
|
|
118
120
|
end
|
119
121
|
|
120
122
|
def pick(size: 10)
|
121
|
-
to_symbolic_caller(size:).eval
|
123
|
+
to_symbolic_caller(size: size).eval
|
122
124
|
end
|
123
125
|
|
124
126
|
def to_symbolic_caller(size: 10)
|
125
|
-
SymbolicCaller.new(to_symbolic_call(size:))
|
127
|
+
SymbolicCaller.new(to_symbolic_call(size: size))
|
126
128
|
end
|
127
129
|
|
128
130
|
def to_symbolic_call(size: 10)
|
@@ -131,20 +133,20 @@ module RaaP
|
|
131
133
|
|
132
134
|
case type
|
133
135
|
when ::RBS::Types::Tuple
|
134
|
-
type.types.map { |t| Type.new(t).to_symbolic_call(size:) }
|
136
|
+
type.types.map { |t| Type.new(t).to_symbolic_call(size: size) }
|
135
137
|
when ::RBS::Types::Union
|
136
|
-
type.types.sample&.then { |t| Type.new(t).to_symbolic_call(size:) }
|
138
|
+
type.types.sample&.then { |t| Type.new(t).to_symbolic_call(size: size) }
|
137
139
|
when ::RBS::Types::Intersection
|
138
140
|
if type.free_variables.empty?
|
139
|
-
[:call, Value::Intersection, :new, [type.to_s], { size: }, nil]
|
141
|
+
[:call, Value::Intersection, :new, [type.to_s], { size: size }, nil]
|
140
142
|
else
|
141
|
-
[:call, Value::Intersection, :new, [type], { size: }, nil]
|
143
|
+
[:call, Value::Intersection, :new, [type], { size: size }, nil]
|
142
144
|
end
|
143
145
|
when ::RBS::Types::Interface
|
144
146
|
if type.free_variables.empty?
|
145
|
-
[:call, Value::Interface, :new, [type.to_s], { size: }, nil]
|
147
|
+
[:call, Value::Interface, :new, [type.to_s], { size: size }, nil]
|
146
148
|
else
|
147
|
-
[:call, Value::Interface, :new, [type], { size: }, nil]
|
149
|
+
[:call, Value::Interface, :new, [type], { size: size }, nil]
|
148
150
|
end
|
149
151
|
when ::RBS::Types::Variable
|
150
152
|
[:call, Value::Variable, :new, [type.to_s], {}, nil]
|
@@ -162,7 +164,7 @@ module RaaP
|
|
162
164
|
when ::RBS::Types::Alias
|
163
165
|
case gen = GENERATORS[type.name.absolute!.to_s]
|
164
166
|
in Proc then instance_exec(&gen)
|
165
|
-
in nil then Type.new(RBS.builder.expand_alias2(type.name, type.args)).to_symbolic_call(size:)
|
167
|
+
in nil then Type.new(RBS.builder.expand_alias2(type.name, type.args)).to_symbolic_call(size: size)
|
166
168
|
end
|
167
169
|
when ::RBS::Types::Bases::Class
|
168
170
|
RaaP.logger.warn("Unresolved `class` type, use Object instead.")
|
@@ -176,19 +178,19 @@ module RaaP
|
|
176
178
|
Object.const_get(type.name.to_s)
|
177
179
|
when ::RBS::Types::ClassInstance
|
178
180
|
case gen = GENERATORS[type.name.absolute!.to_s]
|
179
|
-
in Proc then
|
180
|
-
in nil then to_symbolic_call_from_initialize(type, size:)
|
181
|
+
in Proc then pick_by_generator(gen, size: size)
|
182
|
+
in nil then to_symbolic_call_from_initialize(type, size: size)
|
181
183
|
end
|
182
184
|
when ::RBS::Types::Record
|
183
185
|
type.fields.transform_values { |t| Type.new(t).to_symbolic_call(size: size / 2) }
|
184
186
|
when ::RBS::Types::Proc
|
185
|
-
Proc.new { Type.new(type.type.return_type).to_symbolic_call(size:) }
|
187
|
+
Proc.new { Type.new(type.type.return_type).to_symbolic_call(size: size) }
|
186
188
|
when ::RBS::Types::Literal
|
187
189
|
type.literal
|
188
190
|
when ::RBS::Types::Bases::Bool
|
189
|
-
bool
|
191
|
+
bool
|
190
192
|
when ::RBS::Types::Bases::Any
|
191
|
-
Type.random.to_symbolic_call(size:)
|
193
|
+
Type.random.to_symbolic_call(size: size)
|
192
194
|
when ::RBS::Types::Bases::Nil
|
193
195
|
nil
|
194
196
|
else
|
@@ -198,10 +200,20 @@ module RaaP
|
|
198
200
|
|
199
201
|
private
|
200
202
|
|
203
|
+
def pick_by_generator(gen, size:)
|
204
|
+
ret = instance_exec(&gen)
|
205
|
+
case ret
|
206
|
+
when Sized
|
207
|
+
ret.pick(size: size)
|
208
|
+
else
|
209
|
+
ret
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
201
213
|
def to_symbolic_call_from_initialize(type, size:)
|
202
214
|
type_name = type.name.absolute!
|
203
215
|
const = Object.const_get(type_name.to_s)
|
204
|
-
Type.call_new_from(const, type, size:)
|
216
|
+
Type.call_new_from(const, type, size: size)
|
205
217
|
end
|
206
218
|
|
207
219
|
def parse(type)
|
@@ -216,7 +228,7 @@ module RaaP
|
|
216
228
|
end
|
217
229
|
|
218
230
|
def integer
|
219
|
-
sized { |size| float.pick(size:).round }
|
231
|
+
sized { |size| float.pick(size: size).round }
|
220
232
|
end
|
221
233
|
|
222
234
|
def none_zero_integer
|
@@ -240,16 +252,16 @@ module RaaP
|
|
240
252
|
|
241
253
|
def rational
|
242
254
|
sized do |size|
|
243
|
-
a = integer.pick(size:)
|
244
|
-
b = none_zero_integer.pick(size:)
|
255
|
+
a = integer.pick(size: size)
|
256
|
+
b = none_zero_integer.pick(size: size)
|
245
257
|
[:call, Kernel, :Rational, [a, b], {}, nil]
|
246
258
|
end
|
247
259
|
end
|
248
260
|
|
249
261
|
def complex
|
250
262
|
sized do |size|
|
251
|
-
a = integer.pick(size:)
|
252
|
-
b = none_zero_integer.pick(size:)
|
263
|
+
a = integer.pick(size: size)
|
264
|
+
b = none_zero_integer.pick(size: size)
|
253
265
|
[:call, Kernel, :Complex, [a, b], {}, nil]
|
254
266
|
end
|
255
267
|
end
|
@@ -274,13 +286,13 @@ module RaaP
|
|
274
286
|
|
275
287
|
def symbol
|
276
288
|
sized do |size|
|
277
|
-
string.pick(size:).to_sym
|
289
|
+
string.pick(size: size).to_sym
|
278
290
|
end
|
279
291
|
end
|
280
292
|
|
281
293
|
def array(type)
|
282
294
|
sized do |size|
|
283
|
-
Array.new(integer.pick(size:).abs) do
|
295
|
+
Array.new(integer.pick(size: size).abs) do
|
284
296
|
type.to_symbolic_call(size: size / 2)
|
285
297
|
end
|
286
298
|
end
|
@@ -291,7 +303,7 @@ module RaaP
|
|
291
303
|
def dict(key_type, value_type)
|
292
304
|
sized do |size|
|
293
305
|
csize = size / 2
|
294
|
-
Array.new(integer.pick(size:).abs).to_h do
|
306
|
+
Array.new(integer.pick(size: size).abs).to_h do
|
295
307
|
[
|
296
308
|
key_type.to_symbolic_call(size: csize),
|
297
309
|
value_type.to_symbolic_call(size: csize)
|
@@ -301,16 +313,12 @@ module RaaP
|
|
301
313
|
end
|
302
314
|
|
303
315
|
def encoding
|
304
|
-
|
305
|
-
|
306
|
-
[:call, Encoding, :find, [e.name], {}, nil]
|
307
|
-
end
|
316
|
+
e = Encoding.list.sample or raise
|
317
|
+
[:call, Encoding, :find, [e.name], {}, nil]
|
308
318
|
end
|
309
319
|
|
310
320
|
def bool
|
311
|
-
|
312
|
-
Random.rand(2) == 0
|
313
|
-
end
|
321
|
+
Random.rand(2) == 0
|
314
322
|
end
|
315
323
|
|
316
324
|
def temp_method_object
|
@@ -25,10 +25,14 @@ module RaaP
|
|
25
25
|
instance_type = instance_type.is_a?(::String) ? RBS.parse_type(instance_type) : instance_type
|
26
26
|
class_type = class_type.is_a?(::String) ? RBS.parse_type(class_type) : class_type
|
27
27
|
sub = build
|
28
|
+
if sub.empty? && self_type.nil? && instance_type.nil? && class_type.nil?
|
29
|
+
return method_type
|
30
|
+
end
|
31
|
+
|
28
32
|
::RBS::MethodType.new(
|
29
33
|
type_params: [],
|
30
|
-
type: method_type.type.sub(sub).then { |ty| sub(ty, self_type
|
31
|
-
block: method_type.block&.sub(sub)&.then { |bl| sub(bl, self_type
|
34
|
+
type: method_type.type.sub(sub).then { |ty| sub(ty, self_type: self_type, instance_type: instance_type, class_type: class_type) },
|
35
|
+
block: method_type.block&.sub(sub)&.then { |bl| sub(bl, self_type: self_type, instance_type: instance_type, class_type: class_type) },
|
32
36
|
location: method_type.location
|
33
37
|
)
|
34
38
|
end
|
@@ -49,7 +53,7 @@ module RaaP
|
|
49
53
|
when ::RBS::Types::Bases::Class
|
50
54
|
class_type || ty
|
51
55
|
else
|
52
|
-
sub(ty, self_type
|
56
|
+
sub(ty, self_type: self_type, instance_type: instance_type, class_type: class_type)
|
53
57
|
end
|
54
58
|
end
|
55
59
|
end
|
data/lib/raap/value/interface.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
module RaaP
|
4
4
|
module Value
|
5
|
-
class Interface
|
5
|
+
class Interface
|
6
6
|
class << self
|
7
|
-
def define_method_from_interface(
|
7
|
+
def define_method_from_interface(base_mod, type, size: 3)
|
8
8
|
type = type.is_a?(::String) ? RBS.parse_type(type) : type
|
9
9
|
unless type.instance_of?(::RBS::Types::Interface)
|
10
10
|
::Kernel.raise ::TypeError, "not an interface type: #{type}"
|
@@ -20,26 +20,23 @@ module RaaP
|
|
20
20
|
method_type = method.method_types.sample or ::Kernel.raise
|
21
21
|
type_params = definition.type_params_decl.concat(method_type.type_params.drop(definition.type_params_decl.length))
|
22
22
|
ts = TypeSubstitution.new(type_params, type.args)
|
23
|
-
subed_method_type = ts.method_type_sub(method_type, self_type
|
23
|
+
subed_method_type = ts.method_type_sub(method_type, self_type: self_type, instance_type: instance_type, class_type: class_type)
|
24
24
|
|
25
|
-
BindCall.define_method(
|
25
|
+
BindCall.define_method(base_mod, name) do |*_, &b|
|
26
26
|
@fixed_return_value ||= {}
|
27
27
|
@fixed_return_value[name] ||= if self_type == subed_method_type.type.return_type
|
28
28
|
self
|
29
29
|
else
|
30
|
-
Type.new(subed_method_type.type.return_type).pick(size:)
|
30
|
+
Type.new(subed_method_type.type.return_type).pick(size: size)
|
31
31
|
end
|
32
32
|
# @type var b: Proc?
|
33
|
-
if b
|
33
|
+
if b && subed_method_type.block && subed_method_type.block.type.is_a?(::RBS::Types::Function)
|
34
34
|
@fixed_block_arguments ||= {}
|
35
|
-
@fixed_block_arguments[name] ||=
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
else
|
41
|
-
[]
|
42
|
-
end
|
35
|
+
@fixed_block_arguments[name] ||= size.times.map do
|
36
|
+
FunctionType.new(subed_method_type.block.type)
|
37
|
+
.pick_arguments(size: size)
|
38
|
+
end
|
39
|
+
|
43
40
|
@fixed_block_arguments[name].each do |a, kw|
|
44
41
|
b.call(*a, **kw)
|
45
42
|
end
|
@@ -51,10 +48,10 @@ module RaaP
|
|
51
48
|
|
52
49
|
def new(type, size: 3)
|
53
50
|
temp_class = ::Class.new(Interface) do |c|
|
54
|
-
define_method_from_interface(c, type, size:)
|
51
|
+
define_method_from_interface(c, type, size: size)
|
55
52
|
end
|
56
53
|
instance = temp_class.allocate
|
57
|
-
instance.__send__(:initialize, type, size:)
|
54
|
+
instance.__send__(:initialize, type, size: size)
|
58
55
|
instance
|
59
56
|
end
|
60
57
|
end
|
@@ -68,14 +65,6 @@ module RaaP
|
|
68
65
|
@size = size
|
69
66
|
end
|
70
67
|
|
71
|
-
def respond_to?(name, _include_all = false)
|
72
|
-
@definition.methods.has_key?(name.to_sym)
|
73
|
-
end
|
74
|
-
|
75
|
-
def class
|
76
|
-
Interface
|
77
|
-
end
|
78
|
-
|
79
68
|
def inspect
|
80
69
|
"#<interface @type=`#{@type}` @methods=#{@definition.methods.keys} @size=#{@size}>"
|
81
70
|
end
|
@@ -17,23 +17,22 @@ module RaaP
|
|
17
17
|
raise ArgumentError, "intersection type must have at least one class instance type in `#{instances}`"
|
18
18
|
end
|
19
19
|
|
20
|
-
base = instances.find { |c| c.is_a?(::Class) } ||
|
20
|
+
base = instances.find { |c| c.is_a?(::Class) } || Object
|
21
21
|
|
22
22
|
c = Class.new(base) do
|
23
23
|
instances.select { |i| !i.is_a?(::Class) }.each do |m|
|
24
24
|
include(m)
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
t
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
Interface.define_method_from_interface(self, interface, size:)
|
27
|
+
type.types.each do |t|
|
28
|
+
case t
|
29
|
+
when ::RBS::Types::Interface
|
30
|
+
Interface.define_method_from_interface(self, t, size: size)
|
31
|
+
end
|
33
32
|
end
|
34
33
|
end
|
35
34
|
type = ::RBS::Types::ClassInstance.new(name: TypeName(base.name), args: [], location: nil)
|
36
|
-
SymbolicCaller.new(Type.call_new_from(c, type, size:)).eval
|
35
|
+
SymbolicCaller.new(Type.call_new_from(c, type, size: size)).eval
|
37
36
|
end
|
38
37
|
end
|
39
38
|
end
|
data/lib/raap/value/module.rb
CHANGED
@@ -35,7 +35,7 @@ module RaaP
|
|
35
35
|
if !ts.include?('::BasicObject') || ts.any? { |t| t.split('::').last&.start_with?('_') }
|
36
36
|
ts.unshift('Object')
|
37
37
|
end
|
38
|
-
Type.new(ts.uniq.join(' & ')).pick(size:)
|
38
|
+
Type.new(ts.uniq.join(' & ')).pick(size: size)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
const = ::Object.const_get(@type.name.absolute!.to_s)
|
data/lib/raap/value/variable.rb
CHANGED
data/lib/raap/version.rb
CHANGED
data/lib/raap.rb
CHANGED
@@ -9,6 +9,7 @@ require 'logger'
|
|
9
9
|
|
10
10
|
require_relative 'raap/version'
|
11
11
|
require_relative 'raap/value'
|
12
|
+
require_relative 'shims'
|
12
13
|
|
13
14
|
module RaaP
|
14
15
|
class << self
|
@@ -22,6 +23,7 @@ module RaaP
|
|
22
23
|
|
23
24
|
autoload :BindCall, "raap/bind_call"
|
24
25
|
autoload :CLI, "raap/cli"
|
26
|
+
autoload :Coverage, "raap/coverage"
|
25
27
|
autoload :FunctionType, "raap/function_type"
|
26
28
|
autoload :MethodProperty, "raap/method_property"
|
27
29
|
autoload :MethodType, "raap/method_type"
|
data/lib/shims.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Ruby 3.2
|
4
|
+
unless Exception.method_defined?(:detailed_message)
|
5
|
+
class Exception
|
6
|
+
alias detailed_message message
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
# Ruby 3.2
|
11
|
+
unless defined?(Data)
|
12
|
+
class Data
|
13
|
+
class << self
|
14
|
+
def define(*syms)
|
15
|
+
_ = Class.new do |c|
|
16
|
+
define_method(:initialize) do |*args, **kwargs|
|
17
|
+
if !args.empty?
|
18
|
+
syms.zip(args).each do |sym, arg|
|
19
|
+
instance_variable_set("@#{sym}", arg)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
if !kwargs.empty?
|
23
|
+
kwargs.each do |k, v|
|
24
|
+
instance_variable_set("@#{k}", v)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
syms.each do |sym|
|
30
|
+
c.define_method(sym) do
|
31
|
+
instance_variable_get("@#{sym}")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
data/public/example.webp
ADDED
Binary file
|
data/rbs_collection.lock.yaml
CHANGED
@@ -10,7 +10,7 @@ gems:
|
|
10
10
|
source:
|
11
11
|
type: git
|
12
12
|
name: ruby/gem_rbs_collection
|
13
|
-
revision:
|
13
|
+
revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
|
14
14
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
15
15
|
repo_dir: gems
|
16
16
|
- name: base64
|
@@ -26,7 +26,7 @@ gems:
|
|
26
26
|
source:
|
27
27
|
type: git
|
28
28
|
name: ruby/gem_rbs_collection
|
29
|
-
revision:
|
29
|
+
revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
|
30
30
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
31
31
|
repo_dir: gems
|
32
32
|
- name: connection_pool
|
@@ -34,7 +34,7 @@ gems:
|
|
34
34
|
source:
|
35
35
|
type: git
|
36
36
|
name: ruby/gem_rbs_collection
|
37
|
-
revision:
|
37
|
+
revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
|
38
38
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
39
39
|
repo_dir: gems
|
40
40
|
- name: date
|
@@ -54,7 +54,7 @@ gems:
|
|
54
54
|
source:
|
55
55
|
type: git
|
56
56
|
name: ruby/gem_rbs_collection
|
57
|
-
revision:
|
57
|
+
revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
|
58
58
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
59
59
|
repo_dir: gems
|
60
60
|
- name: io-console
|
@@ -94,7 +94,7 @@ gems:
|
|
94
94
|
source:
|
95
95
|
type: git
|
96
96
|
name: ruby/gem_rbs_collection
|
97
|
-
revision:
|
97
|
+
revision: d2e93d426c927fdab90ef12e30a9875aa05d60d6
|
98
98
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
99
99
|
repo_dir: gems
|
100
100
|
- name: rbs
|