katakata_irb 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/katakata_irb.gemspec +1 -1
- data/lib/katakata_irb/completor.rb +46 -22
- data/lib/katakata_irb/scope.rb +53 -15
- data/lib/katakata_irb/type_analyzer.rb +1172 -0
- data/lib/katakata_irb/types.rb +11 -36
- data/lib/katakata_irb/version.rb +1 -1
- metadata +5 -5
- data/lib/katakata_irb/type_simulator.rb +0 -990
data/lib/katakata_irb/types.rb
CHANGED
@@ -16,7 +16,7 @@ module KatakataIrb::Types
|
|
16
16
|
loader = RBS::CLI::LibraryOptions.new.loader
|
17
17
|
loader.add path: Pathname('sig')
|
18
18
|
RBS::DefinitionBuilder.new env: RBS::Environment.from_loader(loader).resolve_type_names
|
19
|
-
rescue => e
|
19
|
+
rescue LoadError, StandardError => e
|
20
20
|
@rbs_load_error = e
|
21
21
|
puts "\r\nKatakataIRB failed to initialize RBS::DefinitionBuilder: #{e.class}\r\n"
|
22
22
|
puts "See `KatakataIrb::Types.rbs_load_error` for more details.\r\n"
|
@@ -35,7 +35,7 @@ module KatakataIrb::Types
|
|
35
35
|
def self.rbs_search_method(klass, method_name, singleton)
|
36
36
|
klass.ancestors.each do |ancestor|
|
37
37
|
name = class_name_of ancestor
|
38
|
-
next unless name
|
38
|
+
next unless name && rbs_builder
|
39
39
|
type_name = RBS::TypeName(name).absolute!
|
40
40
|
definition = (singleton ? rbs_builder.build_singleton(type_name) : rbs_builder.build_instance(type_name)) rescue nil
|
41
41
|
method = definition.methods[method_name] if definition
|
@@ -47,8 +47,6 @@ module KatakataIrb::Types
|
|
47
47
|
def self.method_return_type(type, method_name)
|
48
48
|
receivers = type.types.map do |t|
|
49
49
|
case t
|
50
|
-
in ProcType
|
51
|
-
[t, Proc, false]
|
52
50
|
in SingletonType
|
53
51
|
[t, t.module_or_class, true]
|
54
52
|
in InstanceType
|
@@ -70,15 +68,13 @@ module KatakataIrb::Types
|
|
70
68
|
|
71
69
|
receivers = type.types.map do |t|
|
72
70
|
case t
|
73
|
-
in ProcType
|
74
|
-
[t, Proc, false]
|
75
71
|
in SingletonType
|
76
72
|
[t, t.module_or_class, true]
|
77
73
|
in InstanceType
|
78
74
|
[t, t.klass, false]
|
79
75
|
end
|
80
76
|
end
|
81
|
-
has_splat = args_types.any? { _1
|
77
|
+
has_splat = args_types.any? { _1.is_a? Splat }
|
82
78
|
methods_with_score = receivers.flat_map do |receiver_type, klass, singleton|
|
83
79
|
method = rbs_search_method klass, method_name, singleton
|
84
80
|
next [] unless method
|
@@ -98,7 +94,7 @@ module KatakataIrb::Types
|
|
98
94
|
args += [InstanceType.new(Hash, K: SYMBOL, V: kw_value_type)]
|
99
95
|
end
|
100
96
|
if has_splat
|
101
|
-
score += 1 if args.count { !(_1
|
97
|
+
score += 1 if args.count { !(_1.is_a? Splat) } <= reqs.size + opts.size + trailings.size
|
102
98
|
elsif reqs.size + trailings.size <= args.size && (rest || args.size <= reqs.size + opts.size + trailings.size)
|
103
99
|
score += 2
|
104
100
|
centers = args[reqs.size...-trailings.size]
|
@@ -125,7 +121,6 @@ module KatakataIrb::Types
|
|
125
121
|
def self.intersect?(a, b)
|
126
122
|
atypes = a.types.group_by(&:class)
|
127
123
|
btypes = b.types.group_by(&:class)
|
128
|
-
return true if atypes[ProcType] && btypes[ProcType]
|
129
124
|
if atypes[SingletonType] && btypes[SingletonType]
|
130
125
|
aa, bb = [atypes, btypes].map {|types| types[SingletonType].map(&:module_or_class) }
|
131
126
|
return true if (aa & bb).any?
|
@@ -207,7 +202,7 @@ module KatakataIrb::Types
|
|
207
202
|
def nonnillable() = self
|
208
203
|
def rbs_methods
|
209
204
|
name = KatakataIrb::Types.class_name_of(@klass)
|
210
|
-
return {} unless name
|
205
|
+
return {} unless name && KatakataIrb::Types.rbs_builder
|
211
206
|
|
212
207
|
type_name = RBS::TypeName(name).absolute!
|
213
208
|
KatakataIrb::Types.rbs_builder.build_instance(type_name).methods rescue {}
|
@@ -233,23 +228,6 @@ module KatakataIrb::Types
|
|
233
228
|
end
|
234
229
|
end
|
235
230
|
|
236
|
-
class ProcType
|
237
|
-
attr_reader :params, :kwparams, :return_type
|
238
|
-
def initialize(params = [], kwparams = {}, return_type = NIL)
|
239
|
-
@params = params
|
240
|
-
@kwparams = kwparams
|
241
|
-
@return_type = return_type
|
242
|
-
end
|
243
|
-
def transform() = yield(self)
|
244
|
-
def methods() = Proc.instance_methods
|
245
|
-
def all_methods() = Proc.instance_methods | Proc.private_instance_methods
|
246
|
-
def constants() = []
|
247
|
-
def types() = [self]
|
248
|
-
def nillable?() = (@klass == NilClass)
|
249
|
-
def nonnillable() = self
|
250
|
-
def inspect() = 'Proc'
|
251
|
-
end
|
252
|
-
|
253
231
|
NIL = InstanceType.new NilClass
|
254
232
|
OBJECT = InstanceType.new Object
|
255
233
|
TRUE = InstanceType.new TrueClass
|
@@ -266,7 +244,7 @@ module KatakataIrb::Types
|
|
266
244
|
HASH = InstanceType.new Hash
|
267
245
|
CLASS = InstanceType.new Class
|
268
246
|
MODULE = InstanceType.new Module
|
269
|
-
PROC =
|
247
|
+
PROC = InstanceType.new Proc
|
270
248
|
|
271
249
|
class UnionType
|
272
250
|
attr_reader :types
|
@@ -275,7 +253,6 @@ module KatakataIrb::Types
|
|
275
253
|
@types = []
|
276
254
|
singletons = []
|
277
255
|
instances = {}
|
278
|
-
procs = []
|
279
256
|
collect = -> type do
|
280
257
|
case type
|
281
258
|
in UnionType
|
@@ -287,12 +264,10 @@ module KatakataIrb::Types
|
|
287
264
|
end
|
288
265
|
in SingletonType
|
289
266
|
singletons << type
|
290
|
-
in ProcType
|
291
|
-
procs << type
|
292
267
|
end
|
293
268
|
end
|
294
269
|
types.each(&collect)
|
295
|
-
@types =
|
270
|
+
@types = singletons.uniq + instances.map do |klass, params|
|
296
271
|
InstanceType.new(klass, params.transform_values { |v| UnionType[*v] })
|
297
272
|
end
|
298
273
|
end
|
@@ -364,7 +339,7 @@ module KatakataIrb::Types
|
|
364
339
|
when RBS::Types::Union
|
365
340
|
UnionType[*return_type.types.map { from_rbs_type _1, self_type, extra_vars }]
|
366
341
|
when RBS::Types::Proc
|
367
|
-
|
342
|
+
PROC
|
368
343
|
when RBS::Types::Tuple
|
369
344
|
elem = UnionType[*return_type.types.map { from_rbs_type _1, self_type, extra_vars }]
|
370
345
|
InstanceType.new Array, Elem: elem
|
@@ -375,11 +350,11 @@ module KatakataIrb::Types
|
|
375
350
|
when RBS::Types::Variable
|
376
351
|
if extra_vars.key? return_type.name
|
377
352
|
extra_vars[return_type.name]
|
378
|
-
elsif self_type
|
353
|
+
elsif self_type.is_a? InstanceType
|
379
354
|
self_type.params[return_type.name] || OBJECT
|
380
|
-
elsif self_type
|
355
|
+
elsif self_type.is_a? UnionType
|
381
356
|
types = self_type.types.filter_map do |t|
|
382
|
-
t.params[return_type.name] if t
|
357
|
+
t.params[return_type.name] if t.is_a? InstanceType
|
383
358
|
end
|
384
359
|
UnionType[*types]
|
385
360
|
else
|
data/lib/katakata_irb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katakata_irb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tompng
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: irb
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.16.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.16.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rbs
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,7 +83,7 @@ files:
|
|
83
83
|
- lib/katakata_irb.rb
|
84
84
|
- lib/katakata_irb/completor.rb
|
85
85
|
- lib/katakata_irb/scope.rb
|
86
|
-
- lib/katakata_irb/
|
86
|
+
- lib/katakata_irb/type_analyzer.rb
|
87
87
|
- lib/katakata_irb/types.rb
|
88
88
|
- lib/katakata_irb/version.rb
|
89
89
|
- sig/katakata_irb.rbs
|