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
@@ -0,0 +1,70 @@
1
+ def f1(&blk)
2
+ yield
3
+ blk
4
+ end
5
+ def log1(a, o, r, c); end
6
+ f1 do |a, o=:opt, *r, c|
7
+ log1(a, o, r, c)
8
+ end
9
+
10
+ def f2(&blk)
11
+ yield :a
12
+ blk
13
+ end
14
+ def log2(a, o, r, c); end
15
+ f2 do |a, o=:opt, *r, c|
16
+ log2(a, o, r, c)
17
+ end
18
+
19
+ def f3(&blk)
20
+ yield :a, :b
21
+ blk
22
+ end
23
+ def log3(a, o, r, c); end
24
+ f3 do |a, o=:opt, *r, c|
25
+ log3(a, o, r, c)
26
+ end
27
+
28
+ def f4(&blk)
29
+ yield :a, :b, :c
30
+ blk
31
+ end
32
+ def log4(a, o, r, c); end
33
+ f4 do |a, o=:opt, *r, c|
34
+ log4(a, o, r, c)
35
+ end
36
+
37
+ def f5(&blk)
38
+ yield :a, :b, :c, :d
39
+ blk
40
+ end
41
+ def log5(a, o, r, c); end
42
+ f5 do |a, o=:opt, *r, c|
43
+ log5(a, o, r, c)
44
+ end
45
+
46
+ def f6(&blk)
47
+ yield :a, :b, :c, :d, :e
48
+ blk
49
+ end
50
+ def log6(a, o, r, c); end
51
+ f6 do |a, o=:opt, *r, c|
52
+ log6(a, o, r, c)
53
+ end
54
+
55
+ __END__
56
+ # Classes
57
+ class Object
58
+ def f1 : { -> nil } -> ^(nil, ?:opt, *bot, nil) -> nil
59
+ def log1 : (nil, :opt, [], nil) -> nil
60
+ def f2 : { (:a) -> nil } -> ^(:a, ?:opt, *bot, nil) -> nil
61
+ def log2 : (:a, :opt, [], nil) -> nil
62
+ def f3 : { (:a, :b) -> nil } -> ^(:a, ?:opt, *bot, :b) -> nil
63
+ def log3 : (:a, :opt, [], :b) -> nil
64
+ def f4 : { (:a, :b, :c) -> nil } -> (^(:a, ?:b | :opt, *bot, :c) -> nil)
65
+ def log4 : (:a, :b | :opt, [], :c) -> nil
66
+ def f5 : { (:a, :b, :c, :d) -> nil } -> (^(:a, ?:b | :opt, *:c, :d) -> nil)
67
+ def log5 : (:a, :b | :opt, [:c], :d) -> nil
68
+ def f6 : { (:a, :b, :c, :d, :e) -> nil } -> (^(:a, ?:b | :opt, *:c | :d, :e) -> nil)
69
+ def log6 : (:a, :b | :opt, [:c, :d], :e) -> nil
70
+ end
@@ -0,0 +1,27 @@
1
+ def log1(x); end
2
+ def log2(x); end
3
+ def log3(x); end
4
+
5
+ def f(&blk)
6
+ log3(
7
+ blk.call do |x|
8
+ log1(x)
9
+ :b
10
+ end
11
+ )
12
+ :d
13
+ end
14
+
15
+ f do |&blk|
16
+ log2(blk.call(:a))
17
+ :c
18
+ end
19
+
20
+ __END__
21
+ # Classes
22
+ class Object
23
+ def log1 : (:a) -> nil
24
+ def log2 : (:b) -> nil
25
+ def log3 : (:c) -> nil
26
+ def f : { { (:a) -> :b } -> :c } -> :d
27
+ end
@@ -0,0 +1,52 @@
1
+ def f1
2
+ yield k: 1
3
+ end
4
+ def log1(n); end
5
+ f1 {|k:| log1(k) }
6
+
7
+ def f2
8
+ yield k: 1
9
+ end
10
+ def log2(n); end
11
+ f2 {|k: :opt| log2(k) }
12
+
13
+ def f3
14
+ yield k: 1
15
+ end
16
+ def log3(n); end
17
+ f3 {|k: "str"| log3(k) }
18
+
19
+ def f4
20
+ yield k: 1
21
+ end
22
+ def log4(kwrest); end
23
+ f4 {|**kwrest| log4(kwrest) }
24
+
25
+ def f5
26
+ yield k: 1
27
+ end
28
+ f5 {|| }
29
+
30
+ def f6
31
+ yield
32
+ end
33
+ f6 {|k:| }
34
+
35
+ __END__
36
+ # Errors
37
+ smoke/block-kwarg.rb:26: [error] unknown keyword: k
38
+ smoke/block-kwarg.rb:31: [error] no argument for required keywords
39
+
40
+ # Classes
41
+ class Object
42
+ def f1 : { -> nil } -> nil
43
+ def log1 : (Integer) -> nil
44
+ def f2 : { -> nil } -> nil
45
+ def log2 : (:opt | Integer) -> nil
46
+ def f3 : { -> nil } -> nil
47
+ def log3 : (Integer | String) -> nil
48
+ def f4 : { -> nil } -> nil
49
+ def log4 : ({k: Integer}) -> nil
50
+ def f5 : { -> nil } -> untyped
51
+ def f6 : { -> nil } -> untyped
52
+ end
@@ -10,5 +10,5 @@ foo([1], ["str"])
10
10
  __END__
