typeprof 0.2.0 → 0.5.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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +1 -2
  3. data/.gitignore +1 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +10 -21
  6. data/LICENSE +21 -0
  7. data/README.md +6 -0
  8. data/doc/demo.md +398 -0
  9. data/doc/doc.ja.md +6 -1
  10. data/doc/doc.md +7 -2
  11. data/exe/typeprof +2 -1
  12. data/lib/typeprof.rb +9 -0
  13. data/lib/typeprof/analyzer.rb +427 -325
  14. data/lib/typeprof/arguments.rb +405 -0
  15. data/lib/typeprof/block.rb +136 -0
  16. data/lib/typeprof/builtin.rb +36 -25
  17. data/lib/typeprof/cli.rb +51 -98
  18. data/lib/typeprof/config.rb +114 -0
  19. data/lib/typeprof/container-type.rb +280 -92
  20. data/lib/typeprof/export.rb +197 -108
  21. data/lib/typeprof/import.rb +134 -80
  22. data/lib/typeprof/iseq.rb +42 -1
  23. data/lib/typeprof/method.rb +178 -82
  24. data/lib/typeprof/type.rb +228 -369
  25. data/lib/typeprof/utils.rb +4 -18
  26. data/lib/typeprof/version.rb +3 -0
  27. data/smoke/arguments2.rb +55 -0
  28. data/smoke/array-each3.rb +1 -4
  29. data/smoke/array12.rb +1 -1
  30. data/smoke/array6.rb +1 -0
  31. data/smoke/block-ambiguous.rb +36 -0
  32. data/smoke/block-args1-rest.rb +62 -0
  33. data/smoke/block-args1.rb +59 -0
  34. data/smoke/block-args2-rest.rb +62 -0
  35. data/smoke/block-args2.rb +59 -0
  36. data/smoke/block-args3-rest.rb +73 -0
  37. data/smoke/block-args3.rb +70 -0
  38. data/smoke/block-blockarg.rb +27 -0
  39. data/smoke/block-kwarg.rb +52 -0
  40. data/smoke/block10.rb +1 -1
  41. data/smoke/block11.rb +1 -1
  42. data/smoke/block14.rb +17 -0
  43. data/smoke/block4.rb +2 -2
  44. data/smoke/block5.rb +1 -0
  45. data/smoke/block6.rb +1 -1
  46. data/smoke/block7.rb +0 -2
  47. data/smoke/block8.rb +2 -2
  48. data/smoke/block9.rb +1 -1
  49. data/smoke/blown.rb +1 -1
  50. data/smoke/class-hierarchy.rb +54 -0
  51. data/smoke/class-hierarchy2.rb +27 -0
  52. data/smoke/constant1.rb +11 -6
  53. data/smoke/constant2.rb +2 -0
  54. data/smoke/cvar.rb +1 -0
  55. data/smoke/demo10.rb +1 -1
  56. data/smoke/demo8.rb +2 -2
  57. data/smoke/demo9.rb +1 -3
  58. data/smoke/flow7.rb +1 -7
  59. data/smoke/flow8.rb +13 -0
  60. data/smoke/hash-fetch.rb +3 -3
  61. data/smoke/hash-merge-bang.rb +11 -0
  62. data/smoke/hash1.rb +1 -1
  63. data/smoke/hash3.rb +1 -1
  64. data/smoke/hash4.rb +1 -1
  65. data/smoke/instance_eval.rb +1 -1
  66. data/smoke/int_times.rb +1 -1
  67. data/smoke/ivar2.rb +1 -1
  68. data/smoke/keyword3.rb +1 -2
  69. data/smoke/keyword4.rb +1 -1
  70. data/smoke/kwsplat1.rb +1 -1
  71. data/smoke/kwsplat2.rb +1 -1
  72. data/smoke/module4.rb +2 -0
  73. data/smoke/multiple-superclass.rb +4 -0
  74. data/smoke/next2.rb +1 -1
  75. data/smoke/optional1.rb +1 -1
  76. data/smoke/optional2.rb +1 -1
  77. data/smoke/optional3.rb +10 -0
  78. data/smoke/pattern-match1.rb +23 -0
  79. data/smoke/pattern-match2.rb +15 -0
  80. data/smoke/proc4.rb +1 -1
  81. data/smoke/rbs-extend.rb +9 -0
  82. data/smoke/rbs-extend.rbs +7 -0
  83. data/smoke/rbs-interface.rb +24 -0
  84. data/smoke/rbs-interface.rbs +12 -0
  85. data/smoke/rbs-proc1.rb +9 -0
  86. data/smoke/rbs-proc1.rbs +3 -0
  87. data/smoke/rbs-proc2.rb +20 -0
  88. data/smoke/rbs-proc2.rbs +3 -0
  89. data/smoke/rbs-proc3.rb +13 -0
  90. data/smoke/rbs-proc3.rbs +4 -0
  91. data/smoke/rbs-record.rb +17 -0
  92. data/smoke/rbs-record.rbs +4 -0
  93. data/smoke/rbs-tyvar.rb +18 -0
  94. data/smoke/rbs-tyvar.rbs +5 -0
  95. data/smoke/rbs-tyvar2.rb +20 -0
  96. data/smoke/rbs-tyvar2.rbs +9 -0
  97. data/smoke/rbs-tyvar3.rb +17 -0
  98. data/smoke/rbs-tyvar3.rbs +5 -0
  99. data/smoke/rbs-tyvar4.rb +36 -0
  100. data/smoke/rbs-tyvar5.rb +12 -0
  101. data/smoke/rbs-tyvar5.rbs +8 -0
  102. data/smoke/rest1.rb +1 -1
  103. data/smoke/rest2.rb +1 -1
  104. data/smoke/rest3.rb +1 -1
  105. data/smoke/rest5.rb +1 -1
  106. data/smoke/rest6.rb +1 -1
  107. data/smoke/retry1.rb +1 -1
  108. data/smoke/return.rb +1 -1
  109. data/smoke/singleton_method.rb +3 -0
  110. data/smoke/step.rb +1 -1
  111. data/smoke/struct.rb +4 -3
  112. data/smoke/struct3.rb +14 -0
  113. data/smoke/symbol-proc.rb +24 -0
  114. data/smoke/uninitialize-var.rb +12 -0
  115. data/smoke/user-demo.rb +15 -0
  116. data/smoke/wrong-extend.rb +1 -0
  117. data/typeprof.gemspec +4 -2
  118. metadata +53 -6
  119. data/run.sh +0 -3
  120. data/smoke/variadic1.rb.notyet +0 -5
