steep 0.39.0 → 0.40.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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/CHANGELOG.md +6 -0
  4. data/Rakefile +5 -2
  5. data/bin/output_rebaseline.rb +49 -0
  6. data/bin/output_test.rb +93 -0
  7. data/lib/steep.rb +8 -3
  8. data/lib/steep/cli.rb +1 -1
  9. data/lib/steep/diagnostic/helper.rb +17 -0
  10. data/lib/steep/diagnostic/lsp_formatter.rb +16 -0
  11. data/lib/steep/diagnostic/ruby.rb +623 -0
  12. data/lib/steep/diagnostic/signature.rb +224 -0
  13. data/lib/steep/drivers/annotations.rb +13 -6
  14. data/lib/steep/drivers/check.rb +83 -60
  15. data/lib/steep/drivers/diagnostic_printer.rb +94 -0
  16. data/lib/steep/drivers/stats.rb +125 -29
  17. data/lib/steep/drivers/trace_printer.rb +5 -1
  18. data/lib/steep/drivers/validate.rb +13 -6
  19. data/lib/steep/drivers/watch.rb +26 -9
  20. data/lib/steep/drivers/worker.rb +5 -0
  21. data/lib/steep/project/options.rb +4 -4
  22. data/lib/steep/project/signature_file.rb +8 -2
  23. data/lib/steep/project/stats_calculator.rb +80 -0
  24. data/lib/steep/project/target.rb +64 -53
  25. data/lib/steep/range_extension.rb +29 -0
  26. data/lib/steep/server/base_worker.rb +42 -4
  27. data/lib/steep/server/code_worker.rb +37 -24
  28. data/lib/steep/server/interaction_worker.rb +1 -0
  29. data/lib/steep/server/master.rb +268 -82
  30. data/lib/steep/server/signature_worker.rb +7 -59
  31. data/lib/steep/server/worker_process.rb +9 -9
  32. data/lib/steep/signature/validator.rb +33 -9
  33. data/lib/steep/type_construction.rb +276 -194
  34. data/lib/steep/version.rb +1 -1
  35. data/smoke/alias/a.rb +0 -3
  36. data/smoke/alias/b.rb +0 -1
  37. data/smoke/alias/c.rb +0 -2
  38. data/smoke/alias/test.yaml +73 -0
  39. data/smoke/and/a.rb +0 -3
  40. data/smoke/and/test.yaml +24 -0
  41. data/smoke/array/a.rb +0 -3
  42. data/smoke/array/b.rb +0 -2
  43. data/smoke/array/c.rb +0 -1
  44. data/smoke/array/test.yaml +80 -0
  45. data/smoke/block/a.rb +0 -2
  46. data/smoke/block/b.rb +0 -2
  47. data/smoke/block/d.rb +0 -4
  48. data/smoke/block/test.yaml +96 -0
  49. data/smoke/broken/Steepfile +5 -0
  50. data/smoke/broken/broken.rb +0 -0
  51. data/smoke/broken/broken.rbs +0 -0
  52. data/smoke/broken/test.yaml +6 -0
  53. data/smoke/case/a.rb +0 -3
  54. data/smoke/case/test.yaml +36 -0
  55. data/smoke/class/a.rb +0 -3
  56. data/smoke/class/c.rb +0 -1
  57. data/smoke/class/f.rb +0 -1
  58. data/smoke/class/g.rb +0 -2
  59. data/smoke/class/i.rb +0 -2
  60. data/smoke/class/test.yaml +89 -0
  61. data/smoke/const/a.rb +0 -3
  62. data/smoke/const/b.rb +7 -0
  63. data/smoke/const/b.rbs +5 -0
  64. data/smoke/const/test.yaml +96 -0
  65. data/smoke/diagnostics-rbs-duplicated/Steepfile +5 -0
  66. data/smoke/diagnostics-rbs-duplicated/a.rbs +5 -0
  67. data/smoke/diagnostics-rbs-duplicated/test.yaml +10 -0
  68. data/smoke/diagnostics-rbs/Steepfile +5 -0
  69. data/smoke/diagnostics-rbs/duplicated-method-definition.rbs +20 -0
  70. data/smoke/diagnostics-rbs/generic-parameter-mismatch.rbs +7 -0
  71. data/smoke/diagnostics-rbs/invalid-method-overload.rbs +3 -0
  72. data/smoke/diagnostics-rbs/invalid-type-application.rbs +7 -0
  73. data/smoke/diagnostics-rbs/invalid_variance_annotation.rbs +3 -0
  74. data/smoke/diagnostics-rbs/recursive-alias.rbs +5 -0
  75. data/smoke/diagnostics-rbs/recursive-class.rbs +8 -0
  76. data/smoke/diagnostics-rbs/superclass-mismatch.rbs +7 -0
  77. data/smoke/diagnostics-rbs/test.yaml +142 -0
  78. data/smoke/diagnostics-rbs/unknown-method-alias.rbs +3 -0
  79. data/smoke/diagnostics-rbs/unknown-type-name.rbs +13 -0
  80. data/smoke/diagnostics/Steepfile +5 -0
  81. data/smoke/diagnostics/a.rbs +26 -0
  82. data/smoke/diagnostics/argument_type_mismatch.rb +1 -0
  83. data/smoke/diagnostics/block_body_type_mismatch.rb +1 -0
  84. data/smoke/diagnostics/block_type_mismatch.rb +3 -0
  85. data/smoke/diagnostics/break_type_mismatch.rb +1 -0
  86. data/smoke/diagnostics/else_on_exhaustive_case.rb +12 -0
  87. data/smoke/diagnostics/incompatible_annotation.rb +6 -0
  88. data/smoke/diagnostics/incompatible_argument.rb +1 -0
  89. data/smoke/diagnostics/incompatible_assignment.rb +8 -0
  90. data/smoke/diagnostics/method_arity_mismatch.rb +11 -0
  91. data/smoke/diagnostics/method_body_type_mismatch.rb +6 -0
  92. data/smoke/diagnostics/method_definition_missing.rb +2 -0
  93. data/smoke/diagnostics/method_return_type_annotation_mismatch.rb +7 -0
  94. data/smoke/diagnostics/missing_keyword.rb +1 -0
  95. data/smoke/diagnostics/no_method.rb +1 -0
  96. data/smoke/diagnostics/required_block_missing.rb +1 -0
  97. data/smoke/diagnostics/return_type_mismatch.rb +6 -0
  98. data/smoke/diagnostics/test.yaml +333 -0
  99. data/smoke/diagnostics/unexpected_block_given.rb +1 -0
  100. data/smoke/diagnostics/unexpected_dynamic_method.rb +3 -0
  101. data/smoke/diagnostics/unexpected_jump.rb +4 -0
  102. data/smoke/diagnostics/unexpected_jump_value.rb +3 -0
  103. data/smoke/diagnostics/unexpected_keyword.rb +1 -0
  104. data/smoke/diagnostics/unexpected_splat.rb +1 -0
  105. data/smoke/diagnostics/unexpected_yield.rb +6 -0
  106. data/smoke/diagnostics/unknown_constant_assigned.rb +7 -0
  107. data/smoke/diagnostics/unresolved_overloading.rb +1 -0
  108. data/smoke/diagnostics/unsatisfiable_constraint.rb +7 -0
  109. data/smoke/diagnostics/unsupported_syntax.rb +2 -0
  110. data/smoke/dstr/a.rb +0 -1
  111. data/smoke/dstr/test.yaml +10 -0
  112. data/smoke/ensure/a.rb +0 -4
  113. data/smoke/ensure/test.yaml +47 -0
  114. data/smoke/enumerator/a.rb +0 -6
  115. data/smoke/enumerator/b.rb +0 -3
  116. data/smoke/enumerator/test.yaml +100 -0
  117. data/smoke/extension/a.rb +0 -1
  118. data/smoke/extension/b.rb +0 -2
  119. data/smoke/extension/c.rb +0 -1
  120. data/smoke/extension/test.yaml +50 -0
  121. data/smoke/hash/b.rb +0 -1
  122. data/smoke/hash/c.rb +0 -3
  123. data/smoke/hash/d.rb +0 -1
  124. data/smoke/hash/e.rb +0 -1
  125. data/smoke/hash/test.yaml +62 -0
  126. data/smoke/hello/hello.rb +0 -2
  127. data/smoke/hello/test.yaml +18 -0
  128. data/smoke/if/a.rb +0 -2
  129. data/smoke/if/test.yaml +27 -0
  130. data/smoke/implements/a.rb +0 -2
  131. data/smoke/implements/test.yaml +16 -0
  132. data/smoke/initialize/test.yaml +4 -0
  133. data/smoke/integer/a.rb +0 -7
  134. data/smoke/integer/test.yaml +66 -0
  135. data/smoke/interface/a.rb +0 -2
  136. data/smoke/interface/test.yaml +16 -0
  137. data/smoke/kwbegin/a.rb +0 -1
  138. data/smoke/kwbegin/test.yaml +14 -0
  139. data/smoke/lambda/a.rb +1 -4
  140. data/smoke/lambda/test.yaml +28 -0
  141. data/smoke/literal/a.rb +0 -5
  142. data/smoke/literal/b.rb +0 -2
  143. data/smoke/literal/test.yaml +79 -0
  144. data/smoke/map/test.yaml +4 -0
  145. data/smoke/method/a.rb +0 -5
  146. data/smoke/method/b.rb +0 -1
  147. data/smoke/method/test.yaml +71 -0
  148. data/smoke/module/a.rb +0 -2
  149. data/smoke/module/b.rb +0 -2
  150. data/smoke/module/c.rb +0 -1
  151. data/smoke/module/d.rb +0 -1
  152. data/smoke/module/f.rb +0 -2
  153. data/smoke/module/test.yaml +51 -0
  154. data/smoke/regexp/a.rb +0 -38
  155. data/smoke/regexp/b.rb +0 -26
  156. data/smoke/regexp/test.yaml +372 -0
  157. data/smoke/regression/set_divide.rb +0 -4
  158. data/smoke/regression/test.yaml +38 -0
  159. data/smoke/rescue/a.rb +0 -5
  160. data/smoke/rescue/test.yaml +60 -0
  161. data/smoke/self/a.rb +0 -2
  162. data/smoke/self/test.yaml +16 -0
  163. data/smoke/skip/skip.rb +0 -2
  164. data/smoke/skip/test.yaml +16 -0
  165. data/smoke/stdout/test.yaml +4 -0
  166. data/smoke/super/a.rb +0 -4
  167. data/smoke/super/test.yaml +52 -0
  168. data/smoke/toplevel/a.rb +0 -1
  169. data/smoke/toplevel/test.yaml +12 -0
  170. data/smoke/tsort/a.rb +0 -3
  171. data/smoke/tsort/test.yaml +32 -0
  172. data/smoke/type_case/a.rb +0 -4
  173. data/smoke/type_case/test.yaml +33 -0
  174. data/smoke/yield/a.rb +0 -3
  175. data/smoke/yield/b.rb +6 -0
  176. data/smoke/yield/test.yaml +49 -0
  177. data/steep.gemspec +3 -3
  178. metadata +108 -17
  179. data/bin/smoke_runner.rb +0 -139
  180. data/lib/steep/drivers/signature_error_printer.rb +0 -25
  181. data/lib/steep/errors.rb +0 -594
  182. data/lib/steep/signature/errors.rb +0 -128
  183. data/lib/steep/type_assignability.rb +0 -367