11
11
  # Classes
12
12
  class Object
13
- def foo : ([Integer], [String]) -> [Integer]
13
+ def foo : ([Integer], [String]) -> ([Integer | String])
14
14
  end
@@ -34,6 +34,6 @@ class Object
34
34
  def log1 : (Integer?) -> nil
35
35
  def log2 : (Integer?) -> nil
36
36
  def foo : -> Integer?
37
- def test_yield : { () -> nil } -> nil
37
+ def test_yield : { -> nil } -> nil
38
38
  def bar : -> Integer?
39
39
  end
@@ -0,0 +1,17 @@
1
+ def foo(&blk)
2
+ $blk = blk
3
+ nil
4
+ end
5
+
6
+ foo {|n| }
7
+
8
+ $blk.call(42)
9
+
10
+ __END__
11
+ # Global variables
12
+ $blk : ^(Integer) -> nil
13
+
14
+ # Classes
15
+ class Object
16
+ def foo : { (Integer) -> nil } -> nil
17
+ end
@@ -13,6 +13,6 @@ bar(&blk)
13
13
  __END__
14
14
  # Classes
15
15
  class Object
16
- def foo : { (String) -> (:sym | String) } -> (:sym | String)
17
- def bar : { (:sym) -> (:sym | String) } -> (:sym | String)
16
+ def foo : { (:sym | String) -> (:sym | String) } -> (:sym | String)
17
+ def bar : { (:sym | String) -> (:sym | String) } -> (:sym | String)
18
18
  end
@@ -14,5 +14,6 @@ end
14
14
  __END__
15
15
  # Classes
16
16
  class Object
17
+ F : ^(Integer) -> String
17
18
  def foo : { (:sym) { (Integer) -> String } -> String } -> String
18
19
  end
@@ -15,6 +15,6 @@ foo
15
15
  __END__
16
16
  # Classes
17
17
  class Object
18
- def bar : { () -> String } -> String
18
+ def bar : { -> String } -> String
19
19
  def foo : -> (Integer | String)
20
20
  end
@@ -11,8 +11,6 @@ __END__
11
11
  # Errors
12
12
  smoke/block7.rb:5: [error] undefined method: Object#undefined_method
13
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
14
 
17
15
  # Classes
18
16
  class Object
@@ -21,7 +21,7 @@ foo
21
21
  __END__
22
22
  # Classes
23
23
  class Object
24
- def bar : -> String
25
- def baz : { () -> String } -> String
24
+ def bar : { -> String } -> String
25
+ def baz : { -> String } -> String
26
26
  def foo : -> (Integer | String)
27
27
  end
@@ -8,5 +8,5 @@ foo { }
8
8
  __END__
9
9
  # Classes
10
10
  class Object
11
- def foo : -> Integer
11
+ def foo : { -> nil } -> Integer
12
12
  end
@@ -8,5 +8,5 @@ foo { }
8
8
  __END__
9
9
  # Classes
10
10
  class Object
11
- def foo : -> ([Proc[] | Proc[]])
11
+ def foo : { -> nil } -> [^-> nil]
12
12
  end
@@ -0,0 +1,54 @@
1
+ A = 1
2
+
3
+ module Lib
4
+ module Mod
5
+ end
6
+ class Base
7
+ end
8
+ end
9
+
10
+ module App
11
+ class Foo < Lib::Base
12
+ include Lib::Mod
13
+ CONST1 = Foo.new
14
+ class Bar
15
+ CONST2 = Bar.new
16
+ end
17
+ end
18
+
19
+ CONST3 = Foo::Bar.new
20
+ class Baz < App::Foo
21
+ CONST4 = Foo::Bar.new
22
+ end
23
+ end
24
+
25
+ __END__
26
+ # Classes
27
+ class Object
28
+ A : Integer
29
+ end
30
+
31
+ module Lib
32
+ module Mod
33
+ end
34
+
35
+ class Base
36
+ end
37
+ end
38
+
39
+ module App
40
+ CONST3 : Foo::Bar
41
+
42
+ class Foo < Lib::Base
43
+ CONST1 : Foo
44
+ include Lib::Mod
45
+
46
+ class Bar
47
+ CONST2 : Bar
48
+ end
49
+ end
50
+
51
+ class Baz < Foo
52
+ CONST4 : Foo::Bar
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ class A
2
+ class B
3
+ class C
4
+ def get_a
5
+ A.new
6
+ end
7
+ def get_b
8
+ B.new
9
+ end
10
+ def get_c
11
+ C.new
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ __END__
18
+ # Classes
19
+ class A
20
+ class B
21
+ class C
22
+ def get_a : -> A
23
+ def get_b : -> B
24
+ def get_c : -> C
25
+ end
26
+ end
27
+ end
@@ -30,12 +30,17 @@ Foo::Bar.new.get4 # Integer
30
30
 