@@ -6,25 +6,11 @@ module TypeProf
6
6
  end
7
7
 
8
8
  module StructuralEquality
9
- def hash
10
- @_hash ||=
11
- begin
12
- h = 0
13
- instance_variables.each do |v|
14
- h ^= instance_variable_get(v).hash if v != :@_hash
15
- end
16
- h
17
- end
18
- end
19
-
20
- TABLE = {}
21
-
22
9
  def self.included(klass)
23
- def klass.new(*args)
24
- (TABLE[self] ||= {})[args] ||= super
25
- end
26
- class << klass
27
- ruby2_keywords :new
10
+ klass.instance_eval do
11
+ def new(*args)
12
+ (@table ||= {})[[self] + args] ||= super
13
+ end
28
14
  end
29
15
  end
30
16
  end
@@ -0,0 +1,3 @@
1
+ module TypeProf
2
+ VERSION = "0.5.0"
3
+ end
@@ -0,0 +1,55 @@
1
+ def f1
2
+ end
3
+ f1
4
+
5
+ def f2(x, y, z)
6
+ end
7
+ f2(:x, :y, :z)
8
+
9
+ def f3(x = "str", y = "str")
10
+ end
11
+ f3
12
+
13
+ def f4(*r)
14
+ end
15
+ f4(:a, :b, :c)
16
+
17
+ def f5(x, y = "str", z)
18
+ end
19
+ f5(:x, :z)
20
+
21
+ def f6(k:)
22
+ end
23
+ f6(k: :kk)
24
+
25
+ def f7(k: 42)
26
+ end
27
+ f7
28
+
29
+ def f8(k: "str")
30
+ end
31
+ f8
32
+
33
+ def f9(**kw)
34
+ end
35
+ f9(k: :kk)
36
+
37
+ def f10(&blk)
38
+ blk.call(1)
39
+ end
40
+ f10 {|n| }
41
+
42
+ __END__
43
+ # Classes
44
+ class Object
45
+ def f1 : -> nil
46
+ def f2 : (:x, :y, :z) -> nil
47
+ def f3 : (?String, ?String) -> nil
48
+ def f4 : (*:a | :b | :c) -> nil
49
+ def f5 : (:x, ?String, :z) -> nil
50
+ def f6 : (k: :kk) -> nil
51
+ def f7 : (?k: Integer) -> nil
52
+ def f8 : (?k: String) -> nil
53
+ def f9 : (**{k: :kk}) -> nil
54
+ def f10 : { (Integer) -> nil } -> nil
55
+ end
@@ -2,14 +2,11 @@ def log(x)
2
2
  end
