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,26 @@
1
+ class A
2
+ def initialize(x)
3
+ @int = 1
4
+ @str = "str"
5
+ @val = x
6
+ end
7
+ end
8
+
9
+ def log(x)
10
+ end
11
+ log A.new(1)
12
+ A.new("str")
13
+ A.new(nil)
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def log : (A) -> nil
19
+ end
20
+
21
+ class A
22
+ @int : Integer
23
+ @str : String
24
+ @val : (Integer | String)?
25
+ def initialize : ((Integer | String)?) -> ((Integer | String)?)
26
+ end
@@ -0,0 +1,18 @@
1
+ class C
2
+ def self.foo(&blk)
3
+ new.instance_eval(&blk)
4
+ end
5
+ def log(n)
6
+ end
7
+ end
8
+
9
+ C.foo do
10
+ log(42)
11
+ end
12
+
13
+ __END__
14
+ # Classes
15
+ class C
16
+ def self.foo : -> C
17
+ def log : (Integer) -> nil
18
+ end
@@ -0,0 +1,14 @@
1
+ def foo(n)
2
+ z = "str"
3
+ n.times {|i| z = i }
4
+ # TODO: n.times { z = 42 }
5
+ z
6
+ end
7
+
8
+ foo(42)
9
+
10
+ __END__
11
+ # Classes
12
+ class Object
13
+ def foo : (Integer) -> (Integer | String)
14
+ end
@@ -0,0 +1,10 @@
1
+ def foo(x); end
2
+
3
+ foo(Integer(1))
4
+ foo(Integer("str"))
5
+
6
+ __END__
7
+ # Classes
8
+ class Object
9
+ def foo : (Integer) -> nil
10
+ end
@@ -0,0 +1,29 @@
1
+ class Foo
2
+ def foo=(x)
3
+ @foo = x
4
+ end
5
+
6
+ def foo
7
+ @foo
8
+ end
9
+ end
10
+
11
+ def log(x)
12
+ end
13
+
14
+ Foo.new.foo = 1
15
+ log(Foo.new.foo)
16
+ Foo.new.foo = "str"
17
+ log(Foo.new.foo)
18
+
19
+ __END__
20
+ # Classes
21
+ class Object
22
+ def log : (Integer | String) -> nil
23
+ end
24
+
25
+ class Foo
26
+ @foo : Integer | String
27
+ def foo= : (Integer | String) -> (Integer | String)
28
+ def foo : -> (Integer | String)
29
+ end
@@ -0,0 +1,30 @@
1
+ class Foo
2
+ def initialize
3
+ @array = []
4
+ @hash = {}
5
+ end
6
+
7
+ def set
8
+ @array << 1
9
+ @array << "str"
10
+ @array << :sym
11
+ @hash[:a] = 1
12
+ @hash[:b] = "str"
13
+ @hash[:c] = :sym
14
+ end
15
+
16
+ attr_reader :array, :hash
17
+ end
18
+
19
+ Foo.new.array
20
+ Foo.new.hash
21
+ Foo.new.set
22
+
23
+ __END__
24
+ # Classes
25
+ class Foo
26
+ attr_reader array : Array[:sym | Integer | String]
27
+ attr_reader hash : {:a=>Integer, :b=>String, :c=>:sym}
28
+ def initialize : -> {}
29
+ def set : -> :sym
30
+ end
@@ -0,0 +1,12 @@
1
+ def foo(n)
2
+ n.class
3
+ end
4
+
5
+ foo(1)
6
+ foo("")
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : (Integer | String) -> (Integer.class | String.class)
12
+ end
@@ -0,0 +1,11 @@
1
+ def foo(n:, s:)
2
+ [n, s]
3
+ end
4
+
5
+ foo(n: 42, s: "str")
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : (n: Integer, s: String) -> [Integer, String]
11
+ end
@@ -0,0 +1,11 @@
1
+ def foo(n: 42, s: 42)
2
+ [n, s]
3
+ end
4
+
5
+ foo(n: 42, s: "str")
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : (?n: Integer, ?s: Integer | String) -> ([Integer, Integer | String])
11
+ end
@@ -0,0 +1,12 @@
1
+ # TODO: foo should accept "s: String | [Integer]"?
2
+ def foo(n: 42, s: [n])
3
+ [n, s]
4
+ end
5
+
6
+ foo(n: 42, s: "str")
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : (?n: Integer, ?s: String) -> ([Integer, String | [Integer]])
12
+ end
@@ -0,0 +1,11 @@
1
+ def foo(**kw)
2
+ kw
3
+ end
4
+
5
+ foo(n: 42, s: "str")
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : (**{:n=>Integer, :s=>String}) -> nil
11
+ end
@@ -0,0 +1,15 @@
1
+ def foo(req:)
2
+ req
3
+ end
4
+
5
+ foo()
6
+ foo(req: 1)
7
+
8
+ __END__
9
+ # Errors
10
+ smoke/keyword5.rb:5: [error] no argument for required keywords
11
+
12
+ # Classes
13
+ class Object
14
+ def foo : (req: Integer) -> Integer
15
+ end
@@ -0,0 +1,42 @@
1
+ def foo(k:)
2
+ end
3
+
4
+ h = { k: 42 }
5
+ foo(**h)
6
+
7
+ def bar(int:, str:)
8
+ end
9
+
10
+ if rand < 0.5
11
+ h = { int: 42 }
12
+ else
13
+ h = { str: "str" }
14
+ end
15
+ bar(**h)
16
+
17
+ def baz(**kw)
18
+ end
19
+
20
+ if rand < 0.5
21
+ h = { int: 42 }
22
+ else
23
+ h = { str: "str" }
24
+ end
25
+ baz(**h)
26
+
27
+ def qux(**kw)
28
+ end
29
+
30
+ qux(**any)
31
+
32
+ __END__
33
+ # Errors
34
+ smoke/kwsplat1.rb:30: [error] undefined method: Object#any
35
+
36
+ # Classes
37
+ class Object
38
+ def foo : (k: Integer) -> nil
39
+ def bar : (int: Integer, str: String) -> nil
40
+ def baz : (**{:int=>Integer, :str=>String}) -> nil
41
+ def qux : (**{untyped=>untyped}) -> nil
42
+ end
@@ -0,0 +1,12 @@
1
+ def foo(*r, k:)
2
+ end
3
+
4
+ a = [1, 2, 3]
5
+ h = { k: 42 }
6
+ foo(*a, **h)
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : (*Integer | {:k=>Integer}, k: Integer) -> nil
12
+ end
@@ -0,0 +1,27 @@
1
+ def foo(n)
2
+ case n
3
+ when Integer
4
+ n + 1
5
+ when String
6
+ n + "STR"
7
+ else
8
+ raise
9
+ end
10
+ end
11
+
12
+ def ret_int
13
+ foo(42)
14
+ end
15
+
16
+ def ret_str
17
+ foo("str")
18
+ end
19
+
20
+ __END__
21
+ # Classes
22
+ class Object
23
+ # def foo : (Integer) -> Integer
24
+ # | (String) -> String
25
+ def ret_int : -> Integer
26
+ def ret_str : -> String
27
+ end
@@ -0,0 +1,3 @@
1
+ class Object
2
+ def foo: (Integer) -> Integer | (String) -> String
3
+ end
@@ -0,0 +1,20 @@
1
+ class A
2
+ class B
3
+ def foo
4
+ unknown
5
+ end
6
+ end
7
+ end
8
+
9
+ def bar
10
+ A::B.new.foo + 1
11
+ end
12
+
13
+ __END__
14
+ # Errors
15
+ smoke/manual-rbs2.rb:4: [error] undefined method: A::B.class#unknown
16
+
17
+ # Classes
18
+ class Object
19
+ def bar : -> untyped
20
+ end
@@ -0,0 +1,8 @@
1
+ class A
2
+ end
3
+
4
+ type A::int_or_float = Integer | Float
5
+
6
+ class A::B
7
+ def foo: -> int_or_float
8
+ end
@@ -0,0 +1,13 @@
1
+ def foo
2
+ ary = [1, "str", :sym, nil]
3
+ a, *rest, z = *ary
4
+ [a, rest, z]
5
+ end
6
+
7
+ foo
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : -> [Integer, [String, :sym], nil]
13
+ end
@@ -0,0 +1,17 @@
1
+ def ary
2
+ [1, "str", :sym, 1.0]
3
+ end
4
+
5
+ def foo
6
+ a, *rest, z = *ary
7
+ [a, rest, z]
8
+ end
9
+
10
+ foo
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def ary : -> [Integer, String, :sym, Float]
16
+ def foo : -> [Integer, [String, :sym], Float]
17
+ end
@@ -0,0 +1,12 @@
1
+ def foo
2
+ a, b, c = 42
3
+ [a, b, c]
4
+ end
5
+
6
+ foo
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> [Integer, nil, nil]
12
+ end
@@ -0,0 +1,22 @@
1
+ if 1+1
2
+ def foo
3
+ end
4
+ def bar
5
+ foo
6
+ 42
7
+ end
8
+ else
9
+ def bar
10
+ "str"
11
+ end
12
+ end
13
+
14
+ bar
15
+
16
+ __END__
17
+ # Classes
18
+ class Object
19
+ def foo : -> nil
20
+ def bar : -> Integer
21
+ | -> String
22
+ end
@@ -0,0 +1,29 @@
1
+ module M
2
+ def foo
3
+ :foo
4
+ end
5
+ end
6
+
7
+ class C
8
+ include M
9
+ end
10
+
11
+ module M
12
+ def bar
13
+ :bar
14
+ end
15
+ end
16
+
17
+ C.new.foo
18
+ C.new.bar
19
+
20
+ __END__
21
+ # Classes
22
+ module M
23
+ def foo : -> :foo
24
+ def bar : -> :bar
25
+ end
26
+
27
+ class C
28
+ include M
29
+ end
@@ -0,0 +1,28 @@
1
+ module M1
2
+ def foo
3
+ :foo
4
+ end
5
+ end
6
+
7
+ module M2
8
+ include M1
9
+ end
10
+
11
+ class C
12
+ include M2
13
+ end
14
+
15
+ C.new.foo
16
+ __END__
17
+ # Classes
18
+ module M1
19
+ def foo : -> :foo
20
+ end
21
+
22
+ module M2
23
+ include M1
24
+ end
25
+
26
+ class C
27
+ include M2
28
+ end