@@ -0,0 +1 @@
1
+ [1].at(1) { 123 }
@@ -0,0 +1,3 @@
1
+ class UnexpectedDynamicMethod
2
+ # @dynamic foo, bar
3
+ end
@@ -0,0 +1,4 @@
1
+ break
2
+
3
+ next
4
+
@@ -0,0 +1,3 @@
1
+ while true
2
+ break 10
3
+ end
@@ -0,0 +1 @@
1
+ UnexpectedKeyword.new.foo(foo: 123, bar: :bar)
@@ -0,0 +1 @@
1
+ { foo: :bar, **123 }
@@ -0,0 +1,6 @@
1
+ class UnexpectedYield
2
+ # @type method foo: () -> void
3
+ def foo
4
+ yield
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ class UnknownConstantAssigned
2
+ FOO = 123
3
+
4
+ FOO::BAR = 123
5
+
6
+ ::FOO = :foo
7
+ end
@@ -0,0 +1,7 @@
1
+
2
+ test = UnsatisfiableConstraint.new
3
+
4
+ test.foo([]) do |x|
5
+ # @type var x: String
6
+ x.foo()
7
+ end
@@ -0,0 +1,2 @@
1
+ class <<[1, ""].sample
2
+ end
@@ -2,5 +2,4 @@
2
2
 
