typeprof 0.4.2 → 0.5.4

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/main.yml +1 -2
  3. data/Gemfile.lock +3 -3
  4. data/README.md +6 -0
  5. data/lib/typeprof/analyzer.rb +97 -84
  6. data/lib/typeprof/arguments.rb +27 -19
  7. data/lib/typeprof/block.rb +5 -2
  8. data/lib/typeprof/builtin.rb +14 -4
  9. data/lib/typeprof/config.rb +10 -6
  10. data/lib/typeprof/container-type.rb +117 -101
  11. data/lib/typeprof/export.rb +1 -1
  12. data/lib/typeprof/import.rb +44 -22
  13. data/lib/typeprof/method.rb +70 -12
  14. data/lib/typeprof/type.rb +108 -89
  15. data/lib/typeprof/version.rb +1 -1
  16. data/smoke/arguments2.rb +1 -1
  17. data/smoke/array11.rb +1 -1
  18. data/smoke/array6.rb +2 -2
  19. data/smoke/array8.rb +1 -1
  20. data/smoke/block-args2.rb +3 -3
  21. data/smoke/block-args3.rb +4 -4
  22. data/smoke/block-blockarg.rb +1 -1
  23. data/smoke/block-kwarg.rb +1 -1
  24. data/smoke/block10.rb +1 -1
  25. data/smoke/block5.rb +1 -1
  26. data/smoke/constant2.rb +1 -2
  27. data/smoke/demo5.rb +1 -1
  28. data/smoke/demo9.rb +1 -1
  29. data/smoke/hash-fetch.rb +3 -3
  30. data/smoke/hash-merge-bang.rb +11 -0
  31. data/smoke/hash1.rb +3 -2
  32. data/smoke/hash3.rb +1 -1
  33. data/smoke/inheritance2.rb +2 -2
  34. data/smoke/ivar2.rb +2 -2
  35. data/smoke/kernel-class.rb +1 -1
  36. data/smoke/keyword4.rb +1 -1
  37. data/smoke/kwsplat1.rb +2 -2
  38. data/smoke/kwsplat2.rb +1 -1
  39. data/smoke/multiple-superclass.rb +1 -1
  40. data/smoke/parameterizedd-self.rb +2 -2
  41. data/smoke/pattern-match1.rb +23 -0
  42. data/smoke/pattern-match2.rb +15 -0
  43. data/smoke/rbs-tyvar3.rb +11 -19
  44. data/smoke/rbs-tyvar3.rbs +4 -3
  45. data/smoke/rbs-tyvar4.rb +36 -0
  46. data/smoke/rbs-tyvar5.rb +12 -0
  47. data/smoke/rbs-tyvar5.rbs +8 -0
  48. data/smoke/struct.rb +2 -2
  49. data/smoke/uninitialize-var.rb +12 -0
  50. data/smoke/union-recv.rb +2 -2
  51. data/typeprof.gemspec +1 -1
  52. metadata +11 -4
@@ -1,3 +1,3 @@
1
1
  module TypeProf
2
- VERSION = "0.4.2"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -50,6 +50,6 @@ class Object
50
50
  def f6 : (k: :kk) -> nil
51
51
  def f7 : (?k: Integer) -> nil
52
52
  def f8 : (?k: String) -> nil
53
- def f9 : (**{:k=>:kk}) -> nil
53
+ def f9 : (**{k: :kk}) -> nil
54
54
  def f10 : { (Integer) -> nil } -> nil
55
55
  end
@@ -9,5 +9,5 @@ array("foo")
9
9
  __END__
10
10
  # Classes
11
11
  class Object
12
- def array : (Array[Integer] | String | {Integer=>Integer}) -> (Array[Integer | String | {Integer=>Integer}])
12
+ def array : (Array[Integer] | Hash[Integer, Integer] | String) -> (Array[Hash[Integer, Integer] | Integer | String])
13
13
  end
@@ -10,6 +10,6 @@ foo(1, "str")
10
10
  __END__
11
11
  # Classes
12
12
  class Object
13
- ARY : []
14
- def foo : (Integer, String) -> []
13
+ ARY : Array[bot]
14
+ def foo : (Integer, String) -> Array[bot]
15
15
  end
@@ -9,5 +9,5 @@ end
9
9
  __END__
10
10
  # Classes
11
11
  class Foo
12
- def self.foo : ([]) -> []
12
+ def self.foo : (Array[bot]) -> Array[bot]
13
13
  end
@@ -47,11 +47,11 @@ __END__
47
47
  # Classes
48
48
  class Object
49
49
  def f1 : { -> nil } -> ^(nil, *bot, nil) -> nil
