typeprof 0.1.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.
Files changed (218) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/main.yml +26 -0
  3. data/.gitignore +7 -0
  4. data/.gitmodules +6 -0
  5. data/Gemfile +12 -0
  6. data/Gemfile.lock +41 -0
  7. data/README.md +53 -0
  8. data/Rakefile +10 -0
  9. data/doc/doc.ja.md +415 -0
  10. data/doc/doc.md +429 -0
  11. data/doc/ppl2019.pdf +0 -0
  12. data/exe/typeprof +5 -0
  13. data/lib/typeprof.rb +13 -0
  14. data/lib/typeprof/analyzer.rb +1911 -0
  15. data/lib/typeprof/builtin.rb +554 -0
  16. data/lib/typeprof/cli.rb +110 -0
  17. data/lib/typeprof/container-type.rb +626 -0
  18. data/lib/typeprof/export.rb +203 -0
  19. data/lib/typeprof/import.rb +546 -0
  20. data/lib/typeprof/insns-def.rb +61 -0
  21. data/lib/typeprof/iseq.rb +387 -0
  22. data/lib/typeprof/method.rb +267 -0
  23. data/lib/typeprof/type.rb +1092 -0
  24. data/lib/typeprof/utils.rb +209 -0
  25. data/run.sh +3 -0
  26. data/smoke/alias.rb +30 -0
  27. data/smoke/alias2.rb +19 -0
  28. data/smoke/any-cbase.rb +5 -0
  29. data/smoke/any1.rb +15 -0
  30. data/smoke/any2.rb +17 -0
  31. data/smoke/arguments.rb +16 -0
  32. data/smoke/array-each.rb +14 -0
  33. data/smoke/array-each2.rb +15 -0
  34. data/smoke/array-each3.rb +15 -0
  35. data/smoke/array-ltlt.rb +13 -0
  36. data/smoke/array-ltlt2.rb +16 -0
  37. data/smoke/array-map.rb +11 -0
  38. data/smoke/array-map2.rb +10 -0
  39. data/smoke/array-map3.rb +22 -0
  40. data/smoke/array-mul.rb +17 -0
  41. data/smoke/array-plus1.rb +10 -0
  42. data/smoke/array-plus2.rb +15 -0
  43. data/smoke/array-pop.rb +11 -0
  44. data/smoke/array-replace.rb +12 -0
  45. data/smoke/array-s-aref.rb +11 -0
  46. data/smoke/array1.rb +26 -0
  47. data/smoke/array10.rb +14 -0
  48. data/smoke/array11.rb +13 -0
  49. data/smoke/array12.rb +24 -0
  50. data/smoke/array13.rb +30 -0
  51. data/smoke/array14.rb +13 -0
  52. data/smoke/array2.rb +27 -0
  53. data/smoke/array3.rb +25 -0
  54. data/smoke/array4.rb +14 -0
  55. data/smoke/array5.rb +13 -0
  56. data/smoke/array6.rb +14 -0
  57. data/smoke/array7.rb +13 -0
  58. data/smoke/array8.rb +13 -0
  59. data/smoke/array9.rb +12 -0
  60. data/smoke/attr.rb +28 -0
  61. data/smoke/backtrace.rb +32 -0
  62. data/smoke/block1.rb +22 -0
  63. data/smoke/block10.rb +14 -0
  64. data/smoke/block11.rb +39 -0
  65. data/smoke/block12.rb +22 -0
  66. data/smoke/block2.rb +14 -0
  67. data/smoke/block3.rb +38 -0
  68. data/smoke/block4.rb +18 -0
  69. data/smoke/block5.rb +18 -0
  70. data/smoke/block6.rb +20 -0
  71. data/smoke/block7.rb +20 -0
  72. data/smoke/block8.rb +27 -0
  73. data/smoke/block9.rb +12 -0
  74. data/smoke/blown.rb +12 -0
  75. data/smoke/break1.rb +18 -0
  76. data/smoke/break2.rb +15 -0
  77. data/smoke/case.rb +16 -0
  78. data/smoke/case2.rb +17 -0
  79. data/smoke/class.rb +5 -0
  80. data/smoke/class_instance_var.rb +9 -0
  81. data/smoke/class_method.rb +25 -0
  82. data/smoke/class_method2.rb +21 -0
  83. data/smoke/class_method3.rb +27 -0
  84. data/smoke/constant1.rb +38 -0
  85. data/smoke/constant2.rb +33 -0
  86. data/smoke/constant3.rb +9 -0
  87. data/smoke/constant4.rb +11 -0
  88. data/smoke/context-sensitive1.rb +12 -0
  89. data/smoke/cvar.rb +28 -0
  90. data/smoke/cvar2.rb +17 -0
  91. data/smoke/demo.rb +80 -0
  92. data/smoke/demo1.rb +16 -0
  93. data/smoke/demo10.rb +20 -0
  94. data/smoke/demo11.rb +11 -0
  95. data/smoke/demo2.rb +14 -0
  96. data/smoke/demo3.rb +16 -0
  97. data/smoke/demo4.rb +27 -0
  98. data/smoke/demo5.rb +13 -0
  99. data/smoke/demo6.rb +21 -0
  100. data/smoke/demo7.rb +14 -0
  101. data/smoke/demo8.rb +18 -0
  102. data/smoke/demo9.rb +18 -0
  103. data/smoke/dummy-execution1.rb +14 -0
  104. data/smoke/dummy-execution2.rb +16 -0
  105. data/smoke/ensure1.rb +20 -0
  106. data/smoke/enumerator.rb +15 -0
  107. data/smoke/expandarray1.rb +22 -0
  108. data/smoke/expandarray2.rb +23 -0
  109. data/smoke/fib.rb +28 -0
  110. data/smoke/flow1.rb +16 -0
  111. data/smoke/flow2.rb +14 -0
  112. data/smoke/flow3.rb +14 -0
  113. data/smoke/flow4.rb +5 -0
  114. data/smoke/flow5.rb +19 -0
  115. data/smoke/flow6.rb +19 -0
  116. data/smoke/flow7.rb +26 -0
  117. data/smoke/for.rb +9 -0
  118. data/smoke/freeze.rb +11 -0
  119. data/smoke/function.rb +16 -0
  120. data/smoke/gvar.rb +13 -0
  121. data/smoke/hash-fetch.rb +27 -0
  122. data/smoke/hash1.rb +18 -0
  123. data/smoke/hash2.rb +12 -0
  124. data/smoke/hash3.rb +13 -0
  125. data/smoke/hash4.rb +10 -0
  126. data/smoke/hash5.rb +14 -0
  127. data/smoke/inheritance.rb +34 -0
  128. data/smoke/inheritance2.rb +29 -0
  129. data/smoke/initialize.rb +26 -0
  130. data/smoke/instance_eval.rb +18 -0
  131. data/smoke/int_times.rb +14 -0
  132. data/smoke/integer.rb +10 -0
  133. data/smoke/ivar.rb +29 -0
  134. data/smoke/ivar2.rb +30 -0
  135. data/smoke/kernel-class.rb +12 -0
  136. data/smoke/keyword1.rb +11 -0
  137. data/smoke/keyword2.rb +11 -0
  138. data/smoke/keyword3.rb +12 -0
  139. data/smoke/keyword4.rb +11 -0
  140. data/smoke/keyword5.rb +15 -0
  141. data/smoke/kwsplat1.rb +42 -0
  142. data/smoke/kwsplat2.rb +12 -0
  143. data/smoke/manual-rbs.rb +27 -0
  144. data/smoke/manual-rbs.rbs +3 -0
  145. data/smoke/manual-rbs2.rb +20 -0
  146. data/smoke/manual-rbs2.rbs +8 -0
  147. data/smoke/masgn1.rb +13 -0
  148. data/smoke/masgn2.rb +17 -0
  149. data/smoke/masgn3.rb +12 -0
  150. data/smoke/method_in_branch.rb +22 -0
  151. data/smoke/module1.rb +29 -0
  152. data/smoke/module2.rb +28 -0
  153. data/smoke/module3.rb +33 -0
  154. data/smoke/module4.rb +29 -0
  155. data/smoke/module_function1.rb +28 -0
  156. data/smoke/module_function2.rb +28 -0
  157. data/smoke/multiple-include.rb +14 -0
  158. data/smoke/multiple-superclass.rb +16 -0
  159. data/smoke/next1.rb +20 -0
  160. data/smoke/next2.rb +16 -0
  161. data/smoke/object-send1.rb +22 -0
  162. data/smoke/once.rb +12 -0
  163. data/smoke/optional1.rb +13 -0
  164. data/smoke/optional2.rb +15 -0
  165. data/smoke/parameterizedd-self.rb +18 -0
  166. data/smoke/pathname1.rb +13 -0
  167. data/smoke/pathname2.rb +13 -0
  168. data/smoke/printf.rb +20 -0
  169. data/smoke/proc.rb +19 -0
  170. data/smoke/proc2.rb +16 -0
  171. data/smoke/proc3.rb +14 -0
  172. data/smoke/proc4.rb +11 -0
  173. data/smoke/range.rb +13 -0
  174. data/smoke/redo1.rb +21 -0
  175. data/smoke/redo2.rb +22 -0
  176. data/smoke/req-keyword.rb +12 -0
  177. data/smoke/rescue1.rb +20 -0
  178. data/smoke/rescue2.rb +22 -0
  179. data/smoke/respond_to.rb +22 -0
  180. data/smoke/rest-farg.rb +10 -0
  181. data/smoke/rest1.rb +25 -0
  182. data/smoke/rest2.rb +30 -0
  183. data/smoke/rest3.rb +36 -0
  184. data/smoke/rest4.rb +18 -0
  185. data/smoke/rest5.rb +10 -0
  186. data/smoke/rest6.rb +11 -0
  187. data/smoke/retry1.rb +20 -0
  188. data/smoke/return.rb +13 -0
  189. data/smoke/reveal.rb +13 -0
  190. data/smoke/singleton_class.rb +8 -0
  191. data/smoke/singleton_method.rb +9 -0
  192. data/smoke/step.rb +17 -0
  193. data/smoke/string-split.rb +11 -0
  194. data/smoke/struct.rb +9 -0
  195. data/smoke/struct2.rb +24 -0
  196. data/smoke/super1.rb +50 -0
  197. data/smoke/super2.rb +16 -0
  198. data/smoke/super3.rb +19 -0
  199. data/smoke/svar1.rb +12 -0
  200. data/smoke/tap1.rb +17 -0
  201. data/smoke/toplevel.rb +12 -0
  202. data/smoke/two-map.rb +17 -0
  203. data/smoke/type_var.rb +10 -0
  204. data/smoke/typed_method.rb +15 -0
  205. data/smoke/union-recv.rb +29 -0
  206. data/smoke/variadic1.rb.notyet +5 -0
  207. data/smoke/wrong-extend.rb +25 -0
  208. data/smoke/wrong-include.rb +26 -0
  209. data/smoke/wrong-rbs.rb +15 -0
  210. data/smoke/wrong-rbs.rbs +7 -0
  211. data/testbed/ao.rb +297 -0
  212. data/testbed/diff-lcs-entrypoint.rb +4 -0
  213. data/testbed/goodcheck-Gemfile.lock +51 -0
  214. data/tools/coverage.rb +14 -0
  215. data/tools/setup-insns-def.rb +30 -0
  216. data/tools/stackprof-wrapper.rb +10 -0
  217. data/typeprof.gemspec +24 -0
  218. metadata +262 -0