3
3
  a = 0
4
4
 
5
- # !expects NoMethodError: type=::Integer, method=foo
6
5
  b = "Hello #{a.foo} world!"
@@ -0,0 +1,10 @@
1
+ ---
2
+ test:
3
+ a.rb:
4
+ diagnostics:
5
+ - |
6
+ a.rb:5:15: [error] Type `::Integer` does not have method `foo`
7
+ │ Diagnostic ID: Ruby::NoMethod
8
+
9
+ └ b = "Hello #{a.foo} world!"
10
+ ~~~
@@ -1,22 +1,18 @@
1
1
  # @type var a: Integer
2
2
  # @type var b: Integer
3
3
 
4
- # !expects IncompatibleAssignment: lhs_type=::Integer, rhs_type=::String
5
4
  a = begin
6
5
  'foo'
7
6
  ensure
8
- # !expects IncompatibleAssignment: lhs_type=::Integer, rhs_type=::Symbol
9
7
  b = :foo
10
8
  1
11
9
  end
12
10
 
13
11
  # @type method foo: (String) -> String
14
12
 
15
- # !expects MethodBodyTypeMismatch: method=foo, expected=::String, actual=::Integer
16
13
  def foo(a)
17
14
  10
18
15
  ensure
19
- # !expects* UnresolvedOverloading: receiver=::Integer, method_name=+,
20
16
  1 + '1'
