typeprof 0.3.0 → 0.4.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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +1 -1
  3. data/doc/demo.md +398 -0
  4. data/doc/doc.ja.md +4 -0
  5. data/doc/doc.md +4 -0
  6. data/lib/typeprof.rb +8 -0
  7. data/lib/typeprof/analyzer.rb +229 -245
  8. data/lib/typeprof/arguments.rb +397 -0
  9. data/lib/typeprof/block.rb +133 -0
  10. data/lib/typeprof/builtin.rb +14 -10
  11. data/lib/typeprof/container-type.rb +94 -17
  12. data/lib/typeprof/export.rb +185 -108
  13. data/lib/typeprof/import.rb +76 -54
  14. data/lib/typeprof/iseq.rb +27 -2
  15. data/lib/typeprof/method.rb +87 -73
  16. data/lib/typeprof/type.rb +125 -309
  17. data/lib/typeprof/version.rb +1 -1
  18. data/smoke/arguments2.rb +1 -1
  19. data/smoke/array-each3.rb +1 -4
  20. data/smoke/array12.rb +1 -1
  21. data/smoke/array6.rb +1 -0
  22. data/smoke/block-ambiguous.rb +36 -0
  23. data/smoke/block-args1-rest.rb +62 -0
  24. data/smoke/block-args1.rb +59 -0
  25. data/smoke/block-args2-rest.rb +62 -0
  26. data/smoke/block-args2.rb +59 -0
  27. data/smoke/block-args3-rest.rb +73 -0
  28. data/smoke/block-args3.rb +70 -0
  29. data/smoke/block-blockarg.rb +27 -0
  30. data/smoke/block-kwarg.rb +52 -0
  31. data/smoke/block11.rb +1 -1
  32. data/smoke/block14.rb +17 -0
  33. data/smoke/block4.rb +2 -2
  34. data/smoke/block5.rb +1 -0
  35. data/smoke/block6.rb +1 -1
  36. data/smoke/block7.rb +0 -2
  37. data/smoke/block8.rb +2 -2
  38. data/smoke/block9.rb +1 -1
  39. data/smoke/blown.rb +1 -1
  40. data/smoke/class-hierarchy.rb +54 -0
  41. data/smoke/class-hierarchy2.rb +27 -0
  42. data/smoke/constant1.rb +11 -6
  43. data/smoke/constant2.rb +2 -0
  44. data/smoke/cvar.rb +1 -0
  45. data/smoke/demo10.rb +1 -1
  46. data/smoke/demo8.rb +2 -2
  47. data/smoke/demo9.rb +1 -3
  48. data/smoke/flow7.rb +1 -7
  49. data/smoke/flow8.rb +13 -0
  50. data/smoke/instance_eval.rb +1 -1
  51. data/smoke/int_times.rb +1 -1
  52. data/smoke/multiple-superclass.rb +4 -0
  53. data/smoke/next2.rb +1 -1
  54. data/smoke/optional3.rb +10 -0
  55. data/smoke/proc4.rb +1 -1
  56. data/smoke/rbs-proc1.rb +9 -0
  57. data/smoke/rbs-proc1.rbs +3 -0
  58. data/smoke/rbs-proc2.rb +20 -0
  59. data/smoke/rbs-proc2.rbs +3 -0
  60. data/smoke/rbs-proc3.rb +13 -0
  61. data/smoke/rbs-proc3.rbs +4 -0
  62. data/smoke/rbs-record.rb +17 -0
  63. data/smoke/rbs-record.rbs +4 -0
  64. data/smoke/rbs-tyvar3.rb +25 -0
  65. data/smoke/rbs-tyvar3.rbs +4 -0
  66. data/smoke/rest2.rb +1 -1
  67. data/smoke/rest5.rb +1 -1
  68. data/smoke/return.rb +1 -1
  69. data/smoke/singleton_method.rb +3 -0
  70. data/smoke/struct.rb +4 -3
  71. data/smoke/struct3.rb +14 -0
  72. data/smoke/symbol-proc.rb +24 -0
  73. metadata +31 -3
  74. data/smoke/variadic1.rb.notyet +0 -5
@@ -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
@@ -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
@@ -13,6 +13,6 @@ end
13
13
  __END__
14
14
  # Classes
15
15
  class C
16
- def self.foo : -> C
16
+ def self.foo : { (C) -> nil } -> C
17
17
  def log : (Integer) -> nil
18
18
  end
@@ -1,7 +1,7 @@
1
1
  def foo(n)
2
2
  z = "str"
3
3
  n.times {|i| z = i }
4
- # TODO: n.times { z = 42 }
4
+ n.times { z = 42 }
5
5
  z
6
6
  end
7
7
 
@@ -14,6 +14,10 @@ __END__
14
14
  smoke/multiple-superclass.rb:9: [warning] superclass is not a class; Object is used instead
15
15
 
16
16
  # Classes
17
+ class Object
18
+ Base : A.class | B.class
19
+ end
20
+
17
21
  class A
18
22
  end
19
23
 
@@ -12,5 +12,5 @@ end
12
12
  __END__
13
13
  # Classes
14
14
  class Object
15
- def foo : { () -> (Integer | String) } -> (Integer | String)
15
+ def foo : { -> (Integer | String) } -> (Integer | String)
16
16
  end
@@ -0,0 +1,10 @@
1
+ def foo(n = 1)
2
+ end
3
+
4
+ foo("str")
5
+
6
+ __END__
7
+ # Classes
8
+ class Object
9
+ def foo : (?Integer | String) -> nil
10
+ end
@@ -7,5 +7,5 @@ foo(-> x { "str" })
7
7
  __END__
8
8
  # Classes
9
9
  class Object
10
- def foo : (Proc[(Integer) -> String]) -> String
10
+ def foo : (^(Integer) -> String) -> String
11
11
  end
@@ -0,0 +1,9 @@
1
+ def log
2
+ Foo.new.foo.call(42)
3
+ end
4
+
5
+ __END__
6
+ # Classes
7
+ class Object
8
+ def log : -> Integer
9
+ end
@@ -0,0 +1,3 @@
1
+ class Foo
2
+ def foo: -> ^(Integer) -> Integer
3
+ end
@@ -0,0 +1,20 @@
1
+ # two issues:
2
+ # (1) TypedProc should call `-> n { log1(n) }` with an Integer, but not implemented yet
3
+ # (2) log1 returns a String, which is inconsistent and should be reported
4
+
5
+ def log1(n)
6
+ n.to_s # XXX: should be reported as "inconsistent with RBS"
7
+ end
8
+
9
+ def log2
10
+ Foo.new.foo(-> n { log1(n) })
11
+ end
12
+
13
+ log2
14
+
15
+ __END__
16
+ # Classes
17
+ class Object
18
+ def log1 : (untyped) -> untyped
19
+ def log2 : -> String
20
+ end