typeprof 0.9.0 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +1 -1
- data/Gemfile.lock +6 -5
- data/doc/demo.md +2 -2
- data/doc/todo.md +133 -0
- data/lib/typeprof/analyzer.rb +89 -37
- data/lib/typeprof/block.rb +34 -0
- data/lib/typeprof/builtin.rb +169 -66
- data/lib/typeprof/cli.rb +7 -0
- data/lib/typeprof/config.rb +25 -3
- data/lib/typeprof/container-type.rb +24 -0
- data/lib/typeprof/export.rb +130 -69
- data/lib/typeprof/import.rb +82 -38
- data/lib/typeprof/iseq.rb +23 -4
- data/lib/typeprof/method.rb +29 -7
- data/lib/typeprof/type.rb +75 -13
- data/lib/typeprof/version.rb +1 -1
- data/smoke/alias.rb +4 -4
- data/smoke/alias2.rb +3 -1
- data/smoke/arguments.rb +2 -2
- data/smoke/arguments2.rb +5 -5
- data/smoke/array-each.rb +1 -1
- data/smoke/array-each3.rb +1 -1
- data/smoke/array-map.rb +1 -1
- data/smoke/array-map2.rb +1 -1
- data/smoke/array-map3.rb +3 -3
- data/smoke/array-mul.rb +2 -2
- data/smoke/array-plus1.rb +1 -1
- data/smoke/array-plus2.rb +1 -0
- data/smoke/array-range-aref.rb +11 -11
- data/smoke/array-replace.rb +1 -1
- data/smoke/array1.rb +5 -5
- data/smoke/array10.rb +1 -1
- data/smoke/array11.rb +1 -1
- data/smoke/array12.rb +1 -1
- data/smoke/array14.rb +1 -1
- data/smoke/array15.rb +1 -1
- data/smoke/array2.rb +2 -2
- data/smoke/array3.rb +1 -0
- data/smoke/array6.rb +2 -1
- data/smoke/array8.rb +1 -1
- data/smoke/array9.rb +1 -1
- data/smoke/attr-module.rb +1 -0
- data/smoke/attr-vis.rb +43 -0
- data/smoke/attr-vis.rbs +4 -0
- data/smoke/attr.rb +2 -2
- data/smoke/block-ambiguous.rb +4 -4
- data/smoke/block-args1-rest.rb +6 -5
- data/smoke/block-args1.rb +5 -5
- data/smoke/block-args2-rest.rb +6 -5
- data/smoke/block-args2.rb +5 -5
- data/smoke/block-args3-rest.rb +7 -6
- data/smoke/block-args3.rb +6 -6
- data/smoke/block-blockarg.rb +3 -3
- data/smoke/block-kwarg.rb +4 -4
- data/smoke/block1.rb +1 -1
- data/smoke/block10.rb +1 -1
- data/smoke/block11.rb +2 -2
- data/smoke/block2.rb +1 -1
- data/smoke/block3.rb +1 -1
- data/smoke/block5.rb +1 -0
- data/smoke/block_given.rb +37 -0
- data/smoke/class_method.rb +2 -2
- data/smoke/class_method2.rb +2 -2
- data/smoke/constant2.rb +3 -2
- data/smoke/context-sensitive1.rb +1 -1
- data/smoke/cvar.rb +3 -2
- data/smoke/define_method.rb +2 -2
- data/smoke/define_method3.rb +1 -0
- data/smoke/define_method4.rb +1 -1
- data/smoke/define_method6.rb +19 -0
- data/smoke/demo.rb +6 -6
- data/smoke/demo1.rb +1 -1
- data/smoke/demo11.rb +1 -1
- data/smoke/demo2.rb +1 -1
- data/smoke/demo3.rb +1 -1
- data/smoke/demo4.rb +3 -3
- data/smoke/demo5.rb +1 -1
- data/smoke/demo6.rb +2 -1
- data/smoke/demo7.rb +1 -1
- data/smoke/demo9.rb +1 -0
- data/smoke/dummy-execution1.rb +1 -1
- data/smoke/dummy-execution2.rb +1 -1
- data/smoke/dummy_element.rb +1 -1
- data/smoke/ensure1.rb +1 -1
- data/smoke/enum_for.rb +15 -0
- data/smoke/enum_for2.rb +17 -0
- data/smoke/fib.rb +2 -2
- data/smoke/flow1.rb +1 -1
- data/smoke/flow10.rb +17 -0
- data/smoke/flow2.rb +1 -1
- data/smoke/flow3.rb +1 -1
- data/smoke/flow5.rb +1 -1
- data/smoke/flow6.rb +1 -1
- data/smoke/flow7.rb +1 -1
- data/smoke/flow8.rb +1 -1
- data/smoke/flow9.rb +1 -1
- data/smoke/function.rb +1 -1
- data/smoke/gvar.rb +1 -1
- data/smoke/gvar2.rb +1 -1
- data/smoke/hash-fetch.rb +3 -3
- data/smoke/inheritance.rb +4 -4
- data/smoke/initialize.rb +3 -2
- data/smoke/instance_eval.rb +1 -1
- data/smoke/int_times.rb +1 -1
- data/smoke/integer.rb +1 -1
- data/smoke/ivar.rb +3 -2
- data/smoke/ivar2.rb +2 -2
- data/smoke/ivar3.rb +2 -1
- data/smoke/ivar4.rb +21 -0
- data/smoke/kernel-class.rb +1 -1
- data/smoke/keyword4.rb +1 -1
- data/smoke/kwrest.rb +1 -0
- data/smoke/kwsplat1.rb +2 -2
- data/smoke/kwsplat2.rb +1 -1
- data/smoke/manual-rbs.rb +2 -1
- data/smoke/manual-rbs3.rb +1 -0
- data/smoke/method_in_branch.rb +1 -1
- data/smoke/method_missing.rb +4 -3
- data/smoke/module3.rb +1 -1
- data/smoke/module4.rb +1 -0
- data/smoke/module5.rb +1 -1
- data/smoke/module_function1.rb +3 -2
- data/smoke/module_function2.rb +3 -2
- data/smoke/multiple-include.rb +1 -0
- data/smoke/next1.rb +1 -1
- data/smoke/object-send1.rb +3 -3
- data/smoke/optional1.rb +1 -1
- data/smoke/optional2.rb +1 -1
- data/smoke/optional3.rb +1 -1
- data/smoke/parameterizedd-self.rb +2 -1
- data/smoke/prepend1.rb +33 -0
- data/smoke/prepend2.rb +10 -0
- data/smoke/prepend2.rbs +9 -0
- data/smoke/primitive_method.rb +19 -0
- data/smoke/proc4.rb +1 -1
- data/smoke/public.rb +4 -0
- data/smoke/range.rb +1 -1
- data/smoke/rbs-attr.rb +2 -2
- data/smoke/rbs-proc2.rb +1 -1
- data/smoke/rbs-proc3.rb +1 -1
- data/smoke/rbs-tyvar4.rb +3 -2
- data/smoke/rbs-tyvar6.rb +3 -3
- data/smoke/redo1.rb +1 -1
- data/smoke/redo2.rb +1 -1
- data/smoke/rescue1.rb +1 -1
- data/smoke/rescue2.rb +1 -1
- data/smoke/rescue3.rb +1 -0
- data/smoke/rescue4.rb +1 -1
- data/smoke/respond_to.rb +1 -1
- data/smoke/rest1.rb +2 -2
- data/smoke/rest2.rb +1 -1
- data/smoke/rest3.rb +6 -6
- data/smoke/rest4.rb +2 -2
- data/smoke/rest5.rb +1 -1
- data/smoke/rest6.rb +1 -1
- data/smoke/retry1.rb +2 -2
- data/smoke/simple.rb +12 -0
- data/smoke/step.rb +3 -3
- data/smoke/struct-keyword_init.rb +6 -16
- data/smoke/struct.rb +1 -1
- data/smoke/struct2.rb +1 -1
- data/smoke/struct3.rb +1 -1
- data/smoke/struct4.rb +1 -1
- data/smoke/struct5.rb +2 -2
- data/smoke/struct6.rb +2 -2
- data/smoke/struct7.rb +1 -1
- data/smoke/super1.rb +4 -4
- data/smoke/super3.rb +3 -2
- data/smoke/super4.rb +7 -5
- data/smoke/super5.rb +6 -4
- data/smoke/symbol-proc-attr.rb +1 -1
- data/smoke/tap1.rb +2 -2
- data/smoke/toplevel.rb +1 -1
- data/smoke/type_var.rb +3 -3
- data/smoke/user-demo.rb +1 -1
- data/smoke/wrong-extend.rb +1 -0
- data/smoke/wrong-include.rb +1 -0
- data/smoke/wrong-include2.rb +1 -1
- data/testbed/goodcheck-Gemfile.lock +1 -1
- data/typeprof.gemspec +1 -1
- metadata +19 -5
@@ -45,6 +45,12 @@ module TypeProf
|
|
45
45
|
Type::Cell.new(Type::Cell::Elements.new([Type.bot] * klass.type_params.size), base_type)
|
46
46
|
end
|
47
47
|
end
|
48
|
+
|
49
|
+
def include_untyped?(scratch)
|
50
|
+
return true if @base_type.include_untyped?(scratch)
|
51
|
+
return true if @elems.include_untyped?(scratch)
|
52
|
+
false
|
53
|
+
end
|
48
54
|
end
|
49
55
|
|
50
56
|
# The most basic container type for default type parameter class
|
@@ -196,6 +202,10 @@ module TypeProf
|
|
196
202
|
end
|
197
203
|
Elements.new(elems)
|
198
204
|
end
|
205
|
+
|
206
|
+
def include_untyped?(scratch)
|
207
|
+
return @elems.any? {|ty| ty.include_untyped?(scratch) }
|
208
|
+
end
|
199
209
|
end
|
200
210
|
end
|
201
211
|
|
@@ -531,6 +541,12 @@ module TypeProf
|
|
531
541
|
return rest_ary_ty, following_tys
|
532
542
|
end
|
533
543
|
end
|
544
|
+
|
545
|
+
def include_untyped?(scratch)
|
546
|
+
return true if @lead_tys.any? {|ty| ty.include_untyped?(scratch) }
|
547
|
+
return true if @rest_ty.include_untyped?(scratch)
|
548
|
+
false
|
549
|
+
end
|
534
550
|
end
|
535
551
|
end
|
536
552
|
|
@@ -790,6 +806,14 @@ module TypeProf
|
|
790
806
|
end
|
791
807
|
kw_tys
|
792
808
|
end
|
809
|
+
|
810
|
+
def include_untyped?(scratch)
|
811
|
+
@map_tys.each do |key, val|
|
812
|
+
return true if key.include_untyped?(scratch)
|
813
|
+
return true if val.include_untyped?(scratch)
|
814
|
+
end
|
815
|
+
false
|
816
|
+
end
|
793
817
|
end
|
794
818
|
end
|
795
819
|
|
data/lib/typeprof/export.rb
CHANGED
@@ -26,6 +26,10 @@ module TypeProf
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def show_message(terminated, output)
|
29
|
+
if Config.options[:show_typeprof_version]
|
30
|
+
output.puts "# TypeProf #{ VERSION }"
|
31
|
+
output.puts
|
32
|
+
end
|
29
33
|
if terminated
|
30
34
|
output.puts "# CAUTION: Type profiling was terminated prematurely because of the limitation"
|
31
35
|
output.puts
|
@@ -94,6 +98,10 @@ module TypeProf
|
|
94
98
|
if class_def.klass_obj.superclass != :__root__ && class_def.klass_obj.superclass
|
95
99
|
omit = class_def.klass_obj.superclass == Type::Builtin[:obj] || class_def.klass_obj == Type::Builtin[:obj]
|
96
100
|
superclass = omit ? nil : @scratch.get_class_name(class_def.klass_obj.superclass)
|
101
|
+
type_args = class_def.klass_obj.superclass_type_args
|
102
|
+
if type_args && !type_args.empty?
|
103
|
+
superclass += "[#{ type_args.map {|ty| ty.screen_name(@scratch) }.join(", ") }]"
|
104
|
+
end
|
97
105
|
end
|
98
106
|
|
99
107
|
@scratch.namespace = class_def.name
|
@@ -105,19 +113,20 @@ module TypeProf
|
|
105
113
|
consts[name] = ty.screen_name(@scratch)
|
106
114
|
end
|
107
115
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
+
modules = class_def.modules.to_h do |kind, mods|
|
117
|
+
mods = mods.to_h do |singleton, mods|
|
118
|
+
mods = mods.filter_map do |mod_def, _type_args, absolute_paths|
|
119
|
+
next if absolute_paths.all? {|path| !path || Config.check_dir_filter(path) == :exclude }
|
120
|
+
Type::Instance.new(mod_def.klass_obj).screen_name(@scratch)
|
121
|
+
end
|
122
|
+
[singleton, mods]
|
123
|
+
end
|
124
|
+
[kind, mods]
|
116
125
|
end
|
117
126
|
|
118
|
-
|
119
|
-
|
120
|
-
|
127
|
+
visibilities = {}
|
128
|
+
source_locations = {}
|
129
|
+
methods = {}
|
121
130
|
ivars = class_def.ivars.dump
|
122
131
|
cvars = class_def.cvars.dump
|
123
132
|
|
@@ -135,29 +144,47 @@ module TypeProf
|
|
135
144
|
method_name = ctx.mid
|
136
145
|
method_name = "self.#{ method_name }" if singleton
|
137
146
|
|
138
|
-
|
139
|
-
|
140
|
-
|
147
|
+
key = [:iseq, method_name]
|
148
|
+
visibilities[key] ||= mdef.pub_meth
|
149
|
+
source_locations[key] ||= ctx.iseq.source_location(0)
|
150
|
+
(methods[key] ||= []) << @scratch.show_method_signature(ctx)
|
151
|
+
end
|
152
|
+
when AliasMethodDef
|
153
|
+
alias_name, orig_name = mid, mdef.orig_mid
|
154
|
+
if singleton
|
155
|
+
alias_name = "self.#{ alias_name }"
|
156
|
+
orig_name = "self.#{ orig_name }"
|
141
157
|
end
|
158
|
+
key = [:alias, alias_name]
|
159
|
+
visibilities[key] ||= mdef.pub_meth
|
160
|
+
source_locations[key] ||= mdef.def_ep&.source_location
|
161
|
+
methods[key] = orig_name
|
142
162
|
when AttrMethodDef
|
143
|
-
next if !mdef.
|
163
|
+
next if !mdef.def_ep
|
164
|
+
absolute_path = mdef.def_ep.ctx.iseq.absolute_path
|
165
|
+
next if !absolute_path || Config.check_dir_filter(absolute_path) == :exclude
|
144
166
|
mid = mid.to_s[0..-2].to_sym if mid.to_s.end_with?("=")
|
145
167
|
method_name = mid
|
146
168
|
method_name = "self.#{ mid }" if singleton
|
147
169
|
method_name = [method_name, :"@#{ mid }" != mdef.ivar]
|
148
|
-
|
149
|
-
|
150
|
-
|
170
|
+
key = [:attr, method_name]
|
171
|
+
visibilities[key] ||= mdef.pub_meth
|
172
|
+
source_locations[key] ||= mdef.def_ep.source_location
|
173
|
+
if methods[key]
|
174
|
+
if methods[key][0] != mdef.kind
|
175
|
+
methods[key][0] = :accessor
|
151
176
|
end
|
152
177
|
else
|
153
178
|
entry = ivars[[singleton, mdef.ivar]]
|
154
179
|
ty = entry ? entry.type : Type.any
|
155
|
-
|
180
|
+
methods[key] = [mdef.kind, ty.screen_name(@scratch), ty.include_untyped?(@scratch)]
|
156
181
|
end
|
157
182
|
when TypedMethodDef
|
158
183
|
if mdef.rbs_source
|
159
184
|
method_name, sigs = mdef.rbs_source
|
160
|
-
|
185
|
+
key = [:rbs, method_name]
|
186
|
+
methods[key] = sigs
|
187
|
+
visibilities[key] ||= mdef.pub_meth
|
161
188
|
end
|
162
189
|
end
|
163
190
|
end
|
@@ -168,7 +195,7 @@ module TypeProf
|
|
168
195
|
ty = entry.type
|
169
196
|
next unless var.to_s.start_with?("@")
|
170
197
|
var = "self.#{ var }" if singleton
|
171
|
-
next if
|
198
|
+
next if methods[[:attr, [singleton ? "self.#{ var.to_s[1..] }" : var.to_s[1..].to_sym, false]]]
|
172
199
|
next if entry.rbs_declared
|
173
200
|
[var, ty.screen_name(@scratch)]
|
174
201
|
end.compact
|
@@ -180,7 +207,9 @@ module TypeProf
|
|
180
207
|
end.compact
|
181
208
|
|
182
209
|
if !class_def.absolute_path || Config.check_dir_filter(class_def.absolute_path) == :exclude
|
183
|
-
|
210
|
+
if methods.keys.all? {|type,| type == :rbs }
|
211
|
+
return nil if consts.empty? && modules[:before][true].empty? && modules[:before][false].empty? && modules[:after][true].empty? && modules[:after][false].empty? && ivars.empty? && cvars.empty? && inner_classes.empty?
|
212
|
+
end
|
184
213
|
end
|
185
214
|
|
186
215
|
@scratch.namespace = nil
|
@@ -190,18 +219,17 @@ module TypeProf
|
|
190
219
|
name: class_def.name,
|
191
220
|
superclass: superclass,
|
192
221
|
consts: consts,
|
193
|
-
|
194
|
-
extended_mods: extended_mods,
|
222
|
+
modules: modules,
|
195
223
|
ivars: ivars,
|
196
224
|
cvars: cvars,
|
197
|
-
|
198
|
-
|
199
|
-
|
225
|
+
methods: methods,
|
226
|
+
visibilities: visibilities,
|
227
|
+
source_locations: source_locations,
|
200
228
|
inner_classes: inner_classes,
|
201
229
|
)
|
202
230
|
end
|
203
231
|
|
204
|
-
ClassData = Struct.new(:kind, :name, :superclass, :consts, :
|
232
|
+
ClassData = Struct.new(:kind, :name, :superclass, :consts, :modules, :ivars, :cvars, :methods, :visibilities, :source_locations, :inner_classes, keyword_init: true)
|
205
233
|
|
206
234
|
def show(stat_eps, output)
|
207
235
|
# make the class hierarchy
|
@@ -218,7 +246,16 @@ module TypeProf
|
|
218
246
|
|
219
247
|
output.puts "# Classes" # and Modules
|
220
248
|
|
221
|
-
|
249
|
+
prev_nil = true
|
250
|
+
show_class_hierarchy(0, hierarchy).each do |line|
|
251
|
+
if line == nil
|
252
|
+
output.puts line unless prev_nil
|
253
|
+
prev_nil = true
|
254
|
+
else
|
255
|
+
output.puts line
|
256
|
+
prev_nil = false
|
257
|
+
end
|
258
|
+
end
|
222
259
|
|
223
260
|
if ENV["TP_STAT"]
|
224
261
|
output.puts ""
|
@@ -246,13 +283,13 @@ module TypeProf
|
|
246
283
|
end.compact
|
247
284
|
end
|
248
285
|
|
249
|
-
def show_class_hierarchy(depth, hierarchy
|
286
|
+
def show_class_hierarchy(depth, hierarchy)
|
287
|
+
lines = []
|
250
288
|
hierarchy.each do |class_data|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
show_class_data(depth, class_data, output)
|
289
|
+
lines << nil
|
290
|
+
lines.concat show_class_data(depth, class_data)
|
255
291
|
end
|
292
|
+
lines
|
256
293
|
end
|
257
294
|
|
258
295
|
def show_const(namespace, path)
|
@@ -262,53 +299,77 @@ module TypeProf
|
|
262
299
|
path[i..].join("::")
|
263
300
|
end
|
264
301
|
|
265
|
-
def show_class_data(depth, class_data
|
302
|
+
def show_class_data(depth, class_data)
|
266
303
|
indent = " " * depth
|
267
304
|
name = class_data.name.last
|
268
305
|
superclass = " < " + class_data.superclass if class_data.superclass
|
269
|
-
|
270
|
-
|
306
|
+
first_line = indent + "#{ class_data.kind } #{ name }#{ superclass }"
|
307
|
+
lines = []
|
271
308
|
class_data.consts.each do |name, ty|
|
272
|
-
|
273
|
-
first = false
|
274
|
-
end
|
275
|
-
class_data.included_mods.sort.each do |mod|
|
276
|
-
output.puts indent + " include #{ mod }"
|
277
|
-
first = false
|
309
|
+
lines << (indent + " #{ name }: #{ ty }")
|
278
310
|
end
|
279
|
-
class_data.
|
280
|
-
|
281
|
-
|
311
|
+
class_data.modules.each do |kind, mods|
|
312
|
+
mods.each do |singleton, mods|
|
313
|
+
case
|
314
|
+
when kind == :before && singleton then directive = nil
|
315
|
+
when kind == :before && !singleton then directive = "prepend"
|
316
|
+
when kind == :after && singleton then directive = "extend"
|
317
|
+
when kind == :after && !singleton then directive = "include"
|
318
|
+
end
|
319
|
+
mods.each do |mod|
|
320
|
+
lines << (indent + " #{ directive } #{ mod }") if directive
|
321
|
+
end
|
322
|
+
end
|
282
323
|
end
|
283
324
|
class_data.ivars.each do |var, ty|
|
284
|
-
|
285
|
-
first = false
|
325
|
+
lines << (indent + " #{ var }: #{ ty }") unless var.start_with?("_")
|
286
326
|
end
|
287
327
|
class_data.cvars.each do |var, ty|
|
288
|
-
|
289
|
-
first = false
|
328
|
+
lines << (indent + " #{ var }: #{ ty }")
|
290
329
|
end
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
330
|
+
lines << nil
|
331
|
+
prev_vis = true
|
332
|
+
class_data.methods.each do |key, arg|
|
333
|
+
vis = class_data.visibilities[key]
|
334
|
+
if prev_vis != vis
|
335
|
+
lines << nil
|
336
|
+
lines << (indent + " #{ vis ? "public" : "private" }")
|
337
|
+
prev_vis = vis
|
338
|
+
end
|
339
|
+
source_location = class_data.source_locations[key]
|
340
|
+
if Config.options[:show_source_locations] && source_location
|
341
|
+
lines << nil
|
342
|
+
lines << (indent + " # #{ source_location }")
|
343
|
+
end
|
344
|
+
type, (method_name, hidden) = key
|
345
|
+
case type
|
346
|
+
when :attr
|
347
|
+
kind, ty, untyped = *arg
|
348
|
+
exclude = Config.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
349
|
+
lines << (indent + "#{ exclude } attr_#{ kind } #{ method_name }#{ hidden ? "()" : "" }: #{ ty }")
|
350
|
+
when :rbs
|
351
|
+
sigs = arg.sort.join("\n" + indent + "#" + " " * (method_name.size + 5) + "| ")
|
352
|
+
lines << (indent + "# def #{ method_name }: #{ sigs }")
|
353
|
+
when :iseq
|
354
|
+
sigs = []
|
355
|
+
untyped = false
|
356
|
+
arg.each do |sig, untyped0|
|
357
|
+
sigs << sig
|
358
|
+
untyped ||= untyped0
|
359
|
+
end
|
360
|
+
sigs = sigs.sort.join("\n" + indent + " " * (method_name.size + 6) + "| ")
|
361
|
+
exclude = Config.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
362
|
+
lines << (indent + "#{ exclude } def #{ method_name }: #{ sigs }")
|
363
|
+
when :alias
|
364
|
+
orig_name = arg
|
365
|
+
lines << (indent + " alias #{ method_name } #{ orig_name }")
|
306
366
|
end
|
307
|
-
output.puts indent + " def #{ method_name }: #{ sigs }"
|
308
|
-
first = false
|
309
367
|
end
|
310
|
-
show_class_hierarchy(depth + 1, class_data.inner_classes
|
311
|
-
|
368
|
+
lines.concat show_class_hierarchy(depth + 1, class_data.inner_classes)
|
369
|
+
lines.shift until lines.empty? || lines.first
|
370
|
+
lines.pop until lines.empty? || lines.last
|
371
|
+
lines.unshift first_line
|
372
|
+
lines << (indent + "end")
|
312
373
|
end
|
313
374
|
end
|
314
375
|
end
|
data/lib/typeprof/import.rb
CHANGED
@@ -3,6 +3,10 @@ require "rbs"
|
|
3
3
|
module TypeProf
|
4
4
|
class RBSReader
|
5
5
|
def initialize
|
6
|
+
@repo = RBS::Repository.new
|
7
|
+
Config.gem_repo_dirs.each do |dir|
|
8
|
+
@repo.add(Pathname(dir))
|
9
|
+
end
|
6
10
|
@env, @builtin_env_json = RBSReader.get_builtin_env
|
7
11
|
end
|
8
12
|
|
@@ -11,7 +15,7 @@ module TypeProf
|
|
11
15
|
unless @builtin_env
|
12
16
|
@builtin_env = RBS::Environment.new
|
13
17
|
|
14
|
-
loader = RBS::EnvironmentLoader.new
|
18
|
+
loader = RBS::EnvironmentLoader.new(repository: @repo)
|
15
19
|
new_decls = loader.load(env: @builtin_env).map {|decl,| decl }
|
16
20
|
@builtin_env_json = load_rbs(@builtin_env, new_decls)
|
17
21
|
end
|
@@ -24,22 +28,30 @@ module TypeProf
|
|
24
28
|
end
|
25
29
|
|
26
30
|
def load_library(lib)
|
27
|
-
loader = RBS::EnvironmentLoader.new(core_root: nil)
|
31
|
+
loader = RBS::EnvironmentLoader.new(core_root: nil, repository: @repo)
|
28
32
|
loader.add(library: lib)
|
29
33
|
|
30
34
|
case lib
|
35
|
+
when 'bigdecimal-math'
|
36
|
+
loader.add(library: 'bigdecimal')
|
31
37
|
when "yaml"
|
32
38
|
loader.add(library: "pstore")
|
33
39
|
loader.add(library: "dbm")
|
40
|
+
when "logger"
|
41
|
+
loader.add(library: "monitor")
|
42
|
+
when "csv"
|
43
|
+
loader.add(library: "forwardable")
|
44
|
+
when "prime"
|
45
|
+
loader.add(library: "singleton")
|
34
46
|
end
|
35
47
|
|
36
48
|
new_decls = loader.load(env: @env).map {|decl,| decl }
|
37
49
|
RBSReader.load_rbs(@env, new_decls)
|
38
50
|
end
|
39
51
|
|
40
|
-
def
|
41
|
-
loader = RBS::EnvironmentLoader.new(core_root: nil)
|
42
|
-
loader.add(path: path)
|
52
|
+
def load_paths(paths)
|
53
|
+
loader = RBS::EnvironmentLoader.new(core_root: nil, repository: @repo)
|
54
|
+
paths.each {|path| loader.add(path: path) }
|
43
55
|
new_decls = loader.load(env: @env).map {|decl,| decl }
|
44
56
|
RBSReader.load_rbs(@env, new_decls)
|
45
57
|
end
|
@@ -69,6 +81,7 @@ module TypeProf
|
|
69
81
|
class RBS2JSON
|
70
82
|
def initialize(all_env, cur_env)
|
71
83
|
@all_env, @cur_env = all_env, cur_env
|
84
|
+
@alias_resolution_stack = {}
|
72
85
|
end
|
73
86
|
|
74
87
|
def dump_json
|
@@ -116,13 +129,13 @@ module TypeProf
|
|
116
129
|
end
|
117
130
|
|
118
131
|
type_params = nil
|
119
|
-
|
120
|
-
extended_modules = []
|
132
|
+
modules = { include: [], extend: [], prepend: [] }
|
121
133
|
methods = {}
|
122
134
|
attr_methods = {}
|
123
135
|
ivars = {}
|
124
136
|
cvars = {}
|
125
137
|
rbs_sources = {}
|
138
|
+
visibility = true
|
126
139
|
|
127
140
|
decls.each do |decl|
|
128
141
|
decl = decl.decl
|
@@ -143,7 +156,7 @@ module TypeProf
|
|
143
156
|
end
|
144
157
|
end
|
145
158
|
|
146
|
-
method_def = conv_method_def(method_types)
|
159
|
+
method_def = conv_method_def(method_types, visibility)
|
147
160
|
rbs_source = [(member.kind == :singleton ? "self." : "") + member.name.to_s, member.types.map {|type| type.location.source }]
|
148
161
|
if member.instance?
|
149
162
|
methods[[false, name]] = method_def
|
@@ -155,13 +168,13 @@ module TypeProf
|
|
155
168
|
end
|
156
169
|
when RBS::AST::Members::AttrReader
|
157
170
|
ty = conv_type(member.type)
|
158
|
-
attr_methods[[false, member.name]] = attr_method_def(:reader, member.name, ty)
|
171
|
+
attr_methods[[false, member.name]] = attr_method_def(:reader, member.name, ty, visibility)
|
159
172
|
when RBS::AST::Members::AttrWriter
|
160
173
|
ty = conv_type(member.type)
|
161
|
-
attr_methods[[false, member.name]] = attr_method_def(:writer, member.name, ty)
|
174
|
+
attr_methods[[false, member.name]] = attr_method_def(:writer, member.name, ty, visibility)
|
162
175
|
when RBS::AST::Members::AttrAccessor
|
163
176
|
ty = conv_type(member.type)
|
164
|
-
attr_methods[[false, member.name]] = attr_method_def(:accessor, member.name, ty)
|
177
|
+
attr_methods[[false, member.name]] = attr_method_def(:accessor, member.name, ty, visibility)
|
165
178
|
when RBS::AST::Members::Alias
|
166
179
|
# XXX: an alias to attr methods?
|
167
180
|
if member.instance?
|
@@ -178,7 +191,7 @@ module TypeProf
|
|
178
191
|
if name.kind == :class
|
179
192
|
mod = conv_type_name(name)
|
180
193
|
type_args = member.args.map {|type| conv_type(type) }
|
181
|
-
|
194
|
+
modules[:include] << [mod, type_args]
|
182
195
|
else
|
183
196
|
# including an interface is not supported yet
|
184
197
|
end
|
@@ -188,7 +201,17 @@ module TypeProf
|
|
188
201
|
if name.kind == :class
|
189
202
|
mod = conv_type_name(name)
|
190
203
|
type_args = member.args.map {|type| conv_type(type) }
|
191
|
-
|
204
|
+
modules[:extend] << [mod, type_args]
|
205
|
+
else
|
206
|
+
# extending a module with an interface is not supported yet
|
207
|
+
end
|
208
|
+
|
209
|
+
when RBS::AST::Members::Prepend
|
210
|
+
name = member.name
|
211
|
+
if name.kind == :class
|
212
|
+
mod = conv_type_name(name)
|
213
|
+
type_args = member.args.map {|type| conv_type(type) }
|
214
|
+
modules[:prepend] << [mod, type_args]
|
192
215
|
else
|
193
216
|
# extending a module with an interface is not supported yet
|
194
217
|
end
|
@@ -198,7 +221,10 @@ module TypeProf
|
|
198
221
|
when RBS::AST::Members::ClassVariable
|
199
222
|
cvars[member.name] = conv_type(member.type)
|
200
223
|
|
201
|
-
when RBS::AST::Members::Public
|
224
|
+
when RBS::AST::Members::Public
|
225
|
+
visibility = true
|
226
|
+
when RBS::AST::Members::Private
|
227
|
+
visibility = false
|
202
228
|
|
203
229
|
# The following declarations are ignoreable because they are handled in other level
|
204
230
|
when RBS::AST::Declarations::Constant
|
@@ -216,8 +242,7 @@ module TypeProf
|
|
216
242
|
type_params: type_params,
|
217
243
|
superclass: superclass,
|
218
244
|
members: {
|
219
|
-
|
220
|
-
extended_modules: extended_modules,
|
245
|
+
modules: modules,
|
221
246
|
methods: methods,
|
222
247
|
attr_methods: attr_methods,
|
223
248
|
ivars: ivars,
|
@@ -297,10 +322,14 @@ module TypeProf
|
|
297
322
|
return RBS::BuiltinNames::Object.name, []
|
298
323
|
end
|
299
324
|
|
300
|
-
def conv_method_def(rbs_method_types)
|
301
|
-
rbs_method_types.map do |method_type|
|
325
|
+
def conv_method_def(rbs_method_types, visibility)
|
326
|
+
sig_rets = rbs_method_types.map do |method_type|
|
302
327
|
conv_func(method_type.type_params, method_type.type, method_type.block)
|
303
328
|
end
|
329
|
+
{
|
330
|
+
sig_rets: sig_rets,
|
331
|
+
visibility: visibility,
|
332
|
+
}
|
304
333
|
end
|
305
334
|
|
306
335
|
def conv_func(type_params, func, block)
|
@@ -330,11 +359,12 @@ module TypeProf
|
|
330
359
|
}
|
331
360
|
end
|
332
361
|
|
333
|
-
def attr_method_def(kind, name, ty)
|
362
|
+
def attr_method_def(kind, name, ty, visibility)
|
334
363
|
{
|
335
364
|
kind: kind,
|
336
365
|
ivar: name,
|
337
366
|
ty: ty,
|
367
|
+
visibility: visibility,
|
338
368
|
}
|
339
369
|
end
|
340
370
|
|
@@ -407,8 +437,17 @@ module TypeProf
|
|
407
437
|
raise NotImplementedError
|
408
438
|
end
|
409
439
|
when RBS::Types::Alias
|
410
|
-
|
411
|
-
|
440
|
+
if @alias_resolution_stack[ty.name]
|
441
|
+
[:any]
|
442
|
+
else
|
443
|
+
begin
|
444
|
+
@alias_resolution_stack[ty.name] = true
|
445
|
+
alias_decl = @all_env.alias_decls[ty.name]
|
446
|
+
alias_decl ? conv_type(alias_decl.decl.type) : [:any]
|
447
|
+
ensure
|
448
|
+
@alias_resolution_stack.delete(ty.name)
|
449
|
+
end
|
450
|
+
end
|
412
451
|
when RBS::Types::Union
|
413
452
|
[:union, ty.types.map {|ty2| conv_type(ty2) }.compact]
|
414
453
|
when RBS::Types::Optional
|
@@ -455,9 +494,9 @@ module TypeProf
|
|
455
494
|
Import.new(scratch, json).import
|
456
495
|
end
|
457
496
|
|
458
|
-
def self.
|
459
|
-
|
460
|
-
Import.new(scratch, scratch.rbs_reader.
|
497
|
+
def self.import_rbs_files(scratch, rbs_paths)
|
498
|
+
rbs_paths = rbs_paths.map {|rbs_path| Pathname(rbs_path) }
|
499
|
+
Import.new(scratch, scratch.rbs_reader.load_paths(rbs_paths)).import(true)
|
461
500
|
end
|
462
501
|
|
463
502
|
def self.import_rbs_code(scratch, rbs_name, rbs_code)
|
@@ -502,22 +541,25 @@ module TypeProf
|
|
502
541
|
|
503
542
|
classes.each do |klass, superclass_type_args, members|
|
504
543
|
@scratch.add_superclass_type_args!(klass, superclass_type_args&.map {|ty| conv_type(ty) })
|
505
|
-
|
506
|
-
extended_modules = members[:extended_modules]
|
544
|
+
modules = members[:modules]
|
507
545
|
methods = members[:methods]
|
508
546
|
attr_methods = members[:attr_methods]
|
509
547
|
ivars = members[:ivars]
|
510
548
|
cvars = members[:cvars]
|
511
549
|
rbs_sources = members[:rbs_sources]
|
512
550
|
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
551
|
+
modules.each do |kind, mods|
|
552
|
+
mods.each do |mod, type_args|
|
553
|
+
type_args = type_args&.map {|ty| conv_type(ty) }
|
554
|
+
case kind
|
555
|
+
when :include
|
556
|
+
@scratch.mix_module(:after, klass, path_to_klass(mod), type_args, false, nil)
|
557
|
+
when :extend
|
558
|
+
@scratch.mix_module(:after, klass, path_to_klass(mod), type_args, true, nil)
|
559
|
+
when :prepend
|
560
|
+
@scratch.mix_module(:before, klass, path_to_klass(mod), type_args, false, nil)
|
561
|
+
end
|
562
|
+
end
|
521
563
|
end
|
522
564
|
|
523
565
|
methods.each do |(singleton, method_name), mdef|
|
@@ -530,7 +572,7 @@ module TypeProf
|
|
530
572
|
kind = mdef[:kind]
|
531
573
|
ivar = mdef[:ivar]
|
532
574
|
ty = conv_type(mdef[:ty]).remove_type_vars
|
533
|
-
@scratch.add_attr_method(klass,
|
575
|
+
@scratch.add_attr_method(klass, ivar, :"@#{ ivar }", kind, mdef[:visibility], nil)
|
534
576
|
@scratch.add_ivar_write!(Type::Instance.new(klass), :"@#{ ivar }", ty, nil)
|
535
577
|
end
|
536
578
|
|
@@ -560,11 +602,11 @@ module TypeProf
|
|
560
602
|
end
|
561
603
|
|
562
604
|
def conv_method_def(method_name, mdef, rbs_source)
|
563
|
-
sig_rets = mdef.flat_map do |sig_ret|
|
605
|
+
sig_rets = mdef[:sig_rets].flat_map do |sig_ret|
|
564
606
|
conv_func(sig_ret)
|
565
607
|
end
|
566
608
|
|
567
|
-
TypedMethodDef.new(sig_rets, rbs_source)
|
609
|
+
TypedMethodDef.new(sig_rets, rbs_source, mdef[:visibility])
|
568
610
|
end
|
569
611
|
|
570
612
|
def conv_func(sig_ret)
|
@@ -664,7 +706,9 @@ module TypeProf
|
|
664
706
|
klass = Type::Builtin[:obj]
|
665
707
|
path.each do |name|
|
666
708
|
klass = @scratch.get_constant(klass, name)
|
667
|
-
|
709
|
+
if klass == Type.any
|
710
|
+
raise TypeProfError.new("A constant `#{ path.join("::") }' is used but not defined in RBS")
|
711
|
+
end
|
668
712
|
end
|
669
713
|
klass
|
670
714
|
end
|