21
17
  a
22
18
  end
@@ -0,0 +1,47 @@
1
+ ---
2
+ test:
3
+ a.rb:
4
+ diagnostics:
5
+ - |
6
+ a.rb:7:6: [error] Cannot assign a value of type `::Symbol` to a variable of type `::Integer`
7
+ │ ::Symbol <: ::Integer
8
+ │ ::Object <: ::Integer
9
+ │ ::BasicObject <: ::Integer
10
+
11
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
12
+
13
+ └ b = :foo
14
+ ~~~~~~~~
15
+ - |
16
+ a.rb:4:0: [error] Cannot assign a value of type `::String` to a variable of type `::Integer`
17
+ │ ::String <: ::Integer
18
+ │ ::Object <: ::Integer
19
+ │ ::BasicObject <: ::Integer
20
+
21
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
22
+
23
+ └ a = begin
24
+ ~~~~~~~~~
25
+ - |
26
+ a.rb:16:2: [error] Cannot find compatible overloading of method `+` of type `::Integer`
27
+ │ Method types:
28
+ │ def +: (::Integer) -> ::Integer
29
+ │ | (::Float) -> ::Float
30
+ │ | (::Rational) -> ::Rational
31
+ │ | (::Complex) -> ::Complex
32
+
33
+ │ Diagnostic ID: Ruby::UnresolvedOverloading
34
+
35
+ └ 1 + '1'
36
+ ~~~~~~~
37
+ - |
38
+ a.rb:13:0: [error] Cannot allow method body have type `::Integer` because declared as type `::String`
39
+ │ ::Integer <: ::String
40
+ │ ::Numeric <: ::String
41
+ │ ::Object <: ::String
42
+ │ ::BasicObject <: ::String
43
+
44
+ │ Diagnostic ID: Ruby::MethodBodyTypeMismatch
45
+
46
+ └ def foo(a)
47
+ ~~~~~~~~~~
@@ -2,18 +2,12 @@
2
2
 
3
3
  a = [1]
4
4
 
5
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::String
6
5
  hash = a.each.with_object("") do |x, y|
7
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::Integer
8
6
  hash = x
9
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::String
10
7
  hash = y
11
8
  end
12
9
 
13
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::Array[::Integer]
14
10
  hash = a.each.with_index do |x, y|
