typeprof 0.1.2 → 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 (129) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +10 -21
  5. data/LICENSE +21 -0
  6. data/README.md +1 -1
  7. data/doc/demo.md +398 -0
  8. data/doc/doc.ja.md +11 -1
  9. data/doc/doc.md +16 -7
  10. data/exe/typeprof +2 -1
  11. data/lib/typeprof.rb +9 -0
  12. data/lib/typeprof/analyzer.rb +455 -364
  13. data/lib/typeprof/arguments.rb +397 -0
  14. data/lib/typeprof/block.rb +133 -0
  15. data/lib/typeprof/builtin.rb +125 -116
  16. data/lib/typeprof/cli.rb +62 -71
  17. data/lib/typeprof/config.rb +114 -0
  18. data/lib/typeprof/container-type.rb +208 -27
  19. data/lib/typeprof/export.rb +201 -96
  20. data/lib/typeprof/import.rb +451 -365
  21. data/lib/typeprof/iseq.rb +43 -2
  22. data/lib/typeprof/method.rb +139 -100
  23. data/lib/typeprof/type.rb +138 -297
  24. data/lib/typeprof/utils.rb +4 -18
  25. data/lib/typeprof/version.rb +3 -0
  26. data/smoke/arguments2.rb +55 -0
  27. data/smoke/array-each3.rb +1 -4
  28. data/smoke/array12.rb +1 -1
  29. data/smoke/array6.rb +1 -0
  30. data/smoke/block-ambiguous.rb +36 -0
  31. data/smoke/block-args1-rest.rb +62 -0
  32. data/smoke/block-args1.rb +59 -0
  33. data/smoke/block-args2-rest.rb +62 -0
  34. data/smoke/block-args2.rb +59 -0
  35. data/smoke/block-args3-rest.rb +73 -0
  36. data/smoke/block-args3.rb +70 -0
  37. data/smoke/block-blockarg.rb +27 -0
  38. data/smoke/block-kwarg.rb +52 -0
  39. data/smoke/block11.rb +1 -1
  40. data/smoke/block13.rb +9 -0
  41. data/smoke/block13.rbs +3 -0
  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/class.rb +2 -0
  53. data/smoke/constant1.rb +13 -5
  54. data/smoke/constant2.rb +2 -0
  55. data/smoke/cvar.rb +1 -0
  56. data/smoke/demo10.rb +1 -1
  57. data/smoke/demo5.rb +3 -0
  58. data/smoke/demo8.rb +2 -2
  59. data/smoke/demo9.rb +1 -3
  60. data/smoke/flow7.rb +1 -7
  61. data/smoke/flow8.rb +13 -0
  62. data/smoke/gvar.rb +1 -1
  63. data/smoke/gvar2.rb +17 -0
  64. data/smoke/gvar2.rbs +1 -0
  65. data/smoke/hash4.rb +1 -1
  66. data/smoke/inheritance2.rb +6 -0
  67. data/smoke/instance_eval.rb +1 -1
  68. data/smoke/int_times.rb +1 -1
  69. data/smoke/ivar3.rb +16 -0
  70. data/smoke/ivar3.rbs +3 -0
  71. data/smoke/keyword3.rb +1 -2
  72. data/smoke/keyword4.rb +1 -1
  73. data/smoke/manual-rbs2.rb +1 -1
  74. data/smoke/manual-rbs3.rb +12 -0
  75. data/smoke/manual-rbs3.rbs +3 -0
  76. data/smoke/module4.rb +5 -0
  77. data/smoke/multiple-superclass.rb +12 -0
  78. data/smoke/next2.rb +1 -1
  79. data/smoke/optional1.rb +1 -1
  80. data/smoke/optional2.rb +1 -1
  81. data/smoke/optional3.rb +10 -0
  82. data/smoke/proc4.rb +1 -1
  83. data/smoke/rbs-alias.rb +9 -0
  84. data/smoke/rbs-alias.rbs +4 -0
  85. data/smoke/rbs-attr.rb +26 -0
  86. data/smoke/rbs-attr.rbs +5 -0
  87. data/smoke/rbs-extend.rb +9 -0
  88. data/smoke/rbs-extend.rbs +7 -0
  89. data/smoke/rbs-interface.rb +24 -0
  90. data/smoke/rbs-interface.rbs +12 -0
  91. data/smoke/rbs-proc1.rb +9 -0
  92. data/smoke/rbs-proc1.rbs +3 -0
  93. data/smoke/rbs-proc2.rb +20 -0
  94. data/smoke/rbs-proc2.rbs +3 -0
  95. data/smoke/rbs-proc3.rb +13 -0
  96. data/smoke/rbs-proc3.rbs +4 -0
  97. data/smoke/rbs-record.rb +17 -0
  98. data/smoke/rbs-record.rbs +4 -0
  99. data/smoke/rbs-tyvar.rb +18 -0
  100. data/smoke/rbs-tyvar.rbs +5 -0
  101. data/smoke/rbs-tyvar2.rb +20 -0
  102. data/smoke/rbs-tyvar2.rbs +9 -0
  103. data/smoke/rbs-tyvar3.rb +25 -0
  104. data/smoke/rbs-tyvar3.rbs +4 -0
  105. data/smoke/rbs-vars.rb +39 -0
  106. data/smoke/rbs-vars.rbs +7 -0
  107. data/smoke/rest1.rb +1 -1
  108. data/smoke/rest2.rb +1 -1
  109. data/smoke/rest3.rb +1 -1
  110. data/smoke/rest5.rb +1 -1
  111. data/smoke/rest6.rb +1 -1
  112. data/smoke/retry1.rb +1 -1
  113. data/smoke/return.rb +1 -1
  114. data/smoke/singleton_method.rb +3 -0
  115. data/smoke/step.rb +1 -1
  116. data/smoke/struct.rb +6 -2
  117. data/smoke/struct3.rb +14 -0
  118. data/smoke/super1.rb +18 -0
  119. data/smoke/symbol-proc.rb +24 -0
  120. data/smoke/union-recv.rb +6 -0
  121. data/smoke/user-demo.rb +15 -0
  122. data/smoke/wrong-extend.rb +1 -0
  123. data/tools/setup-insns-def.rb +1 -1
  124. data/tools/stackprof-wrapper.rb +1 -1
  125. data/typeprof.gemspec +12 -4
  126. metadata +68 -10
  127. data/.gitmodules +0 -6
  128. data/run.sh +0 -3
  129. data/smoke/variadic1.rb.notyet +0 -5
