typeprof 0.15.1 → 0.20.1
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/.github/workflows/main.yml +1 -1
- data/Gemfile.lock +4 -4
- data/doc/ide.md +81 -0
- data/doc/typeprof-for-ide-log.png +0 -0
- data/doc/typeprof-for-ide.png +0 -0
- data/exe/typeprof +5 -1
- data/lib/typeprof/analyzer.rb +234 -55
- data/lib/typeprof/arguments.rb +1 -0
- data/lib/typeprof/builtin.rb +23 -23
- data/lib/typeprof/cli.rb +23 -5
- data/lib/typeprof/code-range.rb +177 -0
- data/lib/typeprof/config.rb +41 -20
- data/lib/typeprof/container-type.rb +10 -1
- data/lib/typeprof/export.rb +199 -20
- data/lib/typeprof/import.rb +38 -9
- data/lib/typeprof/iseq.rb +223 -16
- data/lib/typeprof/lsp.rb +884 -0
- data/lib/typeprof/method.rb +15 -11
- data/lib/typeprof/type.rb +46 -38
- data/lib/typeprof/utils.rb +18 -1
- data/lib/typeprof/version.rb +1 -1
- data/lib/typeprof.rb +3 -5
- data/typeprof-lsp +3 -0
- data/typeprof.gemspec +2 -2
- data/vscode/.gitignore +5 -0
- data/vscode/.vscode/launch.json +16 -0
- data/vscode/.vscodeignore +7 -0
- data/vscode/README.md +22 -0
- data/vscode/development.md +31 -0
- data/vscode/package-lock.json +2211 -0
- data/vscode/package.json +71 -0
- data/vscode/sandbox/test.rb +24 -0
- data/vscode/src/extension.ts +285 -0
- data/vscode/tsconfig.json +15 -0
- metadata +21 -334
- data/smoke/alias.rb +0 -31
- data/smoke/alias2.rb +0 -21
- data/smoke/any-cbase.rb +0 -5
- data/smoke/any1.rb +0 -16
- data/smoke/any2.rb +0 -18
- data/smoke/arguments.rb +0 -17
- data/smoke/arguments2.rb +0 -56
- data/smoke/array-each.rb +0 -15
- data/smoke/array-each2.rb +0 -16
- data/smoke/array-each3.rb +0 -13
- data/smoke/array-ltlt.rb +0 -14
- data/smoke/array-ltlt2.rb +0 -17
- data/smoke/array-map.rb +0 -12
- data/smoke/array-map2.rb +0 -11
- data/smoke/array-map3.rb +0 -23
- data/smoke/array-mul.rb +0 -18
- data/smoke/array-plus1.rb +0 -11
- data/smoke/array-plus2.rb +0 -16
- data/smoke/array-pop.rb +0 -12
- data/smoke/array-range-aref.rb +0 -71
- data/smoke/array-replace.rb +0 -13
- data/smoke/array-s-aref.rb +0 -12
- data/smoke/array1.rb +0 -27
- data/smoke/array10.rb +0 -15
- data/smoke/array11.rb +0 -14
- data/smoke/array12.rb +0 -25
- data/smoke/array13.rb +0 -31
- data/smoke/array14.rb +0 -14
- data/smoke/array15.rb +0 -16
- data/smoke/array2.rb +0 -28
- data/smoke/array3.rb +0 -26
- data/smoke/array4.rb +0 -15
- data/smoke/array5.rb +0 -14
- data/smoke/array6.rb +0 -17
- data/smoke/array7.rb +0 -14
- data/smoke/array8.rb +0 -13
- data/smoke/array9.rb +0 -13
- data/smoke/attr-module.rb +0 -24
- data/smoke/attr-vis.rb +0 -43
- data/smoke/attr-vis.rbs +0 -4
- data/smoke/attr.rb +0 -28
- data/smoke/autoload.rb +0 -14
- data/smoke/backtrace.rb +0 -33
- data/smoke/block-ambiguous.rb +0 -37
- data/smoke/block-args1-rest.rb +0 -64
- data/smoke/block-args1.rb +0 -60
- data/smoke/block-args2-rest.rb +0 -64
- data/smoke/block-args2.rb +0 -60
- data/smoke/block-args3-rest.rb +0 -75
- data/smoke/block-args3.rb +0 -71
- data/smoke/block-blockarg.rb +0 -28
- data/smoke/block-kwarg.rb +0 -53
- data/smoke/block1.rb +0 -23
- data/smoke/block10.rb +0 -15
- data/smoke/block11.rb +0 -40
- data/smoke/block12.rb +0 -23
- data/smoke/block13.rb +0 -9
- data/smoke/block13.rbs +0 -3
- data/smoke/block14.rb +0 -18
- data/smoke/block2.rb +0 -15
- data/smoke/block3.rb +0 -38
- data/smoke/block4.rb +0 -19
- data/smoke/block5.rb +0 -21
- data/smoke/block6.rb +0 -21
- data/smoke/block7.rb +0 -19
- data/smoke/block8.rb +0 -28
- data/smoke/block9.rb +0 -13
- data/smoke/block_given.rb +0 -37
- data/smoke/blown.rb +0 -13
- data/smoke/break1.rb +0 -19
- data/smoke/break2.rb +0 -16
- data/smoke/break3.rb +0 -13
- data/smoke/break4.rb +0 -17
- data/smoke/case.rb +0 -17
- data/smoke/case2.rb +0 -18
- data/smoke/case3.rb +0 -17
- data/smoke/class-hierarchy.rb +0 -54
- data/smoke/class-hierarchy2.rb +0 -27
- data/smoke/class-new.rb +0 -15
- data/smoke/class.rb +0 -7
- data/smoke/class_eval.rb +0 -22
- data/smoke/class_instance_var.rb +0 -9
- data/smoke/class_method.rb +0 -25
- data/smoke/class_method2.rb +0 -21
- data/smoke/class_method3.rb +0 -29
- data/smoke/constant1.rb +0 -46
- data/smoke/constant2.rb +0 -36
- data/smoke/constant3.rb +0 -10
- data/smoke/constant4.rb +0 -12
- data/smoke/context-sensitive1.rb +0 -13
- data/smoke/cvar.rb +0 -31
- data/smoke/cvar2.rb +0 -17
- data/smoke/define_method.rb +0 -16
- data/smoke/define_method2.rb +0 -18
- data/smoke/define_method3.rb +0 -14
- data/smoke/define_method3.rbs +0 -3
- data/smoke/define_method4.rb +0 -15
- data/smoke/define_method4.rbs +0 -3
- data/smoke/define_method5.rb +0 -12
- data/smoke/define_method6.rb +0 -19
- data/smoke/define_method7.rb +0 -18
- data/smoke/demo.rb +0 -81
- data/smoke/demo1.rb +0 -17
- data/smoke/demo10.rb +0 -21
- data/smoke/demo11.rb +0 -12
- data/smoke/demo2.rb +0 -15
- data/smoke/demo3.rb +0 -17
- data/smoke/demo4.rb +0 -27
- data/smoke/demo5.rb +0 -16
- data/smoke/demo6.rb +0 -22
- data/smoke/demo7.rb +0 -15
- data/smoke/demo8.rb +0 -19
- data/smoke/demo9.rb +0 -18
- data/smoke/dummy-execution1.rb +0 -15
- data/smoke/dummy-execution2.rb +0 -16
- data/smoke/dummy_element.rb +0 -14
- data/smoke/ensure1.rb +0 -21
- data/smoke/enum_for.rb +0 -15
- data/smoke/enum_for2.rb +0 -17
- data/smoke/enumerator.rb +0 -16
- data/smoke/expandarray1.rb +0 -23
- data/smoke/expandarray2.rb +0 -24
- data/smoke/extended.rb +0 -38
- data/smoke/fib.rb +0 -28
- data/smoke/flip-flop.rb +0 -28
- data/smoke/flow1.rb +0 -17
- data/smoke/flow10.rb +0 -17
- data/smoke/flow11.rb +0 -17
- data/smoke/flow2.rb +0 -15
- data/smoke/flow3.rb +0 -15
- data/smoke/flow4.rb +0 -5
- data/smoke/flow5.rb +0 -20
- data/smoke/flow6.rb +0 -20
- data/smoke/flow7.rb +0 -21
- data/smoke/flow8.rb +0 -14
- data/smoke/flow9.rb +0 -12
- data/smoke/for.rb +0 -9
- data/smoke/freeze.rb +0 -12
- data/smoke/function.rb +0 -17
- data/smoke/gvar.rb +0 -14
- data/smoke/gvar2.rb +0 -18
- data/smoke/gvar2.rbs +0 -1
- data/smoke/hash-bot.rb +0 -12
- data/smoke/hash-fetch.rb +0 -28
- data/smoke/hash-merge-bang.rb +0 -12
- data/smoke/hash1.rb +0 -20
- data/smoke/hash2.rb +0 -13
- data/smoke/hash3.rb +0 -14
- data/smoke/hash4.rb +0 -11
- data/smoke/hash5.rb +0 -14
- data/smoke/huge_union.rb +0 -86
- data/smoke/identifier_keywords.rb +0 -17
- data/smoke/included.rb +0 -38
- data/smoke/inheritance.rb +0 -34
- data/smoke/inheritance2.rb +0 -35
- data/smoke/inherited.rb +0 -26
- data/smoke/initialize.rb +0 -28
- data/smoke/instance_eval.rb +0 -18
- data/smoke/instance_eval2.rb +0 -10
- data/smoke/instance_eval3.rb +0 -25
- data/smoke/instance_eval4.rb +0 -12
- data/smoke/int_times.rb +0 -15
- data/smoke/integer.rb +0 -11
- data/smoke/ivar.rb +0 -31
- data/smoke/ivar2.rb +0 -30
- data/smoke/ivar3.rb +0 -17
- data/smoke/ivar3.rbs +0 -3
- data/smoke/ivar4.rb +0 -21
- data/smoke/kernel-class.rb +0 -13
- data/smoke/keyword1.rb +0 -12
- data/smoke/keyword2.rb +0 -12
- data/smoke/keyword3.rb +0 -12
- data/smoke/keyword4.rb +0 -12
- data/smoke/keyword5.rb +0 -16
- data/smoke/kwrest.rb +0 -13
- data/smoke/kwrest.rbs +0 -3
- data/smoke/kwsplat1.rb +0 -43
- data/smoke/kwsplat2.rb +0 -13
- data/smoke/lit-complex.rb +0 -10
- data/smoke/lit-encoding.rb +0 -10
- data/smoke/manual-rbs.rb +0 -29
- data/smoke/manual-rbs.rbs +0 -3
- data/smoke/manual-rbs2.rb +0 -21
- data/smoke/manual-rbs2.rbs +0 -8
- data/smoke/manual-rbs3.rb +0 -13
- data/smoke/manual-rbs3.rbs +0 -3
- data/smoke/masgn1.rb +0 -14
- data/smoke/masgn2.rb +0 -18
- data/smoke/masgn3.rb +0 -13
- data/smoke/method_in_branch.rb +0 -23
- data/smoke/method_missing.rb +0 -29
- data/smoke/module1.rb +0 -29
- data/smoke/module2.rb +0 -28
- data/smoke/module3.rb +0 -33
- data/smoke/module4.rb +0 -35
- data/smoke/module5.rb +0 -17
- data/smoke/module6.rb +0 -40
- data/smoke/module_function1.rb +0 -29
- data/smoke/module_function2.rb +0 -29
- data/smoke/multiple-include.rb +0 -15
- data/smoke/multiple-superclass.rb +0 -28
- data/smoke/next1.rb +0 -21
- data/smoke/next2.rb +0 -17
- data/smoke/noname.rb +0 -9
- data/smoke/object-send1.rb +0 -23
- data/smoke/object-send2.rb +0 -10
- data/smoke/object-send3.rb +0 -18
- data/smoke/once.rb +0 -13
- data/smoke/optional1.rb +0 -14
- data/smoke/optional2.rb +0 -16
- data/smoke/optional3.rb +0 -11
- data/smoke/or_raise.rb +0 -18
- data/smoke/parameterizedd-self.rb +0 -20
- data/smoke/parameterizedd-self2.rb +0 -15
- data/smoke/pathname1.rb +0 -14
- data/smoke/pathname2.rb +0 -14
- data/smoke/pattern-match1.rb +0 -19
- data/smoke/pattern-match2.rb +0 -16
- data/smoke/prepend1.rb +0 -33
- data/smoke/prepend2.rb +0 -10
- data/smoke/prepend2.rbs +0 -9
- data/smoke/primitive_method.rb +0 -19
- data/smoke/printf.rb +0 -20
- data/smoke/proc.rb +0 -20
- data/smoke/proc2.rb +0 -17
- data/smoke/proc3.rb +0 -15
- data/smoke/proc4.rb +0 -12
- data/smoke/proc5.rb +0 -19
- data/smoke/proc6.rb +0 -13
- data/smoke/proc7.rb +0 -32
- data/smoke/public.rb +0 -38
- data/smoke/range.rb +0 -14
- data/smoke/rbs-alias.rb +0 -10
- data/smoke/rbs-alias.rbs +0 -4
- data/smoke/rbs-attr.rb +0 -27
- data/smoke/rbs-attr.rbs +0 -5
- data/smoke/rbs-attr2.rb +0 -11
- data/smoke/rbs-attr2.rbs +0 -3
- data/smoke/rbs-extend.rb +0 -10
- data/smoke/rbs-extend.rbs +0 -7
- data/smoke/rbs-interface.rb +0 -25
- data/smoke/rbs-interface.rbs +0 -12
- data/smoke/rbs-module.rb +0 -26
- data/smoke/rbs-module.rbs +0 -4
- data/smoke/rbs-opt-and-rest.rb +0 -10
- data/smoke/rbs-opt-and-rest.rbs +0 -3
- data/smoke/rbs-proc1.rb +0 -10
- data/smoke/rbs-proc1.rbs +0 -3
- data/smoke/rbs-proc2.rb +0 -21
- data/smoke/rbs-proc2.rbs +0 -3
- data/smoke/rbs-proc3.rb +0 -14
- data/smoke/rbs-proc3.rbs +0 -4
- data/smoke/rbs-record.rb +0 -18
- data/smoke/rbs-record.rbs +0 -4
- data/smoke/rbs-tyvar.rb +0 -19
- data/smoke/rbs-tyvar.rbs +0 -5
- data/smoke/rbs-tyvar2.rb +0 -21
- data/smoke/rbs-tyvar2.rbs +0 -9
- data/smoke/rbs-tyvar3.rb +0 -18
- data/smoke/rbs-tyvar3.rbs +0 -5
- data/smoke/rbs-tyvar4.rb +0 -37
- data/smoke/rbs-tyvar5.rb +0 -13
- data/smoke/rbs-tyvar5.rbs +0 -8
- data/smoke/rbs-tyvar6.rb +0 -18
- data/smoke/rbs-tyvar6.rbs +0 -12
- data/smoke/rbs-tyvar7.rb +0 -12
- data/smoke/rbs-tyvar7.rbs +0 -7
- data/smoke/rbs-vars.rb +0 -38
- data/smoke/rbs-vars.rbs +0 -7
- data/smoke/redo1.rb +0 -22
- data/smoke/redo2.rb +0 -23
- data/smoke/req-keyword.rb +0 -13
- data/smoke/require1.rb +0 -13
- data/smoke/require2.rb +0 -13
- data/smoke/rescue1.rb +0 -21
- data/smoke/rescue2.rb +0 -23
- data/smoke/rescue3.rb +0 -20
- data/smoke/rescue4.rb +0 -17
- data/smoke/respond_to.rb +0 -23
- data/smoke/rest-farg.rb +0 -11
- data/smoke/rest1.rb +0 -26
- data/smoke/rest2.rb +0 -31
- data/smoke/rest3.rb +0 -37
- data/smoke/rest4.rb +0 -19
- data/smoke/rest5.rb +0 -11
- data/smoke/rest6.rb +0 -12
- data/smoke/retry1.rb +0 -21
- data/smoke/return.rb +0 -14
- data/smoke/reveal.rb +0 -13
- data/smoke/simple.rb +0 -12
- data/smoke/singleton_class.rb +0 -8
- data/smoke/singleton_method.rb +0 -12
- data/smoke/step.rb +0 -18
- data/smoke/string-split.rb +0 -12
- data/smoke/struct-keyword_init.rb +0 -10
- data/smoke/struct.rb +0 -13
- data/smoke/struct2.rb +0 -25
- data/smoke/struct3.rb +0 -14
- data/smoke/struct4.rb +0 -7
- data/smoke/struct5.rb +0 -16
- data/smoke/struct6.rb +0 -15
- data/smoke/struct7.rb +0 -17
- data/smoke/stub-keyword.rb +0 -10
- data/smoke/super1.rb +0 -69
- data/smoke/super2.rb +0 -16
- data/smoke/super3.rb +0 -20
- data/smoke/super4.rb +0 -45
- data/smoke/super5.rb +0 -38
- data/smoke/svar1.rb +0 -13
- data/smoke/symbol-proc-attr.rb +0 -22
- data/smoke/symbol-proc-attr2.rb +0 -15
- data/smoke/symbol-proc-bot.rb +0 -13
- data/smoke/symbol-proc.rb +0 -25
- data/smoke/tap1.rb +0 -18
- data/smoke/toplevel.rb +0 -13
- data/smoke/two-map.rb +0 -18
- data/smoke/type_var.rb +0 -11
- data/smoke/typed_method.rb +0 -16
- data/smoke/uninitialize-var.rb +0 -13
- data/smoke/union-recv.rb +0 -35
- data/smoke/user-demo.rb +0 -15
- data/smoke/wrong-extend.rb +0 -27
- data/smoke/wrong-include.rb +0 -27
- data/smoke/wrong-include2.rb +0 -17
- data/smoke/wrong-rbs.rb +0 -15
- data/smoke/wrong-rbs.rbs +0 -7
- data/testbed/ao.rb +0 -297
- data/testbed/diff-lcs-entrypoint.rb +0 -4
- data/testbed/goodcheck-Gemfile.lock +0 -51
data/lib/typeprof/export.rb
CHANGED
|
@@ -26,7 +26,7 @@ module TypeProf
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def show_message(terminated, output)
|
|
29
|
-
if Config.options[:show_typeprof_version]
|
|
29
|
+
if Config.current.options[:show_typeprof_version]
|
|
30
30
|
output.puts "# TypeProf #{ VERSION }"
|
|
31
31
|
output.puts
|
|
32
32
|
end
|
|
@@ -38,7 +38,7 @@ module TypeProf
|
|
|
38
38
|
|
|
39
39
|
def show_error(errors, backward_edge, output)
|
|
40
40
|
return if errors.empty?
|
|
41
|
-
return unless Config.options[:show_errors]
|
|
41
|
+
return unless Config.current.options[:show_errors]
|
|
42
42
|
|
|
43
43
|
output.puts "# Errors"
|
|
44
44
|
errors.each do |ep, msg|
|
|
@@ -69,14 +69,17 @@ module TypeProf
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
def show_gvars(scratch, gvars, output)
|
|
72
|
+
gvars = gvars.dump.filter_map do |gvar_name, entry|
|
|
73
|
+
if entry.type != Type.bot && !entry.rbs_declared
|
|
74
|
+
[gvar_name, entry]
|
|
75
|
+
end
|
|
76
|
+
end
|
|
72
77
|
# A signature for global variables is not supported in RBS
|
|
73
|
-
return if gvars.
|
|
78
|
+
return if gvars.empty?
|
|
74
79
|
|
|
75
80
|
output.puts "# Global variables"
|
|
76
|
-
gvars.
|
|
77
|
-
|
|
78
|
-
s = entry.rbs_declared ? "#" : ""
|
|
79
|
-
output.puts s + "#{ gvar_name }: #{ entry.type.screen_name(scratch) }"
|
|
81
|
+
gvars.each do |gvar_name, entry|
|
|
82
|
+
output.puts "#{ gvar_name }: #{ entry.type.screen_name(scratch) }"
|
|
80
83
|
end
|
|
81
84
|
output.puts
|
|
82
85
|
end
|
|
@@ -107,16 +110,17 @@ module TypeProf
|
|
|
107
110
|
@scratch.namespace = class_def.name
|
|
108
111
|
|
|
109
112
|
consts = {}
|
|
110
|
-
class_def.consts.each do |name, (ty,
|
|
113
|
+
class_def.consts.each do |name, (ty, loc)|
|
|
114
|
+
next unless loc
|
|
111
115
|
next if ty.is_a?(Type::Class)
|
|
112
|
-
next if
|
|
116
|
+
next if Config.current.check_dir_filter(loc[0]) == :exclude
|
|
113
117
|
consts[name] = ty.screen_name(@scratch)
|
|
114
118
|
end
|
|
115
119
|
|
|
116
120
|
modules = class_def.modules.to_h do |kind, mods|
|
|
117
121
|
mods = mods.to_h do |singleton, mods|
|
|
118
122
|
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 }
|
|
123
|
+
next if absolute_paths.all? {|path| !path || Config.current.check_dir_filter(path) == :exclude }
|
|
120
124
|
Type::Instance.new(mod_def.klass_obj).screen_name(@scratch)
|
|
121
125
|
end
|
|
122
126
|
[singleton, mods]
|
|
@@ -139,7 +143,7 @@ module TypeProf
|
|
|
139
143
|
|
|
140
144
|
ctx = ctxs.find {|ctx| ctx.mid == mid } || ctxs.first
|
|
141
145
|
|
|
142
|
-
next if Config.check_dir_filter(ctx.iseq.absolute_path) == :exclude
|
|
146
|
+
next if Config.current.check_dir_filter(ctx.iseq.absolute_path) == :exclude
|
|
143
147
|
|
|
144
148
|
method_name = mid
|
|
145
149
|
method_name = "self.#{ method_name }" if singleton
|
|
@@ -149,7 +153,7 @@ module TypeProf
|
|
|
149
153
|
source_locations[key] ||= ctx.iseq.source_location(0)
|
|
150
154
|
(methods[key] ||= []) << @scratch.show_method_signature(ctx)
|
|
151
155
|
when AliasMethodDef
|
|
152
|
-
next if mdef.def_ep && Config.check_dir_filter(mdef.def_ep.source_location) == :exclude
|
|
156
|
+
next if mdef.def_ep && Config.current.check_dir_filter(mdef.def_ep.source_location) == :exclude
|
|
153
157
|
alias_name, orig_name = mid, mdef.orig_mid
|
|
154
158
|
if singleton
|
|
155
159
|
alias_name = "self.#{ alias_name }"
|
|
@@ -162,7 +166,7 @@ module TypeProf
|
|
|
162
166
|
when AttrMethodDef
|
|
163
167
|
next if !mdef.def_ep
|
|
164
168
|
absolute_path = mdef.def_ep.ctx.iseq.absolute_path
|
|
165
|
-
next if !absolute_path || Config.check_dir_filter(absolute_path) == :exclude
|
|
169
|
+
next if !absolute_path || Config.current.check_dir_filter(absolute_path) == :exclude
|
|
166
170
|
mid = mid.to_s[0..-2].to_sym if mid.to_s.end_with?("=")
|
|
167
171
|
method_name = mid
|
|
168
172
|
method_name = "self.#{ mid }" if singleton
|
|
@@ -185,13 +189,14 @@ module TypeProf
|
|
|
185
189
|
key = [:rbs, method_name]
|
|
186
190
|
methods[key] = sigs
|
|
187
191
|
visibilities[key] ||= mdef.pub_meth
|
|
192
|
+
source_locations[key] ||= mdef.iseq&.source_location(0)
|
|
188
193
|
end
|
|
189
194
|
end
|
|
190
195
|
end
|
|
191
196
|
end
|
|
192
197
|
|
|
193
198
|
ivars = ivars.map do |(singleton, var), entry|
|
|
194
|
-
next if entry.absolute_paths.all? {|path| Config.check_dir_filter(path) == :exclude }
|
|
199
|
+
next if entry.absolute_paths.all? {|path| Config.current.check_dir_filter(path) == :exclude }
|
|
195
200
|
ty = entry.type
|
|
196
201
|
next unless var.to_s.start_with?("@")
|
|
197
202
|
var = "self.#{ var }" if singleton
|
|
@@ -201,12 +206,12 @@ module TypeProf
|
|
|
201
206
|
end.compact
|
|
202
207
|
|
|
203
208
|
cvars = cvars.map do |var, entry|
|
|
204
|
-
next if entry.absolute_paths.all? {|path| Config.check_dir_filter(path) == :exclude }
|
|
209
|
+
next if entry.absolute_paths.all? {|path| Config.current.check_dir_filter(path) == :exclude }
|
|
205
210
|
next if entry.rbs_declared
|
|
206
211
|
[var, entry.type.screen_name(@scratch)]
|
|
207
212
|
end.compact
|
|
208
213
|
|
|
209
|
-
if !class_def.absolute_path || Config.check_dir_filter(class_def.absolute_path) == :exclude
|
|
214
|
+
if !class_def.absolute_path || Config.current.check_dir_filter(class_def.absolute_path) == :exclude
|
|
210
215
|
if methods.keys.all? {|type,| type == :rbs }
|
|
211
216
|
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
217
|
end
|
|
@@ -229,8 +234,182 @@ module TypeProf
|
|
|
229
234
|
)
|
|
230
235
|
end
|
|
231
236
|
|
|
237
|
+
def conv_class_lsp(namespace, class_def)
|
|
238
|
+
@scratch.namespace = namespace
|
|
239
|
+
|
|
240
|
+
if class_def.klass_obj.superclass != :__root__ && class_def.klass_obj.superclass
|
|
241
|
+
omit = class_def.klass_obj.superclass == Type::Builtin[:obj] || class_def.klass_obj == Type::Builtin[:obj]
|
|
242
|
+
superclass = omit ? nil : @scratch.get_class_name(class_def.klass_obj.superclass)
|
|
243
|
+
type_args = class_def.klass_obj.superclass_type_args
|
|
244
|
+
if type_args && !type_args.empty?
|
|
245
|
+
superclass += "[#{ type_args.map {|ty| ty.screen_name(@scratch) }.join(", ") }]"
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
@scratch.namespace = class_def.name
|
|
250
|
+
|
|
251
|
+
consts = {}
|
|
252
|
+
class_def.consts.each do |name, (ty, loc)|
|
|
253
|
+
next unless loc
|
|
254
|
+
next if ty.is_a?(Type::Class)
|
|
255
|
+
next if Config.current.check_dir_filter(loc[0]) == :exclude
|
|
256
|
+
consts[name] = ty.screen_name(@scratch)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
modules = class_def.modules.to_h do |kind, mods|
|
|
260
|
+
mods = mods.to_h do |singleton, mods|
|
|
261
|
+
mods = mods.filter_map do |mod_def, _type_args, absolute_paths|
|
|
262
|
+
next if absolute_paths.all? {|path| !path || Config.current.check_dir_filter(path) == :exclude }
|
|
263
|
+
Type::Instance.new(mod_def.klass_obj).screen_name(@scratch)
|
|
264
|
+
end
|
|
265
|
+
[singleton, mods]
|
|
266
|
+
end
|
|
267
|
+
[kind, mods]
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
visibilities = {}
|
|
271
|
+
source_locations = {}
|
|
272
|
+
methods = {}
|
|
273
|
+
ivars = class_def.ivars.dump
|
|
274
|
+
cvars = class_def.cvars.dump
|
|
275
|
+
|
|
276
|
+
class_def.methods.each do |(singleton, mid), mdefs|
|
|
277
|
+
mdefs.each do |mdef|
|
|
278
|
+
case mdef
|
|
279
|
+
when ISeqMethodDef
|
|
280
|
+
ctxs = @iseq_method_to_ctxs[mdef]
|
|
281
|
+
next unless ctxs
|
|
282
|
+
|
|
283
|
+
ctx = ctxs.find {|ctx| ctx.mid == mid } || ctxs.first
|
|
284
|
+
|
|
285
|
+
next if Config.current.check_dir_filter(ctx.iseq.absolute_path) == :exclude
|
|
286
|
+
|
|
287
|
+
method_name = mid
|
|
288
|
+
method_name = "self.#{ method_name }" if singleton
|
|
289
|
+
|
|
290
|
+
key = [:iseq, method_name]
|
|
291
|
+
visibilities[key] ||= mdef.pub_meth
|
|
292
|
+
source_locations[key] ||= [ctx.iseq.source_location(0)]
|
|
293
|
+
sig = @scratch.show_method_signature(ctx)
|
|
294
|
+
(methods[key] ||= []) << sig if sig
|
|
295
|
+
when AliasMethodDef
|
|
296
|
+
alias_name, orig_name = mid, mdef.orig_mid
|
|
297
|
+
if singleton
|
|
298
|
+
alias_name = "self.#{ alias_name }"
|
|
299
|
+
orig_name = "self.#{ orig_name }"
|
|
300
|
+
end
|
|
301
|
+
key = [:alias, alias_name]
|
|
302
|
+
visibilities[key] ||= mdef.pub_meth
|
|
303
|
+
source_locations[key] ||= [mdef.def_ep&.source_location]
|
|
304
|
+
methods[key] = orig_name
|
|
305
|
+
when AttrMethodDef
|
|
306
|
+
next if !mdef.def_ep
|
|
307
|
+
absolute_path = mdef.def_ep.ctx.iseq.absolute_path
|
|
308
|
+
next if !absolute_path || Config.current.check_dir_filter(absolute_path) == :exclude
|
|
309
|
+
mid = mid.to_s[0..-2].to_sym if mid.to_s.end_with?("=")
|
|
310
|
+
method_name = mid
|
|
311
|
+
method_name = "self.#{ mid }" if singleton
|
|
312
|
+
method_name = [method_name, :"@#{ mid }" != mdef.ivar]
|
|
313
|
+
key = [:attr, method_name]
|
|
314
|
+
visibilities[key] ||= mdef.pub_meth
|
|
315
|
+
source_locations[key] ||= [mdef.def_ep.source_location]
|
|
316
|
+
if methods[key]
|
|
317
|
+
if methods[key][0] != mdef.kind
|
|
318
|
+
methods[key][0] = :accessor
|
|
319
|
+
end
|
|
320
|
+
else
|
|
321
|
+
entry = ivars[[singleton, mdef.ivar]]
|
|
322
|
+
ty = entry ? entry.type : Type.any
|
|
323
|
+
methods[key] = [mdef.kind, ty.screen_name(@scratch), ty.include_untyped?(@scratch)]
|
|
324
|
+
end
|
|
325
|
+
when TypedMethodDef
|
|
326
|
+
if mdef.rbs_source
|
|
327
|
+
method_name, sigs, rbs_code_range = mdef.rbs_source
|
|
328
|
+
key = [:rbs, method_name]
|
|
329
|
+
methods[key] = sigs
|
|
330
|
+
visibilities[key] ||= mdef.pub_meth
|
|
331
|
+
source_locations[key] ||= [mdef.iseq&.source_location(0), rbs_code_range]
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
ivars = ivars.map do |(singleton, var), entry|
|
|
338
|
+
next if entry.absolute_paths.all? {|path| Config.current.check_dir_filter(path) == :exclude }
|
|
339
|
+
ty = entry.type
|
|
340
|
+
next unless var.to_s.start_with?("@")
|
|
341
|
+
var = "self.#{ var }" if singleton
|
|
342
|
+
next if methods[[:attr, [singleton ? "self.#{ var.to_s[1..] }" : var.to_s[1..].to_sym, false]]]
|
|
343
|
+
next if entry.rbs_declared
|
|
344
|
+
[var, ty.screen_name(@scratch)]
|
|
345
|
+
end.compact
|
|
346
|
+
|
|
347
|
+
cvars = cvars.map do |var, entry|
|
|
348
|
+
next if entry.absolute_paths.all? {|path| Config.current.check_dir_filter(path) == :exclude }
|
|
349
|
+
next if entry.rbs_declared
|
|
350
|
+
[var, entry.type.screen_name(@scratch)]
|
|
351
|
+
end.compact
|
|
352
|
+
|
|
353
|
+
if !class_def.absolute_path || Config.current.check_dir_filter(class_def.absolute_path) == :exclude
|
|
354
|
+
if methods.keys.all? {|type,| type == :rbs }
|
|
355
|
+
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?
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
@scratch.namespace = nil
|
|
360
|
+
|
|
361
|
+
ClassData.new(
|
|
362
|
+
kind: class_def.kind,
|
|
363
|
+
name: class_def.name,
|
|
364
|
+
superclass: superclass,
|
|
365
|
+
consts: consts,
|
|
366
|
+
modules: modules,
|
|
367
|
+
ivars: ivars,
|
|
368
|
+
cvars: cvars,
|
|
369
|
+
methods: methods,
|
|
370
|
+
visibilities: visibilities,
|
|
371
|
+
source_locations: source_locations,
|
|
372
|
+
)
|
|
373
|
+
end
|
|
374
|
+
|
|
232
375
|
ClassData = Struct.new(:kind, :name, :superclass, :consts, :modules, :ivars, :cvars, :methods, :visibilities, :source_locations, :inner_classes, keyword_init: true)
|
|
233
376
|
|
|
377
|
+
def show_lsp
|
|
378
|
+
res = []
|
|
379
|
+
@class_defs.each_value do |class_def|
|
|
380
|
+
class_data = conv_class_lsp([], class_def)
|
|
381
|
+
next unless class_data
|
|
382
|
+
class_data.methods.each do |key, arg|
|
|
383
|
+
source_location, rbs_code_range = class_data.source_locations[key]
|
|
384
|
+
type, (method_name, hidden) = key
|
|
385
|
+
case type
|
|
386
|
+
when :attr
|
|
387
|
+
kind, ty, untyped = *arg
|
|
388
|
+
line = "attr_#{ kind } #{ method_name }#{ hidden ? "()" : "" }: #{ ty }"
|
|
389
|
+
when :rbs
|
|
390
|
+
sigs = arg.sort.join(" | ")
|
|
391
|
+
line = "# def #{ method_name }: #{ sigs }"
|
|
392
|
+
when :iseq
|
|
393
|
+
sigs = []
|
|
394
|
+
untyped = false
|
|
395
|
+
arg.each do |sig, untyped0|
|
|
396
|
+
sigs << sig
|
|
397
|
+
untyped ||= untyped0
|
|
398
|
+
end
|
|
399
|
+
sigs = sigs.sort.join(" | ")
|
|
400
|
+
line = "def #{ method_name }: #{ sigs }"
|
|
401
|
+
when :alias
|
|
402
|
+
orig_name = arg
|
|
403
|
+
line = "alias #{ method_name } #{ orig_name }"
|
|
404
|
+
end
|
|
405
|
+
if source_location =~ /:(\d+)$/
|
|
406
|
+
res << [$`, $1.to_i, line, rbs_code_range, class_data.kind, class_data.name]
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
end
|
|
410
|
+
res
|
|
411
|
+
end
|
|
412
|
+
|
|
234
413
|
def show(stat_eps, output)
|
|
235
414
|
# make the class hierarchy
|
|
236
415
|
root = {}
|
|
@@ -267,7 +446,7 @@ module TypeProf
|
|
|
267
446
|
coverage = {}
|
|
268
447
|
stat_eps.each do |ep|
|
|
269
448
|
path = ep.ctx.iseq.path
|
|
270
|
-
lineno = ep.ctx.iseq.
|
|
449
|
+
lineno = ep.ctx.iseq.insns[ep.pc].lineno - 1
|
|
271
450
|
(coverage[path] ||= [])[lineno] ||= 0
|
|
272
451
|
(coverage[path] ||= [])[lineno] += 1
|
|
273
452
|
end
|
|
@@ -337,7 +516,7 @@ module TypeProf
|
|
|
337
516
|
prev_vis = vis
|
|
338
517
|
end
|
|
339
518
|
source_location = class_data.source_locations[key]
|
|
340
|
-
if Config.options[:show_source_locations] && source_location
|
|
519
|
+
if Config.current.options[:show_source_locations] && source_location
|
|
341
520
|
lines << nil
|
|
342
521
|
lines << (indent + " # #{ source_location }")
|
|
343
522
|
end
|
|
@@ -345,7 +524,7 @@ module TypeProf
|
|
|
345
524
|
case type
|
|
346
525
|
when :attr
|
|
347
526
|
kind, ty, untyped = *arg
|
|
348
|
-
exclude = Config.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
|
527
|
+
exclude = Config.current.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
|
349
528
|
lines << (indent + "#{ exclude } attr_#{ kind } #{ method_name }#{ hidden ? "()" : "" }: #{ ty }")
|
|
350
529
|
when :rbs
|
|
351
530
|
sigs = arg.sort.join("\n" + indent + "#" + " " * (method_name.size + 5) + "| ")
|
|
@@ -358,7 +537,7 @@ module TypeProf
|
|
|
358
537
|
untyped ||= untyped0
|
|
359
538
|
end
|
|
360
539
|
sigs = sigs.sort.join("\n" + indent + " " * (method_name.size + 6) + "| ")
|
|
361
|
-
exclude = Config.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
|
540
|
+
exclude = Config.current.options[:exclude_untyped] && untyped ? "#" : " " # XXX
|
|
362
541
|
lines << (indent + "#{ exclude } def #{ method_name }: #{ sigs }")
|
|
363
542
|
when :alias
|
|
364
543
|
orig_name = arg
|
data/lib/typeprof/import.rb
CHANGED
|
@@ -4,31 +4,49 @@ module TypeProf
|
|
|
4
4
|
class RBSReader
|
|
5
5
|
def initialize
|
|
6
6
|
@repo = RBS::Repository.new
|
|
7
|
-
Config.
|
|
8
|
-
|
|
7
|
+
collection_path = Config.current.collection_path
|
|
8
|
+
if collection_path&.exist?
|
|
9
|
+
collection_lock = RBS::Collection::Config.lockfile_of(collection_path)
|
|
10
|
+
@repo.add(collection_lock.repo_path)
|
|
9
11
|
end
|
|
10
|
-
@env, @builtin_env_json = RBSReader.get_builtin_env
|
|
12
|
+
@env, @loaded_gems, @builtin_env_json = RBSReader.get_builtin_env
|
|
11
13
|
end
|
|
12
14
|
|
|
13
15
|
@builtin_env = @builtin_env_json = nil
|
|
14
16
|
def self.get_builtin_env
|
|
17
|
+
@loaded_gems = []
|
|
15
18
|
unless @builtin_env
|
|
16
19
|
@builtin_env = RBS::Environment.new
|
|
17
20
|
|
|
18
|
-
loader = RBS::EnvironmentLoader.new
|
|
21
|
+
loader = RBS::EnvironmentLoader.new
|
|
22
|
+
|
|
23
|
+
# TODO: invalidate this cache when rbs_collection.yml was changed
|
|
24
|
+
collection_path = Config.current.collection_path
|
|
25
|
+
if collection_path&.exist?
|
|
26
|
+
collection_lock = RBS::Collection::Config.lockfile_of(collection_path)
|
|
27
|
+
collection_lock.gems.each {|gem| @loaded_gems << gem["name"] }
|
|
28
|
+
loader.add_collection(collection_lock)
|
|
29
|
+
end
|
|
30
|
+
|
|
19
31
|
new_decls = loader.load(env: @builtin_env).map {|decl,| decl }
|
|
20
32
|
@builtin_env_json = load_rbs(@builtin_env, new_decls)
|
|
21
33
|
end
|
|
22
34
|
|
|
23
|
-
return @builtin_env.dup, @builtin_env_json
|
|
35
|
+
return @builtin_env.dup, @loaded_gems.dup, @builtin_env_json
|
|
24
36
|
end
|
|
25
37
|
|
|
26
38
|
def load_builtin
|
|
27
39
|
@builtin_env_json
|
|
28
40
|
end
|
|
29
41
|
|
|
42
|
+
class RBSCollectionDefined < StandardError; end
|
|
43
|
+
|
|
30
44
|
def load_library(lib)
|
|
31
45
|
loader = RBS::EnvironmentLoader.new(core_root: nil, repository: @repo)
|
|
46
|
+
if @loaded_gems.include?(lib)
|
|
47
|
+
raise RBSCollectionDefined
|
|
48
|
+
end
|
|
49
|
+
@loaded_gems << lib
|
|
32
50
|
loader.add(library: lib)
|
|
33
51
|
|
|
34
52
|
case lib
|
|
@@ -157,7 +175,11 @@ module TypeProf
|
|
|
157
175
|
end
|
|
158
176
|
|
|
159
177
|
method_def = conv_method_def(method_types, visibility)
|
|
160
|
-
rbs_source = [
|
|
178
|
+
rbs_source = [
|
|
179
|
+
(member.kind == :singleton ? "self." : "") + member.name.to_s,
|
|
180
|
+
member.types.map {|type| type.location.source },
|
|
181
|
+
[member.location.name, CodeRange.from_rbs(member.location)],
|
|
182
|
+
]
|
|
161
183
|
if member.instance?
|
|
162
184
|
methods[[false, name]] = method_def
|
|
163
185
|
rbs_sources[[false, name]] = rbs_source
|
|
@@ -459,11 +481,14 @@ module TypeProf
|
|
|
459
481
|
end
|
|
460
482
|
when RBS::Types::Union
|
|
461
483
|
[:union, ty.types.map {|ty2| conv_type(ty2) }.compact]
|
|
484
|
+
when RBS::Types::Intersection
|
|
485
|
+
[:intersection, ty.types.map {|ty2| conv_type(ty2) }.compact]
|
|
462
486
|
when RBS::Types::Optional
|
|
463
487
|
[:optional, conv_type(ty.type)]
|
|
464
488
|
when RBS::Types::Interface
|
|
465
489
|
# XXX: Currently, only a few builtin interfaces are supported
|
|
466
490
|
case ty.to_s
|
|
491
|
+
when "::_ToS" then [:str]
|
|
467
492
|
when "::_ToStr" then [:str]
|
|
468
493
|
when "::_ToInt" then [:int]
|
|
469
494
|
when "::_ToAry[U]" then [:array, [:Array], [], [:var, :U]]
|
|
@@ -471,6 +496,7 @@ module TypeProf
|
|
|
471
496
|
[:instance, conv_type_name(ty.name)]
|
|
472
497
|
end
|
|
473
498
|
when RBS::Types::Bases::Instance then [:any] # XXX: not implemented yet
|
|
499
|
+
when RBS::Types::Bases::Class then [:any] # XXX: not implemented yet
|
|
474
500
|
when RBS::Types::Record
|
|
475
501
|
[:hash_record, [:Hash], ty.fields.map {|key, ty| [key, conv_type(ty)] }]
|
|
476
502
|
when RBS::Types::Proc
|
|
@@ -496,7 +522,7 @@ module TypeProf
|
|
|
496
522
|
json = scratch.rbs_reader.load_library(feature)
|
|
497
523
|
rescue RBS::EnvironmentLoader::UnknownLibraryError
|
|
498
524
|
return nil
|
|
499
|
-
rescue RBS::DuplicatedDeclarationError
|
|
525
|
+
rescue RBS::DuplicatedDeclarationError, RBSReader::RBSCollectionDefined
|
|
500
526
|
return true
|
|
501
527
|
end
|
|
502
528
|
# need cache?
|
|
@@ -527,7 +553,7 @@ module TypeProf
|
|
|
527
553
|
superclass = path_to_klass(superclass) if superclass
|
|
528
554
|
base_klass = path_to_klass(classpath[0..-2])
|
|
529
555
|
|
|
530
|
-
klass = @scratch.get_constant(base_klass, name)
|
|
556
|
+
klass, = @scratch.get_constant(base_klass, name)
|
|
531
557
|
if klass.is_a?(Type::Any)
|
|
532
558
|
klass = @scratch.new_class(base_klass, name, type_params, superclass, nil)
|
|
533
559
|
|
|
@@ -729,6 +755,9 @@ module TypeProf
|
|
|
729
755
|
when :union
|
|
730
756
|
tys = ty[1]
|
|
731
757
|
Type::Union.create(Utils::Set[*tys.map {|ty2| conv_type(ty2) }], nil) # XXX: Array and Hash support
|
|
758
|
+
when :intersection
|
|
759
|
+
tys = ty[1]
|
|
760
|
+
conv_type(tys.first) # XXX: This is wrong! We need to support intersection type
|
|
732
761
|
when :var
|
|
733
762
|
Type::Var.new(ty[1])
|
|
734
763
|
when :proc
|
|
@@ -743,7 +772,7 @@ module TypeProf
|
|
|
743
772
|
def path_to_klass(path)
|
|
744
773
|
klass = Type::Builtin[:obj]
|
|
745
774
|
path.each do |name|
|
|
746
|
-
klass = @scratch.get_constant(klass, name)
|
|
775
|
+
klass, = @scratch.get_constant(klass, name)
|
|
747
776
|
if klass == Type.any
|
|
748
777
|
raise TypeProfError.new("A constant `#{ path.join("::") }' is used but not defined in RBS")
|
|
749
778
|
end
|