31
31
  __END__
32
32
  # Classes
33
- class Foo
33
+ class Object
34
+ CONST : Integer
34
35
  end
35
36
 
36
- class Foo::Bar
37
- def get1 : -> String
38
- def get2 : -> Integer
39
- def get3 : -> Integer
40
- def get4 : -> Integer
37
+ class Foo
38
+ CONST : String
39
+
40
+ class Bar
41
+ def get1 : -> String
42
+ def get2 : -> Integer
43
+ def get3 : -> Integer
44
+ def get4 : -> Integer
45
+ end
41
46
  end
@@ -24,6 +24,8 @@ smoke/constant2.rb:15: [warning] already initialized constant Object::BAR
24
24
 
25
25
  # Classes
26
26
  class Object
27
+ C : String
28
+ BAR : String
27
29
  def foo : (Integer | untyped) -> nil
28
30
  def log : (String) -> nil
29
31
  end
@@ -23,6 +23,7 @@ class Object
23
23
  end
24
24
 
25
25
  class A
26
+ FOO : Integer
26
27
  @@var : Integer
27
28
  def foo : -> nil
28
29
  end
@@ -15,6 +15,6 @@ foo
15
15
  __END__
16
16
  # Classes
17
17
  class Object
18
- def bar : { () -> String } -> String
18
+ def bar : { -> String } -> String
19
19
  def foo : -> (Integer | String)
20
20
  end
@@ -13,6 +13,6 @@ bar(&blk)
13
13
  __END__
14
14
  # Classes
15
15
  class Object
16
- def foo : { (String) -> (:sym | String) } -> (:sym | String)
17
- def bar : { (:sym) -> (:sym | String) } -> (:sym | String)
16
+ def foo : { (:sym | String) -> (:sym | String) } -> (:sym | String)
17
+ def bar : { (:sym | String) -> (:sym | String) } -> (:sym | String)
18
18
  end
@@ -8,11 +8,9 @@ foo do |dummy, &blk|
8
8
  blk.call(42)
9
9
  end
10
10
 
11
- # truly expected:
12
- # Object#foo :: (&Proc[(Symbol, &Proc[(Integer) -> String]) -> String]) -> String
13
-
14
11
  __END__
15
12
  # Classes
16
13
  class Object
14
+ F : ^(Integer) -> String
17
15
  def foo : { (:sym) { (Integer) -> String } -> String } -> String
18
16
  end
@@ -14,13 +14,7 @@ foo("str")
14
14
  foo(:sym)
15
15
 
16
16
  __END__
17
- # Errors
18
- smoke/flow7.rb:4: [error] failed to resolve overload: String#+
19
- smoke/flow7.rb:4: [error] undefined method: :sym#+
20
- smoke/flow7.rb:6: [error] failed to resolve overload: Integer#+
21
- smoke/flow7.rb:6: [error] undefined method: :sym#+
22
-
23
17
  # Classes
24
18
  class Object
25
- def foo : (:sym | Integer | String) -> (:sym | Integer | String | untyped)
19
+ def foo : (:sym | Integer | String) -> (:sym | Integer | String)
26
20
  end
@@ -0,0 +1,13 @@
1
+ def foo(n)
2
+ n = n || 42
3
+ n
4
+ end
5
+
6
+ foo(1)
7
+ foo(nil)
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def foo : (Integer?) -> Integer
13
+ end
@@ -21,7 +21,7 @@ baz(h)
21
21
  __END__
22
22
  # Classes
23
23
  class Object
24
- def foo : ({:a=>:A, :b=>:B}) -> (:A | :B)
25
- def bar : ({:a=>:A, :b=>:B}) -> (:A | :B | :C)
26
- def baz : ({:a=>:A, :b=>:B}) -> ([:A | :B | :C, (:a | :b)?])
24
+ def foo : ({a: :A, b: :B}) -> (:A | :B)
25
+ def bar : ({a: :A, b: :B}) -> (:A | :B | :C)
26
+ def baz : ({a: :A, b: :B}) -> ([:A | :B | :C, (:a | :b)?])
27
27
  end