@@ -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
@@ -5,7 +5,7 @@ log($foo)
5
5
 
6
6
  __END__
7
7
  # Global variables
8
- # $foo : Integer | String
8
+ $foo : Integer | String
9
9
 
10
10
  # Classes
11
11
  class Object
@@ -0,0 +1,17 @@
1
+ $foo = 1
2
+
3
+ def log
4
+ $foo
5
+ end
6
+
7
+ __END__
8
+ # Errors
9
+ smoke/gvar2.rb:1: [warning] inconsistent assignment to RBS-declared global variable
10
+
11
+ # Global variables
12
+ #$foo : String
13
+
14
+ # Classes
15
+ class Object
16
+ def log : -> String
17
+ end
@@ -0,0 +1 @@
1
+ $foo : String
@@ -6,5 +6,5 @@ foo
6
6
  __END__
7
7
  # Classes
8
8
  class Object
9
- def foo : -> Hash
9
+ def foo : -> Hash[bot, bot]
10
10
  end
@@ -27,3 +27,9 @@ end
27
27
  class Base < SuperBase
28
28
  def self.foo : -> (A.class | B.class)
29
29
  end
30
+
31
+ class A < Base
32
+ end
33
+
34
+ class B < Base
35
+ 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
 
@@ -0,0 +1,16 @@
1
+ class Foo
2
+ def initialize
3
+ @foo = "str"
4
+ @bar = "str"
5
+ end
6
+ end
7
+
8
+ __END__
9
+ # Errors
10
+ smoke/ivar3.rb:3: [warning] inconsistent assignment to RBS-declared global variable
11
+
12
+ # Classes
13
+ class Foo
14
+ @bar : String
15
+ def initialize : -> String
16
+ end
@@ -0,0 +1,3 @@
1
+ class Foo
2
+ @foo : Integer
3
+ end
@@ -1,4 +1,3 @@
1
- # TODO: foo should accept "s: String | [Integer]"?
2
1
  def foo(n: 42, s: [n])