@@ -0,0 +1,15 @@
1
+ def hoge
2
+ [1, 2, 3].map
3
+ end
4
+ def fuga
5
+ 1.then
6
+ end
7
+ hoge
8
+ fuga
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def hoge : -> Enumerator[Integer]
14
+ def fuga : -> Enumerator[Integer]
15
+ end
@@ -0,0 +1,22 @@
1
+ def foo
2
+ if rand < 0.5
3
+ unknown
4
+ else
5
+ [:a, [:b, :c]]
6
+ end
7
+ end
8
+
9
+ a, (b, c) = foo
10
+
11
+ p(a)
12
+ __END__
13
+ # Errors
14
+ smoke/expandarray1.rb:3: [error] undefined method: Object#unknown
15
+
16
+ # Revealed types
17
+ # smoke/expandarray1.rb:11 #=> :a | untyped
18
+
19
+ # Classes
20
+ class Object
21
+ def foo : -> ([:a, [:b, :c]] | untyped)
22
+ end
@@ -0,0 +1,23 @@
1
+ def foo
2
+ if rand < 0.5
3
+ unknown
4
+ else
5
+ [:a, [:b, :c]]
6
+ end
7
+ end
8
+
9
+ a, *bc = foo
10
+
11
+ p(a)
12
+
13
+ __END__
14
+ # Errors
15
+ smoke/expandarray2.rb:3: [error] undefined method: Object#unknown
16
+
17
+ # Revealed types
18
+ # smoke/expandarray2.rb:11 #=> :a | untyped
19
+
20
+ # Classes
21
+ class Object
22
+ def foo : -> ([:a, [:b, :c]] | untyped)
23
+ end
@@ -0,0 +1,28 @@
1
+ class Fib
2
+ def fib_loop(x)
3
+ a, b = 0, 1
4
+ while x > 0
5
+ a, b = b, a+b
6
+ x -= 1
7
+ end
8
+ a
9
+ end
10
+
11
+ def fib_rec(x)
12
+ if x <= 1
13
+ x
14
+ else
15
+ fib_rec(x-1) + fib_rec(x-2)
16
+ end
17
+ end
18
+ end
19
+
20
+ Fib.new.fib_loop(42)
21
+ Fib.new.fib_rec(42)
22
+
23
+ __END__
24
+ # Classes
25
+ class Fib
26
+ def fib_loop : (Integer) -> Integer
27
+ def fib_rec : (Integer) -> Integer
28
+ end
@@ -0,0 +1,16 @@
1
+ def foo(n)
2
+ if n.is_a?(Integer)
3
+ n + 1
4
+ else
5
+ n + "STR"
6
+ end
7
+ end
8
+
9
+ foo(42)
10
+ foo("str")
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def foo : (Integer | String) -> (Integer | String)
16
+ end
@@ -0,0 +1,14 @@
1
+ def foo(x)
2
+ x.is_a?(Integer) ? x : x
3
+ 1
4
+ end
5
+ foo(unknown)
6
+
7
+ __END__
8
+ # Errors
9
+ smoke/flow2.rb:5: [error] undefined method: Object#unknown
10
+
11
+ # Classes
12
+ class Object
13
+ def foo : (untyped) -> Integer
14
+ end
@@ -0,0 +1,14 @@
1
+ def foo(x)
2
+ if x
3
+ x + 1
4
+ end
5
+ end
6
+
7
+ foo(1)
8
+ foo(nil)
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : (Integer?) -> Integer?
14
+ end
@@ -0,0 +1,5 @@
1
+ while begin l = r = true; l or r end
2
+ end
3
+
4
+ __END__
5
+ # Classes
@@ -0,0 +1,19 @@
1
+ def foo(x)
2
+ case x
3
+ when Integer
4
+ x
5
+ when String
6
+ x.to_i
7
+ else
8
+ raise
9
+ end
10
+ end
11
+
12
+ foo(1)
13
+ foo("1")
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def foo : (Integer | String) -> Integer
19
+ end
@@ -0,0 +1,19 @@
1
+ def foo(x)
2
+ "s" + case x
3
+ when Integer
4
+ x.to_s
5
+ when String
6
+ x
7
+ else
8
+ raise
9
+ end
10
+ end
11
+
12
+ foo(1)
13
+ foo("1")
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def foo : (Integer | String) -> String
19
+ end
@@ -0,0 +1,26 @@
1
+ def foo(n)
2
+ case n
3
+ when Integer
4
+ n + 1
5
+ when String
6
+ n + "STR"
7
+ else
8
+ n
9
+ end
10
+ end
11
+
12
+ foo(42)
13
+ foo("str")
14
+ foo(:sym)
15
+
16
+ __END__
17
+ # Errors
18
+ smoke/flow7.rb:4: [error] failed to resolve overload: String#+
19
+ smoke/flow7.rb:4: [error] undefined method: :sym#+
20
+ smoke/flow7.rb:6: [error] failed to resolve overload: Integer#+
21
+ smoke/flow7.rb:6: [error] undefined method: :sym#+
22
+
23
+ # Classes
24
+ class Object
25
+ def foo : (:sym | Integer | String) -> (:sym | Integer | String | untyped)
26
+ end
@@ -0,0 +1,9 @@
1
+ for x in [[1, 2]]
2
+ p x
3
+ end
4
+
5
+ __END__
6
+ # Revealed types
7
+ # smoke/for.rb:2 #=> [Integer, Integer]?
8
+
9
+ # Classes
@@ -0,0 +1,11 @@
1
+ def foo
2
+ [1].freeze
3
+ end
4
+
5
+ foo
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : -> [Integer]
11
+ end
@@ -0,0 +1,16 @@
1
+ def no_argument
2
+ "str"
3
+ end
4
+
5
+ def one_argument(x)
6
+ end
7
+
8
+ no_argument
9
+ one_argument(1)
10
+
11
+ __END__
12
+ # Classes
13
+ class Object
14
+ def no_argument : -> String
15
+ def one_argument : (Integer) -> nil
16
+ end
@@ -0,0 +1,13 @@
1
+ $foo = 1
2
+ $foo = "str"
3
+ def log(x); end
4
+ log($foo)
5
+
6
+ __END__
7
+ # Global variables
8
+ # $foo : Integer | String
9
+
10
+ # Classes
11
+ class Object
12
+ def log : (Integer | String) -> nil
13
+ end
@@ -0,0 +1,27 @@
1
+ h = { a: :A, b: :B }
2
+
3
+ def foo(h)
4
+ h.fetch(:a) #=> :A | :B
5
+ end
6
+ def bar(h)
7
+ h.fetch(:a, :C) #=> :A | :B | :C
8
+ end
9
+ def baz(h)
10
+ n = nil
11
+ [h.fetch(:a) do |k| #=> :A | :B | :C
12
+ n = k #=> :A | :B
13
+ :C
14
+ end, n]
15
+ end
16
+
17
+ foo(h)
18
+ bar(h)
19
+ baz(h)
20
+
21
+ __END__
22
+ # Classes
23
+ class Object
24
+ def foo : ({:a=>:A, :b=>:B}) -> (:A | :B)
25
+ def bar : ({:a=>:A, :b=>:B}) -> (:A | :B | :C)
26
+ def baz : ({:a=>:A, :b=>:B}) -> ([:A | :B | :C, (:a | :b)?])
27
+ end
@@ -0,0 +1,18 @@
1
+ def foo
2
+ { int: 1, str: "str" }
3
+ end
4
+
5
+ foo
6
+
7
+ def bar
8
+ { 1 => 1, 2 => "str", "s" => "s" }
9
+ end
10
+
11
+ bar
12
+
13
+ __END__
14
+ # Classes
15
+ class Object
16
+ def foo : -> {:int=>Integer, :str=>String}
17
+ def bar : -> ({Integer=>Integer | String, String=>String})
18
+ end
@@ -0,0 +1,12 @@
1
+ def foo
2
+ h = { int: 1, str: "str" }
3
+ h[:int]
4
+ end
5
+
6
+ foo
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> Integer
12
+ end
@@ -0,0 +1,13 @@
1
+ def foo
2
+ h = {}
3
+ h[:int] = 1
4
+ h[:str] = "str"
5
+ h
6
+ end
7
+
8
+ foo
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : -> {:int=>Integer, :str=>String}
13
+ end
@@ -0,0 +1,10 @@
1
+ def foo
2
+ Hash.new { |h, k| h[k] = [] }
3
+ end
4
+
5
+ foo
6
+ __END__
7
+ # Classes
8
+ class Object
9
+ def foo : -> Hash
10
+ end
@@ -0,0 +1,14 @@
1
+ class Foo
2
+ def foo
3
+ h = {}
4
+ key = ["str"]
5
+ h[key] = 1
6
+ h[key]
7
+ end
8
+ end
9
+ Foo.new.foo
10
+ __END__
11
+ # Classes
12
+ class Foo
13
+ def foo : -> Integer
14
+ end
@@ -0,0 +1,34 @@
1
+ class A
2
+ def foo(x)
3
+ bar(x)
4
+ end
5
+
6
+ def bar(x)
7
+ end
8
+
9
+ def self.test(x)
10
+ end
11
+ end
12
+
13
+ class B < A
14
+ def bar(x)
15
+ end
16
+ end
17
+
18
+ A.new.foo(1)
19
+ B.new.foo("str")
20
+ B.new.bar(nil)
21
+ A.test(1)
22
+ B.test("str")
23
+
24
+ __END__
25
+ # Classes
26
+ class A
27
+ def foo : (Integer | String) -> nil
28
+ def bar : (Integer | String) -> nil
29
+ def self.test : (Integer | String) -> nil
30
+ end
31
+
32
+ class B < A
33
+ def bar : ((Integer | String)?) -> nil
34
+ end
@@ -0,0 +1,29 @@
1
+ class SuperBase
2
+ def self.foo
3
+ self
4
+ end
5
+ end
6
+
7
+ class Base < SuperBase
8
+ def self.foo
9
+ super
10
+ end
11
+ end
12
+
13
+ class A < Base
14
+ foo
15
+ end
16
+
17
+ class B < Base
18
+ foo
19
+ end
20
+
21
+ __END__
22
+ # Classes
23
+ class SuperBase
24
+ def self.foo : -> (A.class | B.class)
25
+ end
26
+
27
+ class Base < SuperBase
28
+ def self.foo : -> (A.class | B.class)
29
+ end