3
3
 
4
4
  [].each do |x|
5
- # Currently, x is bot. But, [].each is rarely useful.
6
- # It would be a good guess to assume a empty receiver of Array#each means a wrong guess.
7
- # So, it would be good to assume x as any
8
5
  log(x)
9
6
  end
10
7
 
11
8
  __END__
12
9
  # Classes
13
10
  class Object
14
- def log : (bot) -> nil
11
+ def log : (untyped) -> nil
15
12
  end
@@ -19,6 +19,6 @@ __END__
19
19
  # Classes
20
20
  class Object
21
21
  def bar : ([Integer]) -> nil
22
- def test_yield : { () -> nil } -> nil
22
+ def test_yield : { -> nil } -> nil
23
23
  def foo : -> [Integer]
24
24
  end
@@ -10,5 +10,6 @@ foo(1, "str")
10
10
  __END__
11
11
  # Classes
12
12
  class Object
13
+ ARY : []
13
14
  def foo : (Integer, String) -> []
14
15
  end
@@ -0,0 +1,36 @@
1
+ def f1
2
+ yield :a, :b, :c
3
+ end
4
+ def log1(x); end
5
+ f1 {|x| log1(x) }
6
+
7
+ def f2
8
+ yield :a, :b, :c
9
+ end
10
+ def log2(x); end
11
+ f2 {|x,| log2(x) }
12
+
13
+ def f3
14
+ yield [:a, :b, :c]
15
+ end
16
+ def log3(x); end
17
+ f3 {|x| log3(x) }
18
+
19
+ def f4
20
+ yield [:a, :b, :c]
21
+ end
22
+ def log4(x); end
23
+ f4 {|x,| log4(x) }
24
+
25
+ __END__
26
+ # Classes
27
+ class Object
28
+ def f1 : { (:a, :b, :c) -> nil } -> nil
29
+ def log1 : (:a) -> nil
30
+ def f2 : { (:a, :b, :c) -> nil } -> nil
31
+ def log2 : (:a) -> nil
32
+ def f3 : { ([:a, :b, :c]) -> nil } -> nil
33
+ def log3 : ([:a, :b, :c]) -> nil
34
+ def f4 : { ([:a, :b, :c]) -> nil } -> nil
35
+ def log4 : (:a) -> nil
36
+ end
@@ -0,0 +1,62 @@
1
+ StringArray = ["str"] + ["str"]
2
+
3
+ def f1(&blk)
4
+ yield *StringArray
5
+ blk
6
+ end
7
+ def log1(a, o, c); end
8
+ f1 do |a, o=:opt, c|
9
+ log1(a, o, c)
10
+ end
11
+
12
+ def f2(&blk)
13
+ yield :a, *StringArray
14
+ blk
15
+ end
16
+ def log2(a, o, c); end
17
+ f2 do |a, o=:opt, c|
18
+ log2(a, o, c)
19
+ end
20
+
21
+ def f3(&blk)
22
+ yield :a, :b, *StringArray
23
+ blk
24
+ end
25
+ def log3(a, o, c); end
26
+ f3 do |a, o=:opt, c|
27
+ log3(a, o, c)
28
+ end
29
+
30
+ def f4(&blk)
31
+ yield :a, :b, :c, *StringArray
32
+ blk
33
+ end
34
+ def log4(a, o, c); end
35
+ f4 do |a, o=:opt, c|
36
+ log4(a, o, c)
37
+ end
38
+
39
+ def f5(&blk)
40
+ yield :a, :b, :c, :d, *StringArray
41
+ blk
42
+ end
43
+ def log5(a, o, c); end
44
+ f5 do |a, o=:opt, c|
45
+ log5(a, o, c)
46
+ end
47
+
48
+ __END__
49
+ # Classes
50
+ class Object
51
+ StringArray : Array[String]
52
+ def f1 : { (*String) -> nil } -> (^(String, ?:opt | String, String) -> nil)
53
+ def log1 : (String, :opt | String, String) -> nil
54
+ def f2 : { (:a, *String) -> nil } -> (^(:a, ?:opt | String, String) -> nil)
55
+ def log2 : (:a, :opt | String, String) -> nil
56
+ def f3 : { (:a, :b, *String) -> nil } -> (^(:a, ?:b | :opt, :b | String) -> nil)
57
+ def log3 : (:a, :b | :opt, :b | String) -> nil
58
+ def f4 : { (:a, :b, :c, *String) -> nil } -> (^(:a, ?:b | :opt, :b | :c) -> nil)
59
+ def log4 : (:a, :b | :opt, :b | :c) -> nil
60
+ def f5 : { (:a, :b, :c, :d, *String) -> nil } -> (^(:a, ?:b | :opt, :b | :c) -> nil)
61
+ def log5 : (:a, :b | :opt, :b | :c) -> nil
62
+ end
@@ -0,0 +1,59 @@
1
+ def f1(&blk)
2
+ yield
3
+ blk
4
+ end
5
+ def log1(a, o, c); end
6
+ f1 do |a, o=:opt, c|
7
+ log1(a, o, c)
8
+ end
9
+
10
+ def f2(&blk)
11
+ yield :a
12
+ blk
13
+ end
14
+ def log2(a, o, c); end
15
+ f2 do |a, o=:opt, c|
16
+ log2(a, o, c)
17
+ end
18
+
19
+ def f3(&blk)
20
+ yield :a, :b
21
+ blk
22
+ end
23
+ def log3(a, o, c); end
24
+ f3 do |a, o=:opt, c|
25
+ log3(a, o, c)
26
+ end
27
+
28
+ def f4(&blk)
29
+ yield :a, :b, :c
30
+ blk
31
+ end
32
+ def log4(a, o, c); end
33
+ f4 do |a, o=:opt, c|
34
+ log4(a, o, c)
35
+ end
36
+
37
+ def f5(&blk)
38
+ yield :a, :b, :c, :d
39
+ blk
40
+ end
41
+ def log5(a, o, c); end
42
+ f5 do |a, o=:opt, c|
43
+ log5(a, o, c)
44
+ end
45
+
46
+ __END__
47
+ # Classes
48
+ class Object
49
+ def f1 : { -> nil } -> ^(nil, ?:opt, nil) -> nil
50
+ def log1 : (nil, :opt, nil) -> nil
51
+ def f2 : { (:a) -> nil } -> ^(:a, ?:opt, nil) -> nil
52
+ def log2 : (:a, :opt, nil) -> nil
53
+ def f3 : { (:a, :b) -> nil } -> ^(:a, ?:opt, :b) -> nil
54
+ def log3 : (:a, :opt, :b) -> nil
55
+ def f4 : { (:a, :b, :c) -> nil } -> (^(:a, ?:b | :opt, :c) -> nil)
56
+ def log4 : (:a, :b | :opt, :c) -> nil
57
+ def f5 : { (:a, :b, :c, :d) -> nil } -> (^(:a, ?:b | :opt, :c) -> nil)
58
+ def log5 : (:a, :b | :opt, :c) -> nil
59
+ end
@@ -0,0 +1,62 @@
1
+ StringArray = ["str"] + ["str"]
2
+
3
+ def f1(&blk)
4
+ yield *StringArray
5
+ blk
6
+ end
7
+ def log1(a, r, c); end
8
+ f1 do |a, *r, c|
9
+ log1(a, r, c)
10
+ end
11
+
12
+ def f2(&blk)
13
+ yield :a, *StringArray
14
+ blk
15
+ end
16
+ def log2(a, r, c); end
17
+ f2 do |a, *r, c|
18
+ log2(a, r, c)
19
+ end
20
+
21
+ def f3(&blk)
22
+ yield :a, :b, *StringArray
23
+ blk
24
+ end
25
+ def log3(a, r, c); end
26
+ f3 do |a, *r, c|
27
+ log3(a, r, c)
28
+ end
29
+
30
+ def f4(&blk)
31
+ yield :a, :b, :c, *StringArray
32
+ blk
33
+ end
34
+ def log4(a, r, c); end
35
+ f4 do |a, *r, c|
36
+ log4(a, r, c)
37
+ end
38
+
39
+ def f5(&blk)
40
+ yield :a, :b, :c, :d, *StringArray
41
+ blk
42
+ end
43
+ def log5(a, r, c); end
44
+ f5 do |a, *r, c|
45
+ log5(a, r, c)
46
+ end
47
+
48
+ __END__
49
+ # Classes
50
+ class Object
51
+ StringArray : Array[String]
52
+ def f1 : { (*String) -> nil } -> ^(String, *String, String) -> nil
53
+ def log1 : (String, Array[String], String) -> nil
54
+ def f2 : { (:a, *String) -> nil } -> ^(:a, *String, String) -> nil
55
+ def log2 : (:a, Array[String], String) -> nil
56
+ def f3 : { (:a, :b, *String) -> nil } -> (^(:a, *:b | String, :b | String) -> nil)
57
+ def log3 : (:a, Array[:b | String], :b | String) -> nil
58
+ def f4 : { (:a, :b, :c, *String) -> nil } -> (^(:a, *:b | :c | String, :c | String) -> nil)
59
+ def log4 : (:a, Array[:b | :c | String], :c | String) -> nil
60
+ def f5 : { (:a, :b, :c, :d, *String) -> nil } -> (^(:a, *:b | :c | :d | String, :d | String) -> nil)
61
+ def log5 : (:a, Array[:b | :c | :d | String], :d | String) -> nil
62
+ end
@@ -0,0 +1,59 @@
1
+ def f1(&blk)
2
+ yield
3
+ blk
4
+ end
5
+ def log1(a, r, c); end
6
+ f1 do |a, *r, c|
7
+ log1(a, r, c)
8
+ end
9
+
10
+ def f2(&blk)
11
+ yield :a
12
+ blk
13
+ end
14
+ def log2(a, r, c); end
15
+ f2 do |a, *r, c|
16
+ log2(a, r, c)
17
+ end
18
+
19
+ def f3(&blk)
20
+ yield :a, :b
21
+ blk
22
+ end
23
+ def log3(a, r, c); end
24
+ f3 do |a, *r, c|
25
+ log3(a, r, c)
26
+ end
27
+
28
+ def f4(&blk)
29
+ yield :a, :b, :c
30
+ blk
31
+ end
32
+ def log4(a, r, c); end
33
+ f4 do |a, *r, c|
34
+ log4(a, r, c)
35
+ end
36
+
37
+ def f5(&blk)
38
+ yield :a, :b, :c, :d
39
+ blk
40
+ end
41
+ def log5(a, r, c); end
42
+ f5 do |a, *r, c|
43
+ log5(a, r, c)
44
+ end
45
+
46
+ __END__
47
+ # Classes
48
+ class Object
49
+ def f1 : { -> nil } -> ^(nil, *bot, nil) -> nil
50
+ def log1 : (nil, [], nil) -> nil
51
+ def f2 : { (:a) -> nil } -> ^(:a, *bot, nil) -> nil
52
+ def log2 : (:a, [], nil) -> nil
53
+ def f3 : { (:a, :b) -> nil } -> ^(:a, *bot, :b) -> nil
54
+ def log3 : (:a, [], :b) -> nil
55
+ def f4 : { (:a, :b, :c) -> nil } -> ^(:a, *:b, :c) -> nil
56
+ def log4 : (:a, [:b], :c) -> nil
57
+ def f5 : { (:a, :b, :c, :d) -> nil } -> (^(:a, *:b | :c, :d) -> nil)
58
+ def log5 : (:a, [:b, :c], :d) -> nil
59
+ end
@@ -0,0 +1,73 @@
1
+ StringArray = ["str"] + ["str"]
2
+
3
+ def f1(&blk)
4
+ yield *StringArray
5
+ blk
6
+ end
7
+ def log1(a, o, r, c); end
8
+ f1 do |a, o=:opt, *r, c|
9
+ log1(a, o, r, c)
10
+ end
11
+
12
+ def f2(&blk)
13
+ yield :a, *StringArray
14
+ blk
15
+ end
16
+ def log2(a, o, r, c); end
17
+ f2 do |a, o=:opt, *r, c|
18
+ log2(a, o, r, c)
19
+ end
20
+
21
+ def f3(&blk)
22
+ yield :a, :b, *StringArray
23
+ blk
24
+ end
25
+ def log3(a, o, r, c); end
26
+ f3 do |a, o=:opt, *r, c|
27
+ log3(a, o, r, c)
28
+ end
29
+
30
+ def f4(&blk)
31
+ yield :a, :b, :c, *StringArray
32
+ blk
33
+ end
34
+ def log4(a, o, r, c); end
35
+ f4 do |a, o=:opt, *r, c|
36
+ log4(a, o, r, c)
37
+ end
38
+
39
+ def f5(&blk)
40
+ yield :a, :b, :c, :d, *StringArray
41
+ blk
42
+ end
43
+ def log5(a, o, r, c); end
44
+ f5 do |a, o=:opt, *r, c|
45
+ log5(a, o, r, c)
46
+ end
47
+
48
+ def f6(&blk)
49
+ yield :a, :b, :c, :d, :e, *StringArray
50
+ blk
51
+ end
52
+ def log6(a, o, r, c); end
53
+ f6 do |a, o=:opt, *r, c|
54
+ log6(a, o, r, c)
55
+ end
56
+
57
+ __END__
58
+ # Classes
59
+ class Object
60
+ StringArray : Array[String]
61
+ def f1 : { (*String) -> nil } -> (^(String, ?:opt | String, *String, String) -> nil)
62
+ def log1 : (String, :opt | String, Array[String], String) -> nil
63
+ def f2 : { (:a, *String) -> nil } -> (^(:a, ?:opt | String, *String, String) -> nil)
64
+ def log2 : (:a, :opt | String, Array[String], String) -> nil
65
+ def f3 : { (:a, :b, *String) -> nil } -> (^(:a, ?:b | :opt, *String, :b | String) -> nil)
66
+ def log3 : (:a, :b | :opt, Array[String], :b | String) -> nil
67
+ def f4 : { (:a, :b, :c, *String) -> nil } -> (^(:a, ?:b | :opt, *:c | String, :c | String) -> nil)
68
+ def log4 : (:a, :b | :opt, Array[:c | String], :c | String) -> nil
69
+ def f5 : { (:a, :b, :c, :d, *String) -> nil } -> (^(:a, ?:b | :opt, *:c | :d | String, :d | String) -> nil)
70
+ def log5 : (:a, :b | :opt, Array[:c | :d | String], :d | String) -> nil
71
+ def f6 : { (:a, :b, :c, :d, :e, *String) -> nil } -> (^(:a, ?:b | :opt, *:c | :d | :e | String, :e | String) -> nil)
72
+ def log6 : (:a, :b | :opt, Array[:c | :d | :e | String], :e | String) -> nil
73
+ end