50
- def log1 : (nil, [], nil) -> nil
50
+ def log1 : (nil, Array[bot], nil) -> nil
51
51
  def f2 : { (:a) -> nil } -> ^(:a, *bot, nil) -> nil
52
- def log2 : (:a, [], nil) -> nil
52
+ def log2 : (:a, Array[bot], nil) -> nil
53
53
  def f3 : { (:a, :b) -> nil } -> ^(:a, *bot, :b) -> nil
54
- def log3 : (:a, [], :b) -> nil
54
+ def log3 : (:a, Array[bot], :b) -> nil
55
55
  def f4 : { (:a, :b, :c) -> nil } -> ^(:a, *:b, :c) -> nil
56
56
  def log4 : (:a, [:b], :c) -> nil
57
57
  def f5 : { (:a, :b, :c, :d) -> nil } -> (^(:a, *:b | :c, :d) -> nil)
@@ -56,13 +56,13 @@ __END__
56
56
  # Classes
57
57
  class Object
58
58
  def f1 : { -> nil } -> ^(nil, ?:opt, *bot, nil) -> nil
59
- def log1 : (nil, :opt, [], nil) -> nil
59
+ def log1 : (nil, :opt, Array[bot], nil) -> nil
60
60
  def f2 : { (:a) -> nil } -> ^(:a, ?:opt, *bot, nil) -> nil
61
- def log2 : (:a, :opt, [], nil) -> nil
61
+ def log2 : (:a, :opt, Array[bot], nil) -> nil
62
62
  def f3 : { (:a, :b) -> nil } -> ^(:a, ?:opt, *bot, :b) -> nil
63
- def log3 : (:a, :opt, [], :b) -> nil
63
+ def log3 : (:a, :opt, Array[bot], :b) -> nil
64
64
  def f4 : { (:a, :b, :c) -> nil } -> (^(:a, ?:b | :opt, *bot, :c) -> nil)
65
- def log4 : (:a, :b | :opt, [], :c) -> nil
65
+ def log4 : (:a, :b | :opt, Array[bot], :c) -> nil
66
66
  def f5 : { (:a, :b, :c, :d) -> nil } -> (^(:a, ?:b | :opt, *:c, :d) -> nil)
67
67
  def log5 : (:a, :b | :opt, [:c], :d) -> nil
68
68
  def f6 : { (:a, :b, :c, :d, :e) -> nil } -> (^(:a, ?:b | :opt, *:c | :d, :e) -> nil)
@@ -23,5 +23,5 @@ class Object
23
23
  def log1 : (:a) -> nil
24
24
  def log2 : (:b) -> nil
25
25
  def log3 : (:c) -> nil
26
- def f : { { (:a) -> :b } -> :c } -> :d
26
+ def f : { -> :c } -> :d
27
27
  end
@@ -46,7 +46,7 @@ class Object
46
46
  def f3 : { -> nil } -> nil
47
47
  def log3 : (Integer | String) -> nil
48
48
  def f4 : { -> nil } -> nil
49
- def log4 : ({:k=>Integer}) -> nil
49
+ def log4 : ({k: Integer}) -> nil
50
50
  def f5 : { -> nil } -> untyped
51
51
  def f6 : { -> nil } -> untyped
52
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
@@ -15,5 +15,5 @@ __END__
15
15
  # Classes
16
16
  class Object
17
17
  F : ^(Integer) -> String
18
- def foo : { (:sym) { (Integer) -> String } -> String } -> String
18
+ def foo : { (:sym) -> String } -> String
19
19
  end
@@ -24,12 +24,11 @@ smoke/constant2.rb:15: [warning] already initialized constant Object::BAR
24
24
 
25
25
  # Classes
26
26
  class Object
27
- C : String
28
27
  BAR : String
29
28
  def foo : (Integer | untyped) -> nil
30
29
  def log : (String) -> nil
31
30
  end
32
31
 
33
- class C(dummy)
32
+ class C
34
33
  def foo : -> nil
35
34
  end
@@ -9,7 +9,7 @@ B.foo(Integer)
9
9
  __END__
10
10
  # Classes
11
11
  class A
12
- def self.foo : (Integer | Integer.class) -> String
12
+ def self.foo : (Integer | singleton(Integer)) -> String
13
13
  end
14
14
 
15
15
  class B < A
@@ -12,5 +12,5 @@ __END__
12
12
  # Classes
13
13
  class Object
14
14
  F : ^(Integer) -> String
15
- def foo : { (:sym) { (Integer) -> String } -> String } -> String
15
+ def foo : { (:sym) -> String } -> String
16
16
  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