15
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::Integer
16
11
  hash = x
17
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, ::String], rhs_type=::Integer
18
12
  hash = y
19
13
  end
@@ -3,20 +3,17 @@
3
3
 
4
4
  a = [1]
5
5
 
6
- # !expects* UnresolvedOverloading:
7
6
  b = a.each.with_object([]) do |i, xs|
8
7
  # @type var xs: String
9
8
  xs << i.to_s
10
9
  end
11
10
 
12
- # !expects IncompatibleAssignment: lhs_type=::Array[::Integer], rhs_type=::Array[::String]
13
11
  c = a.each.with_object([]) do |i, xs|
14
12
  # @type var xs: Array[String]
15
13
  xs << i.to_s
16
14
  end
17
15
 
18
16
  # @type var d: String
19
- # !expects IncompatibleAssignment: lhs_type=::String, rhs_type=::Array[untyped]
20
17
  d = a.each.with_object([]) do |i, xs|
21
18
  xs << i.to_s
22
19
  end
@@ -0,0 +1,100 @@
1
+ ---
2
+ test:
3
+ a.rb:
4
+ diagnostics:
5
+ - |
6
+ a.rb:6:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::Hash[::Symbol, ::String]`
7
+ │ ::Integer <: ::Hash[::Symbol, ::String]
8
+ │ ::Numeric <: ::Hash[::Symbol, ::String]
9
+ │ ::Object <: ::Hash[::Symbol, ::String]
10
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
11
+
12
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
13
+
14
+ └ hash = x
15
+ ~~~~~~~~
16
+ - |
17
+ a.rb:7:2: [error] Cannot assign a value of type `::String` to a variable of type `::Hash[::Symbol, ::String]`
18
+ │ ::String <: ::Hash[::Symbol, ::String]
19
+ │ ::Object <: ::Hash[::Symbol, ::String]
20
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
21
+
22
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
23
+
24
+ └ hash = y
25
+ ~~~~~~~~
26
+ - |
27
+ a.rb:5:0: [error] Cannot assign a value of type `::String` to a variable of type `::Hash[::Symbol, ::String]`
28
+ │ ::String <: ::Hash[::Symbol, ::String]
29
+ │ ::Object <: ::Hash[::Symbol, ::String]
30
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
31
+
32
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
33
+
34
+ └ hash = a.each.with_object("") do |x, y|
35
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
36
+ - |
37
+ a.rb:11:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::Hash[::Symbol, ::String]`
38
+ │ ::Integer <: ::Hash[::Symbol, ::String]
39
+ │ ::Numeric <: ::Hash[::Symbol, ::String]
40
+ │ ::Object <: ::Hash[::Symbol, ::String]
41
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
42
+
43
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
44
+
45
+ └ hash = x
46
+ ~~~~~~~~
47
+ - |
48
+ a.rb:12:2: [error] Cannot assign a value of type `::Integer` to a variable of type `::Hash[::Symbol, ::String]`
49
+ │ ::Integer <: ::Hash[::Symbol, ::String]
50
+ │ ::Numeric <: ::Hash[::Symbol, ::String]
51
+ │ ::Object <: ::Hash[::Symbol, ::String]
52
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
53
+
54
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
55
+
56
+ └ hash = y
57
+ ~~~~~~~~
58
+ - |
59
+ a.rb:10:0: [error] Cannot assign a value of type `::Array[::Integer]` to a variable of type `::Hash[::Symbol, ::String]`
60
+ │ ::Array[::Integer] <: ::Hash[::Symbol, ::String]
61
+ │ ::Object <: ::Hash[::Symbol, ::String]
62
+ │ ::BasicObject <: ::Hash[::Symbol, ::String]
63
+
64
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
65
+
66
+ └ hash = a.each.with_index do |x, y|
67
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
68
+ b.rb:
69
+ diagnostics:
70
+ - |
71
+ b.rb:6:4: [error] Cannot find compatible overloading of method `with_object` of type `::Enumerator[::Integer, ::Array[::Integer]]`
72
+ │ Method types:
73
+ │ def with_object: [U] (U) { (::Integer, U) -> untyped } -> U
74
+ │ | [U] (U) -> ::Enumerator[[::Integer, U], ::Array[::Integer]]
75
+
76
+ │ Diagnostic ID: Ruby::UnresolvedOverloading
77
+
78
+ └ b = a.each.with_object([]) do |i, xs|
79
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
80
+ - |
81
+ b.rb:11:0: [error] Cannot assign a value of type `::Array[::String]` to a variable of type `::Array[::Integer]`
82
+ │ ::Array[::String] <: ::Array[::Integer]
83
+ │ ::String <: ::Integer
84
+ │ ::Object <: ::Integer
85
+ │ ::BasicObject <: ::Integer
86
+
87
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
88
+
89
+ └ c = a.each.with_object([]) do |i, xs|
90
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
91
+ - |
92
+ b.rb:17:0: [error] Cannot assign a value of type `::Array[untyped]` to a variable of type `::String`
93
+ │ ::Array[untyped] <: ::String
94
+ │ ::Object <: ::String
95
+ │ ::BasicObject <: ::String
96
+
97
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
98
+
99
+ └ d = a.each.with_object([]) do |i, xs|
100
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -5,7 +5,6 @@ foo = (_ = nil)
5
5
  foo.try do |x|
