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,3 @@
1
+ class UnknownMethodAlias
2
+ alias foo bar
3
+ end
@@ -0,0 +1,13 @@
1
+ class UnknownTypeName
2
+ type foo = bar
3
+
4
+ Hello: World
5
+
6
+ include World
7
+
8
+ class Foo < ABC
9
+ end
10
+
11
+ module Bar : ZZZ
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ target :test do
2
+ typing_options :strict
3
+ check "*.rb"
4
+ signature "*.rbs"
5
+ end
@@ -0,0 +1,26 @@
1
+ class BlockBodyTypeMismatch
2
+ def foo: () { () -> Integer } -> void
3
+ end
4
+
5
+ class MethodDefinitionMissing
6
+ def foo: () -> void
7
+ end
8
+
9
+ class UnexpectedDynamicMethod
10
+ def bar: () -> void
11
+ end
12
+
13
+ class UnknownConstantAssigned
14
+ end
15
+
16
+ class UnsatisfiableConstraint
17
+ def foo: [A, B] (A) { (A) -> void } -> B
18
+ end
19
+
20
+ class UnexpectedKeyword
21
+ def foo: (foo: Integer) -> void
22
+ end
23
+
24
+ class MissingKeyword
25
+ def foo: (?String, foo: Integer, ?bar: Symbol) -> void
26
+ end
@@ -0,0 +1 @@
1
+ [123].at("")
@@ -0,0 +1 @@
1
+ BlockBodyTypeMismatch.new.foo { "" }
@@ -0,0 +1,3 @@
1
+ lam = -> (x,y,z) { x + y + z}
2
+
3
+ 123.tap(&lam)
@@ -0,0 +1 @@
1
+ 123.tap { break "" }
@@ -0,0 +1,12 @@
1
+ x = [1, ""].sample
2
+
3
+ case x
4
+ when Integer
5
+ "Integer"
6
+ when String
7
+ "String"
8
+ when nil
9
+ "nil"
10
+ else
11
+ raise "Unexpected value"
12
+ end
@@ -0,0 +1,6 @@
1
+ a = [1,2,3]
2
+
3
+ if 1
4
+ # @type var a: String
5
+ a + ""
6
+ end
@@ -0,0 +1 @@
1
+ [123].at(1,2,3)
@@ -0,0 +1,8 @@
1
+ # @type var x: String
2
+ x = 3
3
+
4
+ # @type const X: String
5
+ X = 123
6
+
7
+ # @type ivar @x: Integer
8
+ @x = :foo
@@ -0,0 +1,11 @@
1
+ class MethodArityMismatch
2
+ # @type method foo: () -> void
3
+ def foo(x)
4
+
5
+ end
6
+
7
+ # @type method bar: (String) -> void
8
+ def self.bar
9
+
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ class MethodBodyTypeMismatch
2
+ # @type method foo: () -> Integer
3
+ def foo
4
+ ""
5
+ end
6
+ end
@@ -0,0 +1,2 @@
1
+ class MethodDefinitionMissing
2
+ end
@@ -0,0 +1,7 @@
1
+ class MethodReturnTypeAnnotationMismatch
2
+ # @type method foo: () -> String
3
+ def foo
4
+ # @type return: Integer
5
+ 123
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ MissingKeyword.new.foo bar: :bar
@@ -0,0 +1 @@
1
+ 1.foo()
@@ -0,0 +1,6 @@
1
+ class ReturnTypeMismatch
2
+ # @type method foo: () -> String
3
+ def foo
4
+ return 30
5
+ end
6
+ end
@@ -0,0 +1,333 @@
1
+ ---
2
+ test:
3
+ argument_type_mismatch.rb:
4
+ diagnostics:
5
+ - |
6
+ argument_type_mismatch.rb:1:9: [error] Cannot pass a value of type `::String` as an argument of type `::int`
7
+ │ ::String <: ::int
8
+ │ ::String <: (::Integer | ::_ToInt)
9
+ │ ::String <: ::Integer
10
+ │ ::Object <: ::Integer
11
+ │ ::BasicObject <: ::Integer
12
+
13
+ │ Diagnostic ID: Ruby::ArgumentTypeMismatch
14
+
15
+ └ [123].at("")
16
+ ~~
17
+ block_body_type_mismatch.rb:
18
+ diagnostics:
19
+ - |
20
+ block_body_type_mismatch.rb:1:30: [error] Cannot allow block body have type `::String` because declared as type `::Integer`
21
+ │ ::String <: ::Integer
22
+ │ ::Object <: ::Integer
23
+ │ ::BasicObject <: ::Integer
24
+
25
+ │ Diagnostic ID: Ruby::BlockBodyTypeMismatch
26
+
27
+ └ BlockBodyTypeMismatch.new.foo { "" }
28
+ ~~~~~~
29
+ block_type_mismatch.rb:
30
+ diagnostics:
31
+ - |
32
+ block_type_mismatch.rb:3:8: [error] Cannot pass a value of type `^(untyped, untyped, untyped) -> untyped` as a block-pass-argument of type `^(::Integer) -> void`
33
+ │ ^(untyped, untyped, untyped) -> untyped <: ^(::Integer) -> void
34
+
35
+ │ Diagnostic ID: Ruby::BlockTypeMismatch
36
+
37
+ └ 123.tap(&lam)
38
+ ~~~~
39
+ break_type_mismatch.rb:
40
+ diagnostics:
41
+ - |
42
+ break_type_mismatch.rb:1:10: [error] Cannot break with a value of type `::String` because type `::Integer` is assumed
43
+ │ ::String <: ::Integer
44
+ │ ::Object <: ::Integer
45
+ │ ::BasicObject <: ::Integer
46
+
47
+ │ Diagnostic ID: Ruby::BreakTypeMismatch
48
+
49
+ └ 123.tap { break "" }
50
+ ~~~~~~~~
51
+ else_on_exhaustive_case.rb:
52
+ diagnostics:
53
+ - |
54
+ else_on_exhaustive_case.rb:11:2: [error] The branch is unreachable because the condition is exhaustive
55
+ │ Diagnostic ID: Ruby::ElseOnExhaustiveCase
56
+
57
+ └ raise "Unexpected value"
58
+ ~~~~~~~~~~~~~~~~~~~~~~~~
59
+ incompatible_annotation.rb:
60
+ diagnostics:
61
+ - |
62
+ incompatible_annotation.rb:5:2: [error] Type annotation about `a` is incompatible since ::String <: ::Array[::Integer] doesn't hold
63
+ │ ::String <: ::Array[::Integer]
64
+ │ ::Object <: ::Array[::Integer]
65
+ │ ::BasicObject <: ::Array[::Integer]
66
+
67
+ │ Diagnostic ID: Ruby::IncompatibleAnnotation
68
+
69
+ └ a + ""
70
+ ~~~~~~
71
+ incompatible_argument.rb:
72
+ diagnostics:
73
+ - |
74
+ incompatible_argument.rb:1:6: [error] Cannot find method `at` of type `::Array[::Integer]` with compatible arity
75
+ │ Method types:
76
+ │ def at: (::int) -> (::Integer | nil)
77
+
78
+ │ Diagnostic ID: Ruby::IncompatibleArguments
79
+
80
+ └ [123].at(1,2,3)
81
+ ~~
82
+ incompatible_assignment.rb:
83
+ diagnostics:
84
+ - |
85
+ incompatible_assignment.rb:2:0: [error] Cannot assign a value of type `::Integer` to a variable of type `::String`
86
+ │ ::Integer <: ::String
87
+ │ ::Numeric <: ::String
88
+ │ ::Object <: ::String
89
+ │ ::BasicObject <: ::String
90
+
91
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
92
+
93
+ └ x = 3
94
+ ~~~~~
95
+ - |
96
+ incompatible_assignment.rb:5:0: [error] Cannot assign a value of type `::Integer` to a constant of type `::String`
97
+ │ ::Integer <: ::String
98
+ │ ::Numeric <: ::String
99
+ │ ::Object <: ::String
100
+ │ ::BasicObject <: ::String
101
+
102
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
103
+
104
+ └ X = 123
105
+ ~~~~~~~
106
+ - |
107
+ incompatible_assignment.rb:8:0: [error] Cannot assign a value of type `::Symbol` to a variable of type `::Integer`
108
+ │ ::Symbol <: ::Integer
109
+ │ ::Object <: ::Integer
110
+ │ ::BasicObject <: ::Integer
111
+
112
+ │ Diagnostic ID: Ruby::IncompatibleAssignment
113
+
114
+ └ @x = :foo
115
+ ~~~~~~~~~
116
+ method_arity_mismatch.rb:
117
+ diagnostics:
118
+ - |
119
+ method_arity_mismatch.rb:3:9: [error] Method parameters are incompatible with declaration `() -> void`
120
+ │ Diagnostic ID: Ruby::MethodArityMismatch
121
+
122
+ └ def foo(x)
123
+ ~~~
124
+ - |
125
+ method_arity_mismatch.rb:8:11: [error] Method parameters are incompatible with declaration `(::String) -> void`
126
+ │ Diagnostic ID: Ruby::MethodArityMismatch
127
+
128
+ └ def self.bar
129
+ ~~~
130
+ method_body_type_mismatch.rb:
131
+ diagnostics:
132
+ - |
133
+ method_body_type_mismatch.rb:3:2: [error] Cannot allow method body have type `::String` because declared as type `::Integer`
134
+ │ ::String <: ::Integer
135
+ │ ::Object <: ::Integer
136
+ │ ::BasicObject <: ::Integer
137
+
138
+ │ Diagnostic ID: Ruby::MethodBodyTypeMismatch
139
+
140
+ └ def foo
141
+ ~~~~~~~
142
+ method_definition_missing.rb:
143
+ diagnostics:
144
+ - |
145
+ method_definition_missing.rb:1:6: [error] Cannot find implementation of method `::MethodDefinitionMissing#foo`
146
+ │ Diagnostic ID: Ruby::MethodDefinitionMissing
147
+
148
+ └ class MethodDefinitionMissing
149
+ ~~~~~~~~~~~~~~~~~~~~~~~
150
+ method_return_type_annotation_mismatch.rb:
151
+ diagnostics:
152
+ - |
153
+ method_return_type_annotation_mismatch.rb:3:2: [error] Annotation `@type return` specifies type `::Integer` where declared as type `::String`
154
+ │ ::Integer <: ::String
155
+ │ ::Numeric <: ::String
156
+ │ ::Object <: ::String
157
+ │ ::BasicObject <: ::String
158
+
159
+ │ Diagnostic ID: Ruby::MethodReturnTypeAnnotationMismatch
160
+
161
+ └ def foo
162
+ ~~~~~~~
163
+ missing_keyword.rb:
164
+ diagnostics:
165
+ - |
166
+ missing_keyword.rb:1:23: [error] Cannot omit required keywords: `foo`
167
+ │ Diagnostic ID: Ruby::MissingKeyword
168
+
169
+ └ MissingKeyword.new.foo bar: :bar
170
+ ~~~~~~~~~
171
+ no_method.rb:
172
+ diagnostics:
173
+ - |
174
+ no_method.rb:1:2: [error] Type `::Integer` does not have method `foo`
175
+ │ Diagnostic ID: Ruby::NoMethod
176
+
177
+ └ 1.foo()
178
+ ~~~
179
+ required_block_missing.rb:
180
+ diagnostics:
181
+ - |
182
+ required_block_missing.rb:1:4: [error] The method cannot be called without a block
183
+ │ Diagnostic ID: Ruby::RequiredBlockMissing
184
+
185
+ └ 123.tap()
186
+ ~~~
187
+ return_type_mismatch.rb:
188
+ diagnostics:
189
+ - |
190
+ return_type_mismatch.rb:4:4: [error] The method cannot return a value of type `::Integer` because declared as type `::String`
191
+ │ ::Integer <: ::String
192
+ │ ::Numeric <: ::String
193
+ │ ::Object <: ::String
194
+ │ ::BasicObject <: ::String
195
+
196
+ │ Diagnostic ID: Ruby::ReturnTypeMismatch
197
+
198
+ └ return 30
199
+ ~~~~~~~~~
200
+ unexpected_block_given.rb:
201
+ diagnostics:
202
+ - |
203
+ unexpected_block_given.rb:1:10: [error] The method cannot be called with a block
204
+ │ Diagnostic ID: Ruby::UnexpectedBlockGiven
205
+
206
+ └ [1].at(1) { 123 }
207
+ ~~~~~~~
208
+ unexpected_dynamic_method.rb:
209
+ diagnostics:
210
+ - |
211
+ unexpected_dynamic_method.rb:1:6: [error] @dynamic annotation contains unknown method name `foo`
212
+ │ Diagnostic ID: Ruby::UnexpectedDynamicMethod
213
+
214
+ └ class UnexpectedDynamicMethod
215
+ ~~~~~~~~~~~~~~~~~~~~~~~
216
+ unexpected_jump.rb:
217
+ diagnostics:
218
+ - |
219
+ unexpected_jump.rb:1:0: [error] Cannot jump from here
220
+ │ Diagnostic ID: Ruby::UnexpectedJump
221
+
222
+ └ break
223
+ ~~~~~
224
+ - |
225
+ unexpected_jump.rb:3:0: [error] Cannot jump from here
226
+ │ Diagnostic ID: Ruby::UnexpectedJump
227
+
228
+ └ next
229
+ ~~~~
230
+ unexpected_jump_value.rb:
231
+ diagnostics:
232
+ - |
233
+ unexpected_jump_value.rb:2:2: [error] The value given to break will be ignored
234
+ │ Diagnostic ID: Ruby::UnexpectedJumpValue
235
+
236
+ └ break 10
237
+ ~~~~~~~~
238
+ unexpected_keyword.rb:
239
+ diagnostics:
240
+ - |
241
+ unexpected_keyword.rb:1:26: [error] Cannot specify unexpected keyword arguments: `bar`
242
+ │ Diagnostic ID: Ruby::UnexpectedKeyword
243
+
244
+ └ UnexpectedKeyword.new.foo(foo: 123, bar: :bar)
245
+ ~~~~~~~~~~~~~~~~~~~
246
+ unexpected_splat.rb:
247
+ diagnostics:
248
+ - |
249
+ unexpected_splat.rb:1:13: [error] Hash splat is given with object other than `Hash[X, Y]`
250
+ │ Diagnostic ID: Ruby::UnexpectedSplat
251
+
252
+ └ { foo: :bar, **123 }
253
+ ~~~~~
254
+ unexpected_yield.rb:
255
+ diagnostics:
256
+ - |
257
+ unexpected_yield.rb:4:4: [error] No block given for `yield`
258
+ │ Diagnostic ID: Ruby::UnexpectedYield
259
+
260
+ └ yield
261
+ ~~~~~
262
+ - |
263
+ unexpected_yield.rb:4:4: [error] Cannot detect the type of the expression
264
+ │ Diagnostic ID: Ruby::FallbackAny
265
+
266
+ └ yield
267
+ ~~~~~
268
+ unknown_constant_assigned.rb:
269
+ diagnostics:
270
+ - |
271
+ unknown_constant_assigned.rb:2:2: [error] Cannot find the declaration of constant `FOO`
272
+ │ Diagnostic ID: Ruby::UnknownConstantAssigned
273
+
274
+ └ FOO = 123
275
+ ~~~
276
+ - |
277
+ unknown_constant_assigned.rb:4:2: [error] Cannot detect the type of the expression
278
+ │ Diagnostic ID: Ruby::FallbackAny
279
+
280
+ └ FOO::BAR = 123
281
+ ~~~
282
+ - |
283
+ unknown_constant_assigned.rb:4:2: [error] Cannot find the declaration of constant `FOO::BAR`
284
+ │ Diagnostic ID: Ruby::UnknownConstantAssigned
285
+
286
+ └ FOO::BAR = 123
287
+ ~~~~~~~~
288
+ - |
289
+ unknown_constant_assigned.rb:6:2: [error] Cannot find the declaration of constant `::FOO`
290
+ │ Diagnostic ID: Ruby::UnknownConstantAssigned
291
+
292
+ └ ::FOO = :foo
293
+ ~~~~~
294
+ unresolved_overloading.rb:
295
+ diagnostics:
296
+ - |
297
+ unresolved_overloading.rb:1:0: [error] Cannot find compatible overloading of method `+` of type `::Integer`
298
+ │ Method types:
299
+ │ def +: (::Integer) -> ::Integer
300
+ │ | (::Float) -> ::Float
301
+ │ | (::Rational) -> ::Rational
302
+ │ | (::Complex) -> ::Complex
303
+
304
+ │ Diagnostic ID: Ruby::UnresolvedOverloading
305
+
306
+ └ 1 + ""
307
+ ~~~~~~
308
+ unsatisfiable_constraint.rb:
309
+ diagnostics:
310
+ - |
311
+ unsatisfiable_constraint.rb:6:4: [error] Type `::String` does not have method `foo`
312
+ │ Diagnostic ID: Ruby::NoMethod
313
+
314
+ └ x.foo()
315
+ ~~~
316
+ - |
317
+ unsatisfiable_constraint.rb:4:0: [error] Unsatisfiable constraint `::Array[untyped] <: A(1) <: ::String` is generated through (A(1)) { (A(1)) -> void } -> B(2)
318
+ │ ::Array[untyped] <: ::String
319
+ │ ::Object <: ::String
320
+ │ ::BasicObject <: ::String
321
+
322
+ │ Diagnostic ID: Ruby::UnsatisfiableConstraint
323
+
324
+ └ test.foo([]) do |x|
325
+ ~~~~~~~~~~~~~~~~~~~
326
+ unsupported_syntax.rb:
327
+ diagnostics:
328
+ - |
329
+ unsupported_syntax.rb:1:0: [error] sclass receiver must be instance type or singleton type, but type given `(::Integer | ::String | nil)`
330
+ │ Diagnostic ID: Ruby::UnsupportedSyntax
331
+
332
+ └ class <<[1, ""].sample
333
+ ~~~~~~~~~~~~~~~~~~~~~~