@@ -0,0 +1,11 @@
1
+ def foo
2
+ h = { a: 42 }
3
+ h0 = h.merge!({ b: "str" })
4
+ return h0, h
5
+ end
6
+
7
+ __END__
8
+ # Classes
9
+ class Object
10
+ def foo : -> [{a: Integer}, {a: Integer, b: String}]
11
+ end
@@ -5,6 +5,7 @@ end
5
5
  foo
6
6
 
7
7
  def bar
8
+ # This returns {Integer=>Integer | String, String=>String} but RBS cannot express it
8
9
  { 1 => 1, 2 => "str", "s" => "s" }
9
10
  end
10
11
 
@@ -13,6 +14,6 @@ bar
13
14
  __END__
14
15
  # Classes
15
16
  class Object
16
- def foo : -> {:int=>Integer, :str=>String}
17
- def bar : -> ({Integer=>Integer | String, String=>String})
17
+ def foo : -> {int: Integer, str: String}
18
+ def bar : -> (Hash[Integer | String, Integer | String])
18
19
  end
@@ -9,5 +9,5 @@ foo
9
9
  __END__
10
10
  # Classes
11
11
  class Object
12
- def foo : -> {:int=>Integer, :str=>String}
12
+ def foo : -> {int: Integer, str: String}
13
13
  end
@@ -21,11 +21,11 @@ end
21
21
  __END__
22
22
  # Classes
23
23
  class SuperBase
24
- def self.foo : -> (A.class | B.class)
24
+ def self.foo : -> (singleton(A) | singleton(B))
25
25
  end
26
26
 
27
27
  class Base < SuperBase
28
- def self.foo : -> (A.class | B.class)
28
+ def self.foo : -> (singleton(A) | singleton(B))
29
29
  end
30
30
 
31
31
  class A < Base
@@ -24,7 +24,7 @@ __END__
24
24
  # Classes
25
25
  class Foo
26
26
  attr_reader array : Array[:sym | Integer | String]
27
- attr_reader hash : {:a=>Integer, :b=>String, :c=>:sym}
28
- def initialize : -> {}
27
+ attr_reader hash : {a: Integer, b: String, c: :sym}
28
+ def initialize : -> Hash[bot, bot]
29
29
  def set : -> :sym
30
30
  end
@@ -8,5 +8,5 @@ foo("")
8
8
  __END__
9
9
  # Classes
10
10
  class Object
11
- def foo : (Integer | String) -> (Integer.class | String.class)
11
+ def foo : (Integer | String) -> (singleton(Integer) | singleton(String))
12
12
  end
@@ -7,5 +7,5 @@ foo(n: 42, s: "str")
7
7
  __END__
8
8
  # Classes
9
9
  class Object
10
- def foo : (**{:n=>Integer, :s=>String}) -> {:n=>Integer, :s=>String}
10
+ def foo : (**{n: Integer, s: String}) -> {n: Integer, s: String}
11
11
  end
@@ -37,6 +37,6 @@ smoke/kwsplat1.rb:30: [error] undefined method: Object#any
37
37
  class Object
38
38
  def foo : (k: Integer) -> nil
39
39
  def bar : (int: Integer, str: String) -> nil
40
- def baz : (**{:int=>Integer, :str=>String}) -> nil
41
- def qux : (**{untyped=>untyped}) -> nil
40
+ def baz : (**{int: Integer, str: String}) -> nil
41
+ def qux : (**Hash[untyped, untyped]) -> nil
42
42
  end
@@ -8,5 +8,5 @@ foo(*a, **h)
8
8
  __END__
9
9
  # Classes
10
10
  class Object
11
- def foo : (*Integer | {:k=>Integer}, k: Integer) -> nil
11
+ def foo : (*Integer | {k: Integer}, k: Integer) -> nil
12
12
  end
@@ -15,7 +15,7 @@ smoke/multiple-superclass.rb:9: [warning] superclass is not a class; Object is u
15
15
 
16
16
  # Classes
17
17
  class Object
18
- Base : A.class | B.class
18
+ Base : singleton(A) | singleton(B)
19
19
  end
20
20
 
21
21
  class A
@@ -13,6 +13,6 @@ bar([])
13
13
  __END__
14
14
  # Classes
15
15
  class Object
16
- def foo : -> []
17
- def bar : ([]) -> []
16
+ def foo : -> Array[bot]
17
+ def bar : (Array[bot]) -> Array[bot]
18
18
  end