6
6
  # @type var string: String
7
7
 
8
- # !expects IncompatibleAssignment: lhs_type=::String, rhs_type=::Foo
9
8
  string = x
10
9
  end
11
10
 
@@ -4,9 +4,7 @@ foo = (_ = nil)
4
4
  # @type var integer: Integer
5
5
 
6
6
  # Foo#f returns String because overridden
7
- # !expects IncompatibleAssignment: lhs_type=::Integer, rhs_type=::String
8
7
  integer = foo.f()
9
8
 
10
9
  # String#f returns Object because Object(X)#f is used
11
- # !expects IncompatibleAssignment: lhs_type=::Integer, rhs_type=::Object
12
10
  integer = "".f()
@@ -3,7 +3,6 @@ class Foo
3
3
 
4
4
  def f()
5
5
  # @type var string: String
6
- # !expects IncompatibleAssignment: lhs_type=::String, rhs_type=::Object
7
6
  string = super()
8
7
  string
9
8
  end
@@ -0,0 +1,50 @@
1
+ ---
2
+ test:
3
+ a.rb:
4
+ diagnostics:
5
+ - |
6
+ a.rb:8:2: [error] Cannot assign a value of type `::Foo` to a variable of type `::String`
7
+ │ ::Foo <: ::String
8
+ │ ::Object <: ::String
9
+ │ ::BasicObject <: ::String
10
+
11
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
12
+
13
+ └ string = x
14
+ ~~~~~~~~~~
15
+ b.rb:
16
+ diagnostics:
17
+ - |
18
+ b.rb:7:0: [error] Cannot assign a value of type `::String` to a variable of type `::Integer`
19
+ │ ::String <: ::Integer
20
+ │ ::Object <: ::Integer
21
+ │ ::BasicObject <: ::Integer
22
+
23
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
24
+
25
+ └ integer = foo.f()
26
+ ~~~~~~~~~~~~~~~~~
27
+ - |
28
+ b.rb:10:0: [error] Cannot assign a value of type `::Object` to a variable of type `::Integer`
29
+ │ ::Object <: ::Integer
30
+ │ ::BasicObject <: ::Integer
31
+
32
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
33
+
34
+ └ integer = "".f()
35
+ ~~~~~~~~~~~~~~~~
36
+ c.rb:
37
+ diagnostics:
38
+ - |
39
+ c.rb:6:4: [error] Cannot assign a value of type `::Object` to a variable of type `::String`
40
+ │ ::Object <: ::String
41
+ │ ::BasicObject <: ::String
42
+
43
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
44
+
45
+ └ string = super()
46
+ ~~~~~~~~~~~~~~~~
47
+ d.rb:
48
+ diagnostics: []
49
+ e.rb:
50
+ diagnostics: []
@@ -3,5 +3,4 @@
3
3
  x = { foo: "foo" }
4
4
  x = { foo: nil }
5
5
 
