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,14 @@
1
+ def foo(ary1, ary2)
2
+ ary1.each do |x|
3
+ ary2[0] = x
4
+ end
5
+ ary2
6
+ end
7
+
8
+ foo([1], ["str"])
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : ([Integer], [String]) -> [Integer]
14
+ end
@@ -0,0 +1,39 @@
1
+ def log1(x)
2
+ end
3
+ def log2(x)
4
+ end
5
+
6
+ def foo
7
+ x = nil
8
+ 1.times do |_|
9
+ x = 1
10
+ log1(x)
11
+ end
12
+ x
13
+ end
14
+
15
+ def test_yield
16
+ yield
17
+ end
18
+
19
+ def bar
20
+ x = nil
21
+ test_yield do
22
+ x = 1
23
+ log2(x)
24
+ end
25
+ x
26
+ end
27
+
28
+ foo
29
+ bar
30
+
31
+ __END__
32
+ # Classes
33
+ class Object
34
+ def log1 : (Integer?) -> nil
35
+ def log2 : (Integer?) -> nil
36
+ def foo : -> Integer?
37
+ def test_yield : { () -> nil } -> nil
38
+ def bar : -> Integer?
39
+ end
@@ -0,0 +1,22 @@
1
+ def foo
2
+ 1.times do |_|
3
+ return [:foo]
4
+ end
5
+ end
6
+
7
+ def bar
8
+ a = [:bar]
9
+ 1.times do |_|
10
+ return a
11
+ end
12
+ end
13
+
14
+ foo
15
+ bar
16
+
17
+ __END__
18
+ # Classes
19
+ class Object
20
+ def foo : -> [:foo]
21
+ def bar : -> [:bar]
22
+ 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,38 @@
1
+ class Common
2
+ def func(x)
3
+ yield 1
4
+ end
5
+ end
6
+
7
+ class Foo
8
+ def foo
9
+ Common.new.func("str") do |x|
10
+ 1
11
+ end
12
+ end
13
+ end
14
+
15
+ class Bar
16
+ def bar
17
+ Common.new.func(:sym) do |x|
18
+ :sym2
19
+ end
20
+ end
21
+ end
22
+
23
+ Foo.new.foo
24
+ Bar.new.bar
25
+
26
+ __END__
27
+ # Classes
28
+ class Common
29
+ def func : (:sym | String) { (Integer) -> (:sym2 | Integer) } -> (:sym2 | Integer)
30
+ end
31
+
32
+ class Foo
33
+ def foo : -> (:sym2 | Integer)
34
+ end
35
+
36
+ class Bar
37
+ def bar : -> (:sym2 | Integer)
38
+ 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,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,20 @@
1
+ def foo
2
+ yield
3
+ end
4
+
5
+ any = undefined_method
6
+ foo(&any)
7
+
8
+ foo(&1)
9
+
10
+ __END__
11
+ # Errors
12
+ smoke/block7.rb:5: [error] undefined method: Object#undefined_method
13
+ smoke/block7.rb:8: [error] wrong argument type Integer<1> (expected Proc)
14
+ smoke/block7.rb:2: [warning] non-iseq-proc is passed as a block
15
+ smoke/block7.rb:2: [warning] non-iseq-proc is passed as a block
16
+
17
+ # Classes
18
+ class Object
19
+ def foo : -> untyped
20
+ end
@@ -0,0 +1,27 @@
1
+ def bar
2
+ baz do
3
+ yield
4
+ end
5
+ end
6
+
7
+ def baz
8
+ yield
9
+ end
10
+
11
+ def foo
12
+ a = 42
13
+ bar do
14
+ a = "str"
15
+ end
16
+ a
17
+ end
18
+
19
+ foo
20
+
21
+ __END__
22
+ # Classes
23
+ class Object
24
+ def bar : -> String
25
+ def baz : { () -> String } -> String
26
+ def foo : -> (Integer | String)
27
+ end
@@ -0,0 +1,12 @@
1
+ def foo(&b)
2
+ b = 1
3
+ b
4
+ end
5
+
6
+ foo { }
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> Integer
12
+ end
@@ -0,0 +1,12 @@
1
+ def foo(&blk)
2
+ [blk]
3
+ end
4
+
5
+ foo { }
6
+ foo { }
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> ([Proc[] | Proc[]])
12
+ end
@@ -0,0 +1,18 @@
1
+ def foo
2
+ yield 42
3
+ end
4
+
5
+ def bar
6
+ foo do |n|
7
+ break n.to_s
8
+ end
9
+ end
10
+
11
+ bar
12
+
13
+ __END__
14
+ # Classes
15
+ class Object
16
+ def foo : { (Integer) -> bot } -> bot
17
+ def bar : -> String
18
+ end
@@ -0,0 +1,15 @@
1
+ def foo
2
+ 1.times do |n|
3
+ raise
4
+ rescue
5
+ break "str"
6
+ end
7
+ end
8
+
9
+ foo
10
+
11
+ __END__
12
+ # Classes
13
+ class Object
14
+ def foo : -> (Integer | String)
15
+ end
@@ -0,0 +1,16 @@
1
+ def foo
2
+ case "foo"
3
+ when "foo"
4
+ 1
5
+ when "bar", "baz"
6
+ :sym
7
+ end
8
+ end
9
+
10
+ foo
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def foo : -> ((:sym | Integer)?)
16
+ end
@@ -0,0 +1,17 @@
1
+ def foo
2
+ ary = ["bar", "baz"]
3
+ case "foo"
4
+ when "foo"
5
+ 1
6
+ when *ary
7
+ :sym
8
+ end
9
+ end
10
+
11
+ foo
12
+
13
+ __END__
14
+ # Classes
15
+ class Object
16
+ def foo : -> ((:sym | Integer)?)
17
+ end
@@ -0,0 +1,5 @@
1
+ class Foo
2
+ x = 1
3
+ end
4
+ __END__
5
+ # Classes
@@ -0,0 +1,9 @@
1
+ class Foo
2
+ @foo = 1
3
+ end
4
+
5
+ __END__
6
+ # Classes
7
+ class Foo
8
+ self.@foo : Integer
9
+ end
@@ -0,0 +1,25 @@
1
+ class Test
2
+ def self.foo(x)
3
+ x
4
+ end
5
+
6
+ def Test.bar(x)
7
+ x
8
+ end
9
+
10
+ #class << self
11
+ # alias baz bar
12
+ #end
13
+ end
14
+
15
+ Test.foo(1)
16
+ Test.bar("str")
17
+ #Test.baz(:sym)
18
+ # Test#foo: (Integer) -> Integer
19
+
20
+ __END__
21
+ # Classes
22
+ class Test
23
+ def self.foo : (Integer) -> Integer
24
+ def self.bar : (String) -> String
25
+ end
@@ -0,0 +1,21 @@
1
+ class Test
2
+ class << self
3
+ def foo(x)
4
+ x
5
+ end
6
+
7
+ alias bar foo
8
+ end
9
+ end
10
+
11
+ Test.foo(1)
12
+ Test.bar("str")
13
+ #Test.baz(:sym)
14
+ # Test#foo: (Integer) -> Integer
15
+
16
+ __END__
17
+ # Classes
18
+ class Test
19
+ def self.foo : (Integer) -> Integer
20
+ def self.bar : (String) -> String
21
+ end
@@ -0,0 +1,27 @@
1
+ class ForWin
2
+ end
3
+ class ForLinux
4
+ end
5
+
6
+ v = RUBY_PLATFORM =~ /windows/ ? ForWin : ForLinux
7
+
8
+ def v.foo
9
+ end
10
+
11
+ if RUBY_PLATFORM =~ /windows/
12
+ v = ForWin
13
+ else
14
+ v = ForLinux
15
+ end
16
+
17
+ v.foo
18
+
19
+ __END__
20
+ # Classes
21
+ class ForWin
22
+ def self.foo : -> nil
23
+ end
24
+
25
+ class ForLinux
26
+ def self.foo : -> nil
27
+ end
@@ -0,0 +1,38 @@
1
+ CONST = 1
2
+
3
+ class Foo
4
+ CONST = "str"
5
+ class Bar
6
+ def get1
7
+ CONST
8
+ end
9
+
10
+ def get2
11
+ ::CONST
12
+ end
13
+
14
+ def get3
15
+ Object::CONST
16
+ end
17
+ end
18
+ end
19
+
20
+ class Foo::Bar
21
+ def get4
22
+ CONST
23
+ end
24
+ end
25
+
26
+ Foo::Bar.new.get1 # String
27
+ Foo::Bar.new.get2 # Integer
28
+ Foo::Bar.new.get3 # Integer
29
+ Foo::Bar.new.get4 # Integer
30
+
31
+ __END__
32
+ # Classes
33
+ class Foo::Bar
34
+ def get1 : -> String
35
+ def get2 : -> Integer
36
+ def get3 : -> Integer
37
+ def get4 : -> Integer
38
+ end