3
2
  [n, s]
4
3
  end
@@ -8,5 +7,5 @@ foo(n: 42, s: "str")
8
7
  __END__
9
8
  # Classes
10
9
  class Object
11
- def foo : (?n: Integer, ?s: String) -> ([Integer, String | [Integer]])
10
+ def foo : (?n: Integer, ?s: String | [Integer]) -> ([Integer, String | [Integer]])
12
11
  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}) -> nil
10
+ def foo : (**{:n=>Integer, :s=>String}) -> {:n=>Integer, :s=>String}
11
11
  end
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  __END__
14
14
  # Errors
15
- smoke/manual-rbs2.rb:4: [error] undefined method: A::B.class#unknown
15
+ smoke/manual-rbs2.rb:4: [error] undefined method: A::B#unknown
16
16
 
17
17
  # Classes
18
18
  class Object
@@ -0,0 +1,12 @@
1
+ class Foo
2
+ def foo
3
+ @foo = 1
4
+ end
5
+ end
6
+
7
+ __END__
8
+ # Classes
9
+ class Foo
10
+ @foo : Integer
11
+ # def foo : -> Integer
12
+ end
@@ -0,0 +1,3 @@
1
+ class Foo
2
+ def foo: -> Integer
3
+ end
@@ -25,5 +25,10 @@ module M2
25
25
  end
26
26
 
27
27
  module M1
28
+ extend M2
28
29
  def foo : -> :m1_foo
29
30
  end
31
+
32
+ class C
33
+ extend M1
34
+ end
@@ -14,3 +14,15 @@ __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
+
21
+ class A
22
+ end
23
+
24
+ class B
25
+ end
26
+
27
+ class C
28
+ end
@@ -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
@@ -9,5 +9,5 @@ foo("A", "B", "C", "Z")
9
9
  __END__
10
10
  # Classes
11
11
  class Object
12
- def foo : (String, ?String, ?String, String) -> ([String, Integer | String, Integer | String, String])
12
+ def foo : (String, ?Integer | String, ?Integer | String, String) -> ([String, Integer | String, Integer | String, String])
13
13
  end
@@ -11,5 +11,5 @@ foo("A", "B", "C", "D", "E", "Z")
11
11
  __END__
12
12
  # Classes
13
13
  class Object
14
- def foo : (String, ?String, ?String, *String, String) -> ([String, Integer | String, Integer | String, Array[String], String])
14
+ def foo : (String, ?Integer | String, ?Integer | String, *String, String) -> ([String, Integer | String, Integer | String, Array[String], String])
15
15
  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.bar
