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,33 @@
1
+ def foo(x)
2
+ end
3
+
4
+ foo(UNDEFINED_CONSTANT)
5
+ foo(1)
6
+
7
+ C = "dummy"
8
+ class C
9
+ def foo
10
+ end
11
+ self.new.foo
12
+ end
13
+
14
+ BAR = 1
15
+ BAR = "str"
16
+ def log(x)
17
+ end
18
+ log(BAR)
19
+
20
+ __END__
21
+ # Errors
22
+ smoke/constant2.rb:8: [error] the class "C" is String
23
+ smoke/constant2.rb:15: [warning] already initialized constant Object::BAR
24
+
25
+ # Classes
26
+ class Object
27
+ def foo : (Integer | untyped) -> nil
28
+ def log : (String) -> nil
29
+ end
30
+
31
+ class C(dummy)
32
+ def foo : -> nil
33
+ end
@@ -0,0 +1,9 @@
1
+ def foo
2
+ 1::Foo
3
+ end
4
+ foo
5
+ __END__
6
+ # Classes
7
+ class Object
8
+ def foo : -> untyped
9
+ end
@@ -0,0 +1,11 @@
1
+ def foo
2
+ Complex::I
3
+ end
4
+
5
+ foo
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : -> Complex
11
+ end
@@ -0,0 +1,12 @@
1
+ def foo(x)
2
+ x
3
+ end
4
+
5
+ x = nil
6
+ foo(x || 1)
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : (Integer) -> Integer
12
+ end
@@ -0,0 +1,28 @@
1
+ def log1(x)
2
+ end
3
+
4
+ def log2(x)
5
+ end
6
+
7
+ class A
8
+ FOO=1
9
+ @@var = 1
10
+ log1(@@var)
11
+ def foo
12
+ log2(@@var)
13
+ end
14
+ end
15
+
16
+ A.new.foo
17
+
18
+ __END__
19
+ # Classes
20
+ class Object
21
+ def log1 : (Integer) -> nil
22
+ def log2 : (Integer) -> nil
23
+ end
24
+
25
+ class A
26
+ @@var : Integer
27
+ def foo : -> nil
28
+ end
@@ -0,0 +1,17 @@
1
+ class A
2
+ @@var = :a
3
+ end
4
+
5
+ class B < A
6
+ @@var = :b
7
+ end
8
+
9
+ __END__
10
+ # Classes
11
+ class A
12
+ @@var : :a
13
+ end
14
+
15
+ class B < A
16
+ @@var : :b
17
+ end
@@ -0,0 +1,80 @@
1
+ def foo(x)
2
+ if x
3
+ 42
4
+ else
5
+ "str"
6
+ end
7
+ end
8
+
9
+ foo(true)
10
+ foo(false)
11
+
12
+ # Object#foo :: (Boolean) -> (String | Integer)
13
+
14
+
15
+ # overrided method
16
+ def identity(x)
17
+ x
18
+ end
19
+
20
+ identity(42)
21
+ identity("str")
22
+ identity(:sym)
23
+
24
+ # Object#identity :: (Integer) -> Integer
25
+ # Object#identity :: (String) -> String
26
+ # Object#identity :: (Symbol) -> Symbol
27
+
28
+
29
+ # recursive method
30
+ def fib(x)
31
+ if x <= 1
32
+ x
33
+ else
34
+ fib(x - 1) + fib(x - 2)
35
+ end
36
+ end
37
+
38
+ fib(40000)
39
+
40
+ # Object#fib :: (Integer) -> Integer
41
+
42
+
43
+ # user-defined classes
44
+ class A
45
+ def foo(x)
46
+ bar(x)
47
+ end
48
+
49
+ def bar(x)
50
+ end
51
+ end
52
+
53
+ class B < A
54
+ def bar(x)
55
+ end
56
+ end
57
+ A.new.foo(1)
58
+ B.new.foo("str")
59
+
60
+ # A#foo :: (Integer) -> NilClass
61
+ # A#bar :: (Integer) -> NilClass
62
+ # B#foo :: (String) -> NilClass
63
+ # B#bar :: (String) -> NilClass
64
+
65
+ __END__
66
+ # Classes
67
+ class Object
68
+ def foo : (bool) -> (Integer | String)
69
+ def identity : (:sym | Integer | String) -> (:sym | Integer | String)
70
+ def fib : (Integer) -> Integer
71
+ end
72
+
73
+ class A
74
+ def foo : (Integer | String) -> nil
75
+ def bar : (Integer | String) -> nil
76
+ end
77
+
78
+ class B < A
79
+ def bar : (Integer | String) -> nil
80
+ end
@@ -0,0 +1,16 @@
1
+ def foo(x)
2
+ if x
3
+ 42
4
+ else
5
+ "str"
6
+ end
7
+ end
8
+
9
+ foo(true)
10
+ foo(false)
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def foo : (bool) -> (Integer | String)
16
+ end
@@ -0,0 +1,20 @@
1
+ def bar
2
+ yield
3
+ end
4
+
5
+ def foo
6
+ x = 42
7
+ bar do
8
+ x = "STR"
9
+ end
10
+ x
11
+ end
12
+
13
+ foo
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def bar : { () -> String } -> String
19
+ def foo : -> (Integer | String)
20
+ end
@@ -0,0 +1,11 @@
1
+ def swap(a)
2
+ [a[1], a[0]]
3
+ end
4
+ a = [42, "str"]
5
+ swap(a)
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def swap : ([Integer, String]) -> [String, Integer]
11
+ end
@@ -0,0 +1,14 @@
1
+ # override
2
+ def my_to_s(x)
3
+ x.to_s
4
+ end
5
+
6
+ my_to_s(42)
7
+ my_to_s("str")
8
+ my_to_s(:sym)
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def my_to_s : (:sym | Integer | String) -> String
14
+ end
@@ -0,0 +1,16 @@
1
+ # recursive method
2
+ def fib(x)
3
+ if x <= 1
4
+ x
5
+ else
6
+ fib(x - 1) + fib(x - 2)
7
+ end
8
+ end
9
+
10
+ fib(40000)
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def fib : (Integer) -> Integer
16
+ end
@@ -0,0 +1,27 @@
1
+ # user-defined classes
2
+ class A
3
+ def foo(x)
4
+ bar(x)
5
+ end
6
+
7
+ def bar(x)
8
+ end
9
+ end
10
+
11
+ class B < A
12
+ def bar(x)
13
+ end
14
+ end
15
+ A.new.foo(1)
16
+ B.new.foo("str")
17
+
18
+ __END__
19
+ # Classes
20
+ class A
21
+ def foo : (Integer | String) -> nil
22
+ def bar : (Integer | String) -> nil
23
+ end
24
+
25
+ class B < A
26
+ def bar : (Integer | String) -> nil
27
+ end
@@ -0,0 +1,13 @@
1
+ class A
2
+ def self.foo(x); "str"; end
3
+ end
4
+ class B < A
5
+ end
6
+ A.foo(1)
7
+ B.foo(Integer)
8
+
9
+ __END__
10
+ # Classes
11
+ class A
12
+ def self.foo : (Integer | Integer.class) -> String
13
+ end
@@ -0,0 +1,21 @@
1
+ class Foo
2
+ def foo=(x)
3
+ @foo = x
4
+ end
5
+
6
+ def foo
7
+ @foo
8
+ end
9
+ end
10
+
11
+ Foo.new.foo = 1
12
+ Foo.new.foo = "str"
13
+ Foo.new.foo
14
+
15
+ __END__
16
+ # Classes
17
+ class Foo
18
+ @foo : Integer | String
19
+ def foo= : (Integer | String) -> (Integer | String)
20
+ def foo : -> (Integer | String)
21
+ end
@@ -0,0 +1,14 @@
1
+ def foo(x)
2
+ yield 42
3
+ end
4
+
5
+ s = "str"
6
+ foo(1) do |x|
7
+ s
8
+ end
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : (Integer) { (Integer) -> String } -> String
14
+ end
@@ -0,0 +1,18 @@
1
+ def foo
2
+ yield "str"
3
+ end
4
+
5
+ def bar
6
+ yield :sym
7
+ end
8
+
9
+ blk = -> x { x }
10
+ foo(&blk)
11
+ bar(&blk)
12
+
13
+ __END__
14
+ # Classes
15
+ class Object
16
+ def foo : { (String) -> (:sym | String) } -> (:sym | String)
17
+ def bar : { (:sym) -> (:sym | String) } -> (:sym | String)
18
+ end
@@ -0,0 +1,18 @@
1
+ F = -> x { "str" }
2
+
3
+ def foo(&blk)
4
+ blk.call(:sym, &F)
5
+ end
6
+
7
+ foo do |dummy, &blk|
8
+ blk.call(42)
9
+ end
10
+
11
+ # truly expected:
12
+ # Object#foo :: (&Proc[(Symbol, &Proc[(Integer) -> String]) -> String]) -> String
13
+
14
+ __END__
15
+ # Classes
16
+ class Object
17
+ def foo : { (:sym) { (Integer) -> String } -> String } -> String
18
+ end
@@ -0,0 +1,14 @@
1
+ def foo(n)
2
+ n
3
+ end
4
+
5
+ def bar
6
+ foo(1)
7
+ end
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : (Integer | untyped) -> (Integer | untyped)
13
+ def bar : -> (Integer | untyped)
14
+ end
@@ -0,0 +1,16 @@
1
+ class Foo
2
+ def foo(n)
3
+ n
4
+ end
5
+
6
+ def self.bar
7
+ new.foo(1)
8
+ end
9
+ end
10
+
11
+ __END__
12
+ # Classes
13
+ class Foo
14
+ def foo : (Integer | untyped) -> (Integer | untyped)
15
+ def self.bar : -> (Integer | untyped)
16
+ end
@@ -0,0 +1,20 @@
1
+ def foo(x)
2
+ 42
3
+ end
4
+
5
+ def bar
6
+ x = 1
7
+ x = "str"
8
+ x = :sym
9
+ ensure
10
+ foo(x)
11
+ end
12
+
13
+ bar
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def foo : ((:sym | Integer | String)?) -> Integer
19
+ def bar : -> :sym
20
+ end