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,17 @@
1
+ def foo(a)
2
+ a * 3
3
+ end
4
+
5
+ def bar(a)
6
+ a * "join"
7
+ end
8
+
9
+ foo([1, 2, 3])
10
+ bar([1, 2, 3])
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def foo : ([Integer, Integer, Integer]) -> Array[Integer]
16
+ def bar : ([Integer, Integer, Integer]) -> String
17
+ end
@@ -0,0 +1,10 @@
1
+ def log(x)
2
+ end
3
+
4
+ log([1] + ["str"] + [2] + [:sym])
5
+
6
+ __END__
7
+ # Classes
8
+ class Object
9
+ def log : (Array[:sym | Integer | String]) -> nil
10
+ end
@@ -0,0 +1,15 @@
1
+ class Foo
2
+ def foo
3
+ @var = [1]
4
+ @var = @var + [2]
5
+ end
6
+ end
7
+
8
+ Foo.new.foo
9
+
10
+ __END__
11
+ # Classes
12
+ class Foo
13
+ @var : Array[Integer]
14
+ def foo : -> Array[Integer]
15
+ end
@@ -0,0 +1,11 @@
1
+ def foo
2
+ [1, "str", :sym].pop()
3
+ end
4
+
5
+ foo
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : -> (:sym | Integer | String)
11
+ end
@@ -0,0 +1,12 @@
1
+ def foo(a)
2
+ a.replace(["str"])
3
+ a
4
+ end
5
+
6
+ foo([1, 2, 3])
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : ([Integer, Integer, Integer]) -> (Array[Integer | String])
12
+ end
@@ -0,0 +1,11 @@
1
+ def foo
2
+ Array[42, "str"]
3
+ end
4
+
5
+ foo
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : -> (Array[Integer | String])
11
+ end
@@ -0,0 +1,26 @@
1
+ def foo(a)
2
+ a[0]
3
+ end
4
+ def bar(n); end
5
+ def baz(n); end
6
+ def qux(n); end
7
+ def quux(n); end
8
+
9
+ a = [42, "str"]
10
+ foo(a)
11
+ bar(a[0])
12
+ n = 1
13
+ baz(a[n])
14
+ qux(a[2])
15
+ n = 0+0
16
+ quux(a[n])
17
+
18
+ __END__
19
+ # Classes
20
+ class Object
21
+ def foo : ([Integer, String]) -> Integer
22
+ def bar : (Integer) -> nil
23
+ def baz : (String) -> nil
24
+ def qux : (nil) -> nil
25
+ def quux : (Integer | String) -> nil
26
+ end
@@ -0,0 +1,14 @@
1
+ def foo(a)
2
+ 1.times do
3
+ x, y = a
4
+ return x
5
+ end
6
+ end
7
+
8
+ foo([:a, :b, :c])
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : ([:a, :b, :c]) -> :a
14
+ end
@@ -0,0 +1,13 @@
1
+ def array(obj)
2
+ Array(obj)
3
+ end
4
+
5
+ array({1=>1})
6
+ array([1]+[2])
7
+ array("foo")
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def array : (Array[Integer] | String | {Integer=>Integer}) -> (Array[Integer | String | {Integer=>Integer}])
13
+ end
@@ -0,0 +1,24 @@
1
+ def bar(x)
2
+ end
3
+
4
+ def test_yield
5
+ yield
6
+ end
7
+
8
+ def foo
9
+ a = [1]
10
+ test_yield do
11
+ bar(a)
12
+ end
13
+ a
14
+ end
15
+
16
+ foo
17
+
18
+ __END__
19
+ # Classes
20
+ class Object
21
+ def bar : ([Integer]) -> nil
22
+ def test_yield : { () -> nil } -> nil
23
+ def foo : -> [Integer]
24
+ end
@@ -0,0 +1,30 @@
1
+ def tuple_set
2
+ ary = [:a, :b, :c]
3
+ ary[-1] = :z
4
+ ary
5
+ end
6
+
7
+ def tuple_get
8
+ ary = [:a, :b, :c]
9
+ ary[-1]
10
+ end
11
+
12
+ def seq_set
13
+ ary = [:a, :b, :c] + []
14
+ ary[-1] = :z
15
+ ary
16
+ end
17
+
18
+ def seq_get
19
+ ary = [:a, :b, :c] + []
20
+ ary[-1]
21
+ end
22
+
23
+ __END__
24
+ # Classes
25
+ class Object
26
+ def tuple_set : -> [:a, :b, :z]
27
+ def tuple_get : -> :c
28
+ def seq_set : -> (Array[:a | :b | :c | :z])
29
+ def seq_get : -> (:a | :b | :c)
30
+ end
@@ -0,0 +1,13 @@
1
+ def f(a, b, c)
2
+ ary = [nil]
3
+ foo, bar, ary[0] = a, b, c
4
+ ary[0]
5
+ end
6
+
7
+ f(:a, :b, :c)
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def f : (:a, :b, :c) -> :c
13
+ end
@@ -0,0 +1,27 @@
1
+ def foo
2
+ a = [[42]]
3
+ a[0][0] = "str"
4
+ a
5
+ end
6
+
7
+ def bar(a)
8
+ a[0][0] = "str"
9
+ a
10
+ end
11
+
12
+ def log(a)
13
+ end
14
+
15
+ foo
16
+ a = [[42]]
17
+ bar(a)
18
+ # limitation: a is kept as [[Integer]]
19
+ log(a)
20
+
21
+ __END__
22
+ # Classes
23
+ class Object
24
+ def foo : -> [[String]]
25
+ def bar : ([[Integer]]) -> [[String]]
26
+ def log : ([[Integer]]) -> nil
27
+ end
@@ -0,0 +1,25 @@
1
+ class Foo
2
+ def initialize
3
+ @ary = [1, "str", :sym]
4
+ end
5
+
6
+ def foo
7
+ @ary[1]
8
+ end
9
+
10
+ def bar
11
+ @ary[1] = nil
12
+ end
13
+ end
14
+
15
+ Foo.new.foo
16
+ Foo.new.bar
17
+
18
+ __END__
19
+ # Classes
20
+ class Foo
21
+ @ary : [Integer, String?, :sym]
22
+ def initialize : -> [Integer, String, :sym]
23
+ def foo : -> String?
24
+ def bar : -> nil
25
+ end
@@ -0,0 +1,14 @@
1
+ def foo
2
+ while 1+1
3
+ a = [1]
4
+ end
5
+ a
6
+ end
7
+
8
+ foo
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : -> [Integer]?
14
+ end
@@ -0,0 +1,13 @@
1
+ def foo
2
+ a = [[nil]]
3
+ a[0] = a
4
+ a
5
+ end
6
+
7
+ foo
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : -> [untyped]
13
+ end
@@ -0,0 +1,14 @@
1
+ ARY = []
2
+
3
+ def foo(i, v)
4
+ ARY[i] = v
5
+ ARY
6
+ end
7
+
8
+ foo(1, "str")
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : (Integer, String) -> []
14
+ end
@@ -0,0 +1,13 @@
1
+ def foo
2
+ a = [1]
3
+ a[1] = "str"
4
+ a
5
+ end
6
+
7
+ foo
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : -> (Array[Integer | String])
13
+ end
@@ -0,0 +1,13 @@
1
+ class Foo
2
+ def self.foo(a)
3
+ a
4
+ end
5
+
6
+ foo([])
7
+ end
8
+
9
+ __END__
10
+ # Classes
11
+ class Foo
12
+ def self.foo : ([]) -> []
13
+ end
@@ -0,0 +1,12 @@
1
+ def foo(a)
2
+ end
3
+
4
+ foo([:a, :b, :c])
5
+ foo([:a, :b])
6
+ foo([:a])
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : (Array[:a | :b | :c]) -> nil
12
+ end
@@ -0,0 +1,28 @@
1
+ class Foo
2
+ def initialize(a)
3
+ @a = a
4
+ end
5
+ attr_reader :a
6
+
7
+ attr_writer :b
8
+ def get_b
9
+ @b
10
+ end
11
+
12
+ attr_accessor :c
13
+ end
14
+
15
+ foo = Foo.new(:aaa)
16
+ foo.b = :bbb
17
+ foo.get_b
18
+ foo.c = :ccc
19
+
20
+ __END__
21
+ # Classes
22
+ class Foo
23
+ attr_reader a : :aaa
24
+ attr_writer b : :bbb
25
+ attr_accessor c : :ccc
26
+ def initialize : (:aaa) -> :aaa
27
+ def get_b : -> :bbb
28
+ end
@@ -0,0 +1,32 @@
1
+ def foo
2
+ unknown_method
3
+ end
4
+
5
+ def bar
6
+ foo
7
+ end
8
+
9
+ def baz
10
+ bar
11
+ end
12
+
13
+ baz
14
+
15
+ # smoke/backtrace.rb:2: [error] undefined method: Object#unknown_method
16
+ # from smoke/backtrace.rb:6
17
+ # from smoke/backtrace.rb:10
18
+ # from smoke/backtrace.rb:13
19
+ # Object#baz :: () -> any
20
+ # Object#bar :: () -> any
21
+ # Object#foo :: () -> any
22
+
23
+ __END__
24
+ # Errors
25
+ smoke/backtrace.rb:2: [error] undefined method: Object#unknown_method
26
+
27
+ # Classes
28
+ class Object
29
+ def foo : -> untyped
30
+ def bar : -> untyped
31
+ def baz : -> untyped
32
+ end
@@ -0,0 +1,22 @@
1
+ def foo(x)
2
+ yield x
3
+ yield 1
4
+ end
5
+
6
+ foo("str") do |x|
7
+ x
8
+ end
9
+
10
+ foo(:sym) do |x|
11
+ if 1+1
12
+ x
13
+ else
14
+ 1
15
+ end
16
+ end
17
+
18
+ __END__
19
+ # Classes
20
+ class Object
21
+ def foo : (:sym | String) { (:sym | Integer | String) -> (:sym | Integer | String) } -> (:sym | Integer | String)
22
+ end