@@ -0,0 +1,23 @@
1
+ # RUBY_VERSION >= 3.0
2
+
3
+ def foo
4
+ case [:a, :b, :c]
5
+ in [a, b, :c]
6
+ # Due to very subtle detail of bytecode, the variables "a" and "b" could be nil
7
+ return a, b
8
+ end
9
+ end
10
+
11
+ foo
12
+
13
+ __END__
14
+ # Errors
15
+ smoke/pattern-match1.rb:5: [error] undefined method: nil#length
16
+ smoke/pattern-match1.rb:5: [error] undefined method: nil#[]
17
+ smoke/pattern-match1.rb:5: [error] undefined method: nil#[]
18
+ smoke/pattern-match1.rb:5: [error] undefined method: nil#[]
19
+
20
+ # Classes
21
+ class Object
22
+ def foo : -> ([:a | untyped, :b | untyped])
23
+ end
@@ -0,0 +1,15 @@
1
+ # RUBY_VERSION >= 3.0
2
+
3
+ def foo
4
+ case { a: :A, b: :B, c: :C }
5
+ in { a:, b: bb, c: :C }
6
+ return a, bb
7
+ end
8
+ end
9
+
10
+ foo
11
+ __END__
12
+ # Classes
13
+ class Object
14
+ def foo : -> [:A, :B]
15
+ end
@@ -1,25 +1,17 @@
1
- class StringFoo
2
- def initialize
3
- @foo = Foo.new
4
- end
5
-
6
- def set
7
- @foo.set("42")
8
- end
9
-
10
- def get
11
- @foo.get
12
- end
1
+ def foo
2
+ cell = Cell.new(42)
3
+ cell.map {|s| (s + 1).to_s }
13
4
  end
14
5
 
15
- StringFoo.new.set
16
- StringFoo.new.get
6
+ def bar
7
+ cell = Cell.new(42)
8
+ cell.map! {|s| (s + 1).to_s }
9
+ cell
10
+ end
17
11
 
18
12
  __END__
19
13
  # Classes
20
- class StringFoo
21
- @foo : Foo[String] | Foo[bot]
22
- def initialize : -> Foo[bot]
23
- def set : -> void
24
- def get : -> String
14
+ class Object
15
+ def foo : -> Cell[String]
16
+ def bar : -> (Cell[Integer | String])
25
17
  end
@@ -1,4 +1,5 @@
1
- class Foo[X]
2
- def set: (X) -> void
3
- def get: -> X
1
+ class Cell[T]
2
+ def initialize : (T) -> void
3
+ def map: [A] { (T) -> A } -> Cell[A]
4
+ def map!: { (T) -> T } -> self
4
5
  end
@@ -0,0 +1,36 @@
1
+ # This code is created by simplifying matrix.rb.
2
+ # The issue occurs when `Array.new` creates a cell-type container,
3
+ # so this test will be obsolete, but keep it just for case of regression.
4
+ #
5
+ # https://github.com/ruby/typeprof/issues/14
6
+
7
+ class Foo
8
+ def initialize(ivar)
9
+ @ivar = ivar
10
+ end
11
+
12
+ def foo(n)
13
+ @ivar.each_with_index { }
14
+ nil
15
+ end
16
+ end
17
+
18
+ Foo.new([])
19
+
20
+ rows = Array.new(1) do |i|
21
+ Array.new(1) do |j|
22
+ "str"
23
+ end
24
+ end
25
+ obj = Foo.new(rows)
26
+
27
+ obj.foo(:a)
28
+ obj.foo(:b)
29
+
30
+ __END__
31
+ # Classes
32
+ class Foo
33
+ @ivar : Array[Array[String]]
34
+ def initialize : (Array[Array[String]]) -> Array[Array[String]]
35
+ def foo : (:a | :b) -> nil
36
+ end
@@ -0,0 +1,12 @@
1
+ def foo
2
+ cell = Cell.new
3
+ cell.set { Foo.new(:a, :b) }
4
+ cell.dummy { }
5
+ cell
6
+ end
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> Cell[Foo[:a, :b]]
12
+ end
@@ -0,0 +1,8 @@
1
+ class Cell[X]
2
+ def set: { -> X } -> self
3
+ def dummy: { -> void } -> self
4
+ end
5
+
6
+ class Foo[X, Y]
7
+ def initialize: (X, Y) -> void
8
+ end
@@ -5,9 +5,9 @@ end
5
5
  Foo.new.a = 1
6
6
  __END__
7
7
  # Classes
8
- class (Anonymous Struct) < Struct
8
+ class AnonymousStruct_generated_1 < Struct
9
9
  attr_accessor a() : untyped
10
10
  end
11
11
 
12
- class Foo < (Anonymous Struct)
12
+ class Foo < AnonymousStruct_generated_1
13
13
  end
@@ -0,0 +1,12 @@
1
+ def foo
2
+ x = begin
3
+ return x
4
+ 1
5
+ end
6
+ end
7
+
8
+ __END__
9
+ # Classes
10
+ class Object
11
+ def foo : -> nil
12
+ end