3
+ end
4
+
5
+ __END__
6
+ # Classes
7
+ class Object
8
+ def log : -> Integer
9
+ end
@@ -0,0 +1,4 @@
1
+ class Foo
2
+ def foo: -> Integer
3
+ alias bar foo
4
+ end
@@ -0,0 +1,26 @@
1
+ def read_test_1
2
+ Foo.new.reader_example
3
+ end
4
+
5
+ def read_test_2
6
+ Foo.new.accessor_example
7
+ end
8
+
9
+ def write_test
10
+ Foo.new.writer_example = 1
11
+ Foo.new.writer_example = "str"
12
+ Foo.new.accessor_example = 1
13
+ Foo.new.accessor_example = "str"
14
+ end
15
+
16
+ __END__
17
+ # Errors
18
+ smoke/rbs-attr.rb:11: [error] failed to resolve overload: Foo#writer_example=
19
+ smoke/rbs-attr.rb:13: [error] failed to resolve overload: Foo#accessor_example=
20
+
21
+ # Classes
22
+ class Object
23
+ def read_test_1 : -> Integer
24
+ def read_test_2 : -> Integer
25
+ def write_test : -> String
26
+ end
@@ -0,0 +1,5 @@
1
+ class Foo
2
+ attr_reader reader_example: Integer
3
+ attr_writer writer_example: Integer
4
+ attr_accessor accessor_example: Integer
5
+ end
@@ -0,0 +1,9 @@
1
+ def log
2
+ C.foo
3
+ end
4
+
5
+ __END__
6
+ # Classes
7
+ class Object
8
+ def log : -> Integer
9
+ end
@@ -0,0 +1,7 @@
1
+ module M
2
+ def foo: -> Integer
3
+ end
4
+
5
+ class C
6
+ extend M
7
+ end
@@ -0,0 +1,24 @@
1
+ def get_module
2
+ C.new.get_module
3
+ end
4
+
5
+ def get_module_foo
6
+ C.new.get_module.foo
7
+ end
8
+
9
+ def get_interface
10
+ C.new.get_interface
11
+ end
12
+
13
+ def get_interface_foo
14
+ C.new.get_interface.foo
15
+ end
16
+
17
+ __END__
18
+ # Classes
19
+ class Object
20
+ def get_module : -> M
21
+ def get_module_foo : -> Integer
22
+ def get_interface : -> _I
23
+ def get_interface_foo : -> Integer
24
+ end
@@ -0,0 +1,12 @@
1
+ module M
2
+ def foo: -> Integer
3
+ end
4
+
5
+ interface _I
6
+ def foo: -> Integer
7
+ end
8
+
9
+ class C
10
+ def get_module : -> M
11
+ def get_interface : -> _I
12
+ 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
@@ -0,0 +1,3 @@
1
+ class Foo
2
+ def foo: (^(Integer) -> Integer) -> String
3
+ end
@@ -0,0 +1,13 @@
1
+ def log(foo)
2
+ foo.get.call
3
+ end
4
+
5
+ foo = Foo.new
6
+ foo.set(1)
7
+ log(foo)
8
+
9
+ __END__
10
+ # Classes
11
+ class Object
12
+ def log : (Foo[Integer]) -> Integer
13
+ end
@@ -0,0 +1,4 @@
1
+ class Foo[X]
2
+ def set: (X) -> void
3
+ def get: -> ^() -> X
4
+ end
@@ -0,0 +1,17 @@
1
+ def test_foo
2
+ h = C.new.foo
3
+ return h[:aaa], h[:bbb]
4
+ end
5
+
6
+ def test_bar
7
+ h = { }
8
+ h[:a] = 42
9
+ C.new.bar(h)
10
+ end
11
+
12
+ __END__
13
+ # Classes
14
+ class Object
15
+ def test_foo : -> [Integer, String]
16
+ def test_bar : -> Integer
17
+ end
@@ -0,0 +1,4 @@
1
+ class C
2
+ def foo: -> { aaa: Integer, bbb: String }
3
+ def bar: ({ a: Integer }) -> Integer
4
+ end
@@ -0,0 +1,18 @@
1
+ def foo
2
+ cell = Cell.new("str")
3
+ cell.set_elem(42) if rand < 0.5
4
+ cell
5
+ end
6
+
7
+ def bar
8
+ foo.get_elem
9
+ end
10
+
11
+ bar
12
+
13
+ __END__
14
+ # Classes
15
+ class Object
16
+ def foo : -> (Cell[Integer | String])
17
+ def bar : -> (Integer | String)
18
+ end