6
- # !expects IncompatibleAssignment: lhs_type=::Hash[::Symbol, (::String | nil)], rhs_type=::Hash[::Symbol, ::Integer]
7
6
  x = { foo: 3 }
@@ -2,14 +2,11 @@
2
2
  params = _ = nil
3
3
 
4
4
  id = params[:id]
5
- # !expects NoMethodError: type=::Integer, method=abcdefg
6
5
  id.abcdefg
7
6
 
8
7
  name = params[:name]
9
- # !expects NoMethodError: type=::String, method=abcdefg
10
8
  name.abcdefg
11
9
 
12
- # !expects NoMethodError: type=(::Integer | ::String), method=abcdefg
13
10
  params[(_=nil) ? :id : :name].abcdefg
14
11
 
15
12
  # @type var controller: Controller
@@ -2,5 +2,4 @@
2
2
 
3
3
  params = { id: 30, name: "Matz" }
4
4
 
5
- # !expects IncompatibleAssignment: lhs_type={ :id => ::Integer, :name => ::String }, rhs_type={ :email => ::String, :id => ::String, :name => ::String }
6
5
  params = { id: "30", name: "foo", email: "matsumoto@soutaro.com" }
@@ -1,2 +1 @@
1
- # !expects NoMethodError: type=::Integer, method=fffffffffffff
2
1
  Foo.new.get({ foo: 3 }).fffffffffffff
@@ -0,0 +1,62 @@
1
+ ---
2
+ test:
3
+ a.rb:
4
+ diagnostics: []
5
+ b.rb:
6
+ diagnostics:
7
+ - |
8
+ b.rb:6:0: [error] Cannot assign a value of type `::Hash[::Symbol, ::Integer]` to a variable of type `::Hash[::Symbol, (::String | nil)]`
9
+ │ ::Hash[::Symbol, ::Integer] <: ::Hash[::Symbol, (::String | nil)]
10
+ │ ::Integer <: (::String | nil)
11
+ │ ::Integer <: ::String
12
+ │ ::Numeric <: ::String
13
+ │ ::Object <: ::String
14
+ │ ::BasicObject <: ::String
15
+
16
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
17
+
18
+ └ x = { foo: 3 }
19
+ ~~~~~~~~~~~~~~
20
+ c.rb:
21
+ diagnostics:
22
+ - |
23
+ c.rb:5:3: [error] Type `::Integer` does not have method `abcdefg`
24
+ │ Diagnostic ID: Ruby::NoMethod
25
+
26
+ └ id.abcdefg
27
+ ~~~~~~~
28
+ - |
29
+ c.rb:8:5: [error] Type `::String` does not have method `abcdefg`
30
+ │ Diagnostic ID: Ruby::NoMethod
31
+
32
+ └ name.abcdefg
33
+ ~~~~~~~
34
+ - |
35
+ c.rb:10:30: [error] Type `(::Integer | ::String)` does not have method `abcdefg`
36
+ │ Diagnostic ID: Ruby::NoMethod
37
+
38
+ └ params[(_=nil) ? :id : :name].abcdefg
39
+ ~~~~~~~
40
+ d.rb:
41
+ diagnostics:
42
+ - |
43
+ d.rb:5:0: [error] Cannot assign a value of type `{ :email => ::String, :id => ::String, :name => ::String }` to a variable of type `{ :id => ::Integer, :name => ::String }`
44
+ │ { :email => ::String, :id => ::String, :name => ::String } <: { :id => ::Integer, :name => ::String }
45
+ │ ::String <: ::Integer
46
+ │ ::Object <: ::Integer
47
+ │ ::BasicObject <: ::Integer
48
+
49
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
50
+
51
+ └ params = { id: "30", name: "foo", email: "matsumoto@soutaro.com" }
52
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53
+ e.rb:
54
+ diagnostics:
55
+ - |
56
+ e.rb:1:24: [error] Type `::Integer` does not have method `fffffffffffff`
57
+ │ Diagnostic ID: Ruby::NoMethod
58
+
59
+ └ Foo.new.get({ foo: 3 }).fffffffffffff
60
+ ~~~~~~~~~~~~~
61
+ f.rb:
62
+ diagnostics: []