steep-activesupport-4 1.9.3

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 (164) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.gitmodules +0 -0
  4. data/CHANGELOG.md +1032 -0
  5. data/LICENSE +21 -0
  6. data/README.md +260 -0
  7. data/Rakefile +227 -0
  8. data/Steepfile +68 -0
  9. data/bin/console +14 -0
  10. data/bin/generate-diagnostics-docs.rb +112 -0
  11. data/bin/mem_graph.rb +67 -0
  12. data/bin/mem_prof.rb +102 -0
  13. data/bin/output_rebaseline.rb +34 -0
  14. data/bin/output_test.rb +60 -0
  15. data/bin/rbs +20 -0
  16. data/bin/rbs-inline +19 -0
  17. data/bin/setup +9 -0
  18. data/bin/stackprof_test.rb +19 -0
  19. data/bin/steep +19 -0
  20. data/bin/steep-check.rb +251 -0
  21. data/bin/steep-prof +16 -0
  22. data/doc/narrowing.md +195 -0
  23. data/doc/shape.md +194 -0
  24. data/exe/steep +18 -0
  25. data/guides/README.md +5 -0
  26. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +126 -0
  27. data/guides/src/getting-started/getting-started.md +163 -0
  28. data/guides/src/nil-optional/nil-optional.md +195 -0
  29. data/lib/steep/annotation_parser.rb +199 -0
  30. data/lib/steep/ast/annotation/collection.rb +172 -0
  31. data/lib/steep/ast/annotation.rb +137 -0
  32. data/lib/steep/ast/builtin.rb +104 -0
  33. data/lib/steep/ast/ignore.rb +148 -0
  34. data/lib/steep/ast/node/type_application.rb +88 -0
  35. data/lib/steep/ast/node/type_assertion.rb +81 -0
  36. data/lib/steep/ast/types/any.rb +35 -0
  37. data/lib/steep/ast/types/boolean.rb +45 -0
  38. data/lib/steep/ast/types/bot.rb +35 -0
  39. data/lib/steep/ast/types/class.rb +43 -0
  40. data/lib/steep/ast/types/factory.rb +557 -0
  41. data/lib/steep/ast/types/helper.rb +40 -0
  42. data/lib/steep/ast/types/instance.rb +42 -0
  43. data/lib/steep/ast/types/intersection.rb +93 -0
  44. data/lib/steep/ast/types/literal.rb +59 -0
  45. data/lib/steep/ast/types/logic.rb +84 -0
  46. data/lib/steep/ast/types/name.rb +128 -0
  47. data/lib/steep/ast/types/nil.rb +41 -0
  48. data/lib/steep/ast/types/proc.rb +117 -0
  49. data/lib/steep/ast/types/record.rb +79 -0
  50. data/lib/steep/ast/types/self.rb +43 -0
  51. data/lib/steep/ast/types/shared_instance.rb +11 -0
  52. data/lib/steep/ast/types/top.rb +35 -0
  53. data/lib/steep/ast/types/tuple.rb +60 -0
  54. data/lib/steep/ast/types/union.rb +97 -0
  55. data/lib/steep/ast/types/var.rb +65 -0
  56. data/lib/steep/ast/types/void.rb +35 -0
  57. data/lib/steep/cli.rb +401 -0
  58. data/lib/steep/diagnostic/deprecated/else_on_exhaustive_case.rb +20 -0
  59. data/lib/steep/diagnostic/deprecated/unknown_constant_assigned.rb +28 -0
  60. data/lib/steep/diagnostic/helper.rb +18 -0
  61. data/lib/steep/diagnostic/lsp_formatter.rb +78 -0
  62. data/lib/steep/diagnostic/result_printer2.rb +48 -0
  63. data/lib/steep/diagnostic/ruby.rb +1221 -0
  64. data/lib/steep/diagnostic/signature.rb +570 -0
  65. data/lib/steep/drivers/annotations.rb +52 -0
  66. data/lib/steep/drivers/check.rb +339 -0
  67. data/lib/steep/drivers/checkfile.rb +210 -0
  68. data/lib/steep/drivers/diagnostic_printer.rb +105 -0
  69. data/lib/steep/drivers/init.rb +66 -0
  70. data/lib/steep/drivers/langserver.rb +56 -0
  71. data/lib/steep/drivers/print_project.rb +113 -0
  72. data/lib/steep/drivers/stats.rb +203 -0
  73. data/lib/steep/drivers/utils/driver_helper.rb +143 -0
  74. data/lib/steep/drivers/utils/jobs_option.rb +26 -0
  75. data/lib/steep/drivers/vendor.rb +27 -0
  76. data/lib/steep/drivers/watch.rb +194 -0
  77. data/lib/steep/drivers/worker.rb +58 -0
  78. data/lib/steep/equatable.rb +23 -0
  79. data/lib/steep/expectations.rb +228 -0
  80. data/lib/steep/index/rbs_index.rb +350 -0
  81. data/lib/steep/index/signature_symbol_provider.rb +185 -0
  82. data/lib/steep/index/source_index.rb +167 -0
  83. data/lib/steep/interface/block.rb +103 -0
  84. data/lib/steep/interface/builder.rb +843 -0
  85. data/lib/steep/interface/function.rb +1090 -0
  86. data/lib/steep/interface/method_type.rb +330 -0
  87. data/lib/steep/interface/shape.rb +239 -0
  88. data/lib/steep/interface/substitution.rb +159 -0
  89. data/lib/steep/interface/type_param.rb +115 -0
  90. data/lib/steep/located_value.rb +20 -0
  91. data/lib/steep/method_name.rb +42 -0
  92. data/lib/steep/module_helper.rb +24 -0
  93. data/lib/steep/node_helper.rb +273 -0
  94. data/lib/steep/path_helper.rb +30 -0
  95. data/lib/steep/project/dsl.rb +268 -0
  96. data/lib/steep/project/group.rb +31 -0
  97. data/lib/steep/project/options.rb +63 -0
  98. data/lib/steep/project/pattern.rb +59 -0
  99. data/lib/steep/project/target.rb +92 -0
  100. data/lib/steep/project.rb +78 -0
  101. data/lib/steep/rake_task.rb +132 -0
  102. data/lib/steep/range_extension.rb +29 -0
  103. data/lib/steep/server/base_worker.rb +97 -0
  104. data/lib/steep/server/change_buffer.rb +73 -0
  105. data/lib/steep/server/custom_methods.rb +77 -0
  106. data/lib/steep/server/delay_queue.rb +45 -0
  107. data/lib/steep/server/interaction_worker.rb +492 -0
  108. data/lib/steep/server/lsp_formatter.rb +455 -0
  109. data/lib/steep/server/master.rb +912 -0
  110. data/lib/steep/server/target_group_files.rb +205 -0
  111. data/lib/steep/server/type_check_controller.rb +366 -0
  112. data/lib/steep/server/type_check_worker.rb +303 -0
  113. data/lib/steep/server/work_done_progress.rb +64 -0
  114. data/lib/steep/server/worker_process.rb +176 -0
  115. data/lib/steep/services/completion_provider.rb +802 -0
  116. data/lib/steep/services/content_change.rb +61 -0
  117. data/lib/steep/services/file_loader.rb +74 -0
  118. data/lib/steep/services/goto_service.rb +441 -0
  119. data/lib/steep/services/hover_provider/rbs.rb +88 -0
  120. data/lib/steep/services/hover_provider/ruby.rb +221 -0
  121. data/lib/steep/services/hover_provider/singleton_methods.rb +20 -0
  122. data/lib/steep/services/path_assignment.rb +46 -0
  123. data/lib/steep/services/signature_help_provider.rb +202 -0
  124. data/lib/steep/services/signature_service.rb +428 -0
  125. data/lib/steep/services/stats_calculator.rb +68 -0
  126. data/lib/steep/services/type_check_service.rb +394 -0
  127. data/lib/steep/services/type_name_completion.rb +236 -0
  128. data/lib/steep/signature/validator.rb +651 -0
  129. data/lib/steep/source/ignore_ranges.rb +69 -0
  130. data/lib/steep/source.rb +691 -0
  131. data/lib/steep/subtyping/cache.rb +30 -0
  132. data/lib/steep/subtyping/check.rb +1113 -0
  133. data/lib/steep/subtyping/constraints.rb +341 -0
  134. data/lib/steep/subtyping/relation.rb +101 -0
  135. data/lib/steep/subtyping/result.rb +324 -0
  136. data/lib/steep/subtyping/variable_variance.rb +89 -0
  137. data/lib/steep/test.rb +9 -0
  138. data/lib/steep/thread_waiter.rb +43 -0
  139. data/lib/steep/type_construction.rb +5183 -0
  140. data/lib/steep/type_inference/block_params.rb +416 -0
  141. data/lib/steep/type_inference/case_when.rb +303 -0
  142. data/lib/steep/type_inference/constant_env.rb +56 -0
  143. data/lib/steep/type_inference/context.rb +195 -0
  144. data/lib/steep/type_inference/logic_type_interpreter.rb +613 -0
  145. data/lib/steep/type_inference/method_call.rb +193 -0
  146. data/lib/steep/type_inference/method_params.rb +531 -0
  147. data/lib/steep/type_inference/multiple_assignment.rb +194 -0
  148. data/lib/steep/type_inference/send_args.rb +712 -0
  149. data/lib/steep/type_inference/type_env.rb +341 -0
  150. data/lib/steep/type_inference/type_env_builder.rb +138 -0
  151. data/lib/steep/typing.rb +321 -0
  152. data/lib/steep/version.rb +3 -0
  153. data/lib/steep.rb +369 -0
  154. data/manual/annotations.md +181 -0
  155. data/manual/ignore.md +20 -0
  156. data/manual/ruby-diagnostics.md +1879 -0
  157. data/sample/Steepfile +22 -0
  158. data/sample/lib/conference.rb +49 -0
  159. data/sample/lib/length.rb +35 -0
  160. data/sample/sig/conference.rbs +42 -0
  161. data/sample/sig/generics.rbs +15 -0
  162. data/sample/sig/length.rbs +34 -0
  163. data/steep-activesupport-4.gemspec +55 -0
  164. metadata +437 -0
@@ -0,0 +1,570 @@
1
+ module Steep
2
+ module Diagnostic
3
+ module Signature
4
+ class Base
5
+ include Helper
6
+
7
+ attr_reader :location
8
+
9
+ def initialize(location:)
10
+ @location = location
11
+ end
12
+
13
+ def header_line
14
+ raise
15
+ end
16
+
17
+ def detail_lines
18
+ nil
19
+ end
20
+
21
+ def diagnostic_code
22
+ "RBS::#{error_name}"
23
+ end
24
+
25
+ def path
26
+ if location
27
+ Pathname(location.buffer.name)
28
+ end
29
+ end
30
+ end
31
+
32
+ class SyntaxError < Base
33
+ attr_reader :exception
34
+
35
+ def initialize(exception, location:)
36
+ super(location: location)
37
+ @exception = exception
38
+ end
39
+
40
+ def self.parser_syntax_error_message(exception)
41
+ string = exception.location.source.to_s
42
+ unless string.empty?
43
+ string = " (#{string})"
44
+ end
45
+
46
+ "Syntax error caused by token `#{exception.token_type}`#{string}"
47
+ end
48
+
49
+ def header_line
50
+ exception.message
51
+ end
52
+ end
53
+
54
+ class DuplicatedDeclaration < Base
55
+ attr_reader :type_name
56
+
57
+ def initialize(type_name:, location:)
58
+ super(location: location)
59
+ @type_name = type_name
60
+ end
61
+
62
+ def header_line
63
+ "Declaration of `#{type_name}` is duplicated"
64
+ end
65
+ end
66
+
67
+ class UnknownTypeName < Base
68
+ attr_reader :name
69
+
70
+ def initialize(name:, location:)
71
+ super(location: location)
72
+ @name = name
73
+ end
74
+
75
+ def header_line
76
+ "Cannot find type `#{name}`"
77
+ end
78
+ end
79
+
80
+ class InvalidTypeApplication < Base
81
+ attr_reader :name
82
+ attr_reader :args
83
+ attr_reader :params
84
+
85
+ def initialize(name:, args:, params:, location:)
86
+ super(location: location)
87
+ @name = name
88
+ @args = args
89
+ @params = params
90
+ end
91
+
92
+ def header_line
93
+ case
94
+ when params.empty?
95
+ "Type `#{name}` is not generic but used as a generic type with #{args.size} arguments"
96
+ when args.empty?
97
+ "Type `#{name}` is generic but used as a non generic type"
98
+ else
99
+ "Type `#{name}` expects #{params.size} arguments, but #{args.size} arguments are given"
100
+ end
101
+ end
102
+ end
103
+
104
+ class UnsatisfiableTypeApplication < Base
105
+ attr_reader :type_name
106
+ attr_reader :type_arg
107
+ attr_reader :type_param
108
+ attr_reader :result
109
+
110
+ include ResultPrinter2
111
+
112
+ def initialize(type_name:, type_arg:, type_param:, result:, location:)
113
+ super(location: location)
114
+ @type_name = type_name
115
+ @type_arg = type_arg
116
+ @type_param = type_param
117
+ @result = result
118
+ end
119
+
120
+ def header_line
121
+ "Type application of `#{type_name}` doesn't satisfy the constraints: #{type_arg} <: #{type_param.upper_bound}"
122
+ end
123
+ end
124
+
125
+ class InvalidMethodOverload < Base
126
+ attr_reader :class_name
127
+ attr_reader :method_name
128
+
129
+ def initialize(class_name:, method_name:, location:)
130
+ super(location: location)
131
+ @class_name = class_name
132
+ @method_name = method_name
133
+ end
134
+
135
+ def header_line
136
+ "Cannot find a non-overloading definition of `#{method_name}` in `#{class_name}`"
137
+ end
138
+ end
139
+
140
+ class UnknownMethodAlias < Base
141
+ attr_reader :class_name
142
+ attr_reader :method_name
143
+
144
+ def initialize(class_name:, method_name:, location:)
145
+ super(location: location)
146
+ @class_name = class_name
147
+ @method_name = method_name
148
+ end
149
+
150
+ def header_line
151
+ "Cannot find the original method `#{method_name}` in `#{class_name}`"
152
+ end
153
+ end
154
+
155
+ class DuplicatedMethodDefinition < Base
156
+ attr_reader :class_name
157
+ attr_reader :method_name
158
+
159
+ def initialize(class_name:, method_name:, location:)
160
+ super(location: location)
161
+ @class_name = class_name
162
+ @method_name = method_name
163
+ end
164
+
165
+ def header_line
166
+ "Non-overloading method definition of `#{method_name}` in `#{class_name}` cannot be duplicated"
167
+ end
168
+ end
169
+
170
+ class RecursiveAlias < Base
171
+ attr_reader :class_name
172
+ attr_reader :names
173
+
174
+ def initialize(class_name:, names:, location:)
175
+ super(location: location)
176
+ @class_name = class_name
177
+ @names = names
178
+ end
179
+
180
+ def header_line
181
+ "Circular method alias is detected in `#{class_name}`: #{names.join(" -> ")}"
182
+ end
183
+ end
184
+
185
+ class RecursiveAncestor < Base
186
+ attr_reader :ancestors
187
+
188
+ def initialize(ancestors:, location:)
189
+ super(location: location)
190
+ @ancestors = ancestors
191
+ end
192
+
193
+ def header_line
194
+ names = ancestors.map do |ancestor|
195
+ case ancestor
196
+ when RBS::Definition::Ancestor::Singleton
197
+ "singleton(#{ancestor.name})"
198
+ when RBS::Definition::Ancestor::Instance
199
+ if ancestor.args.empty?
200
+ ancestor.name.to_s
201
+ else
202
+ "#{ancestor.name}[#{ancestor.args.join(", ")}]"
203
+ end
204
+ end
205
+ end
206
+
207
+ "Circular inheritance/mix-in is detected: #{names.join(" <: ")}"
208
+ end
209
+ end
210
+
211
+ class SuperclassMismatch < Base
212
+ attr_reader :name
213
+
214
+ def initialize(name:, location:)
215
+ super(location: location)
216
+ @name = name
217
+ end
218
+
219
+ def header_line
220
+ "Different superclasses are specified for `#{name}`"
221
+ end
222
+ end
223
+
224
+ class GenericParameterMismatch < Base
225
+ attr_reader :name
226
+
227
+ def initialize(name:, location:)
228
+ super(location: location)
229
+ @name = name
230
+ end
231
+
232
+ def header_line
233
+ "Different generic parameters are specified across definitions of `#{name}`"
234
+ end
235
+ end
236
+
237
+ class InvalidVarianceAnnotation < Base
238
+ attr_reader :name
239
+ attr_reader :param
240
+
241
+ def initialize(name:, param:, location:)
242
+ super(location: location)
243
+ @name = name
244
+ @param = param
245
+ end
246
+
247
+ def header_line
248
+ "The variance of type parameter `#{param.name}` is #{param.variance}, but used in incompatible position here"
249
+ end
250
+ end
251
+
252
+ class ModuleSelfTypeError < Base
253
+ attr_reader :name
254
+ attr_reader :ancestor
255
+ attr_reader :result
256
+
257
+ include ResultPrinter2
258
+
259
+ def initialize(name:, ancestor:, result:, location:)
260
+ super(location: location)
261
+
262
+ @name = name
263
+ @ancestor = ancestor
264
+ @result = result
265
+ end
266
+
267
+ def relation
268
+ result.relation
269
+ end
270
+
271
+ def header_line
272
+ "Module self type constraint in type `#{name}` doesn't satisfy: `#{relation}`"
273
+ end
274
+ end
275
+
276
+ class ClassVariableDuplicationError < Base
277
+ attr_reader :class_name
278
+ attr_reader :other_class_name
279
+ attr_reader :variable_name
280
+
281
+ def initialize(class_name:, other_class_name:, variable_name:, location:)
282
+ super(location: location)
283
+
284
+ @class_name = class_name
285
+ @other_class_name = other_class_name
286
+ @variable_name = variable_name
287
+ end
288
+
289
+ def header_line
290
+ "Class variable definition `#{variable_name}` in `#{class_name}` may be overtaken by `#{other_class_name}`"
291
+ end
292
+ end
293
+
294
+ class InstanceVariableTypeError < Base
295
+ attr_reader :name
296
+ attr_reader :var_type
297
+ attr_reader :parent_type
298
+
299
+ def initialize(name:, location:, var_type:, parent_type:)
300
+ super(location: location)
301
+
302
+ @name = name
303
+ @var_type = var_type
304
+ @parent_type = parent_type
305
+ end
306
+
307
+ def header_line
308
+ "Instance variable cannot have different type with parents: #{var_type} <=> #{parent_type}"
309
+ end
310
+ end
311
+
312
+ class MixinClassError < Base
313
+ attr_reader :member
314
+ attr_reader :type_name
315
+
316
+ def initialize(location:, member:, type_name:)
317
+ super(location: location)
318
+ @member = member
319
+ @type_name = type_name
320
+ end
321
+
322
+ def header_line
323
+ "Cannot #{mixin_name} a class `#{member.name}` in the definition of `#{type_name}`"
324
+ end
325
+
326
+ private
327
+
328
+ def mixin_name
329
+ case mem = member
330
+ when RBS::AST::Members::Prepend
331
+ "prepend"
332
+ when RBS::AST::Members::Include
333
+ "include"
334
+ when RBS::AST::Members::Extend
335
+ "extend"
336
+ end
337
+ end
338
+ end
339
+
340
+ class InheritModuleError < Base
341
+ attr_reader :super_class
342
+
343
+ def initialize(super_class)
344
+ super(location: super_class.location)
345
+ @super_class = super_class
346
+ end
347
+
348
+ def header_line
349
+ "Cannot inherit from a module `#{super_class.name}`"
350
+ end
351
+ end
352
+
353
+ class UnexpectedError < Base
354
+ attr_reader :message
355
+
356
+ def initialize(message:, location:)
357
+ @message = message
358
+ @location = location
359
+ end
360
+
361
+ def header_line
362
+ "Unexpected error: #{message}"
363
+ end
364
+ end
365
+
366
+ class RecursiveTypeAlias < Base
367
+ attr_reader :alias_names
368
+
369
+ def initialize(alias_names:, location:)
370
+ @alias_names = alias_names
371
+ super(location: location)
372
+ end
373
+
374
+ def header_line
375
+ "Type aliases cannot be *directly recursive*: #{alias_names.join(", ")}"
376
+ end
377
+ end
378
+
379
+ class NonregularTypeAlias < Base
380
+ attr_reader :type_name
381
+ attr_reader :nonregular_type
382
+
383
+ def initialize(type_name:, nonregular_type:, location:)
384
+ @type_name = type_name
385
+ @nonregular_type = nonregular_type
386
+ @location = location
387
+ end
388
+
389
+ def header_line
390
+ "Type alias #{type_name} is defined *non-regular*: #{nonregular_type}"
391
+ end
392
+ end
393
+
394
+ class InconsistentClassModuleAliasError < Base
395
+ attr_reader :decl
396
+
397
+ def initialize(decl:)
398
+ @decl = decl
399
+ super(location: decl.location&.[](:old_name))
400
+ end
401
+
402
+ def header_line
403
+ expected_kind =
404
+ case decl
405
+ when RBS::AST::Declarations::ModuleAlias
406
+ "module"
407
+ when RBS::AST::Declarations::ClassAlias
408
+ "class"
409
+ else
410
+ raise
411
+ end
412
+
413
+ "A #{expected_kind} `#{decl.new_name}` cannot be an alias of `#{decl.old_name}`"
414
+ end
415
+ end
416
+
417
+ class CyclicClassAliasDefinitionError < Base
418
+ attr_reader :decl
419
+
420
+ def initialize(decl:)
421
+ @decl = decl
422
+ super(location: decl.location&.[](:new_name))
423
+ end
424
+
425
+ def header_line
426
+ "#{decl.new_name} is a cyclic definition"
427
+ end
428
+ end
429
+
430
+ class TypeParamDefaultReferenceError < Base
431
+ attr_reader :type_param
432
+
433
+ def initialize(type_param, location:)
434
+ super(location: location)
435
+ @type_param = type_param
436
+ end
437
+
438
+ def header_line
439
+ "The default type of `#{type_param.name}` cannot depend on optional type parameters"
440
+ end
441
+ end
442
+
443
+ class UnsatisfiableGenericsDefaultType < Base
444
+ attr_reader :param_name, :result
445
+
446
+ include ResultPrinter2
447
+
448
+ def initialize(param_name, result, location:)
449
+ super(location: location)
450
+ @param_name = param_name
451
+ @result = result
452
+ end
453
+
454
+ def relation
455
+ result.relation
456
+ end
457
+
458
+ def header_line
459
+ "The default type of `#{param_name}` doesn't satisfy upper bound constraint: #{relation}"
460
+ end
461
+ end
462
+
463
+
464
+ def self.from_rbs_error(error, factory:)
465
+ case error
466
+ when RBS::ParsingError
467
+ Diagnostic::Signature::SyntaxError.new(error, location: error.location)
468
+ when RBS::DuplicatedDeclarationError
469
+ Diagnostic::Signature::DuplicatedDeclaration.new(
470
+ type_name: error.name,
471
+ location: error.decls.fetch(0).location
472
+ )
473
+ when RBS::GenericParameterMismatchError
474
+ Diagnostic::Signature::GenericParameterMismatch.new(
475
+ name: error.name,
476
+ location: error.decl.location
477
+ )
478
+ when RBS::InvalidTypeApplicationError
479
+ Diagnostic::Signature::InvalidTypeApplication.new(
480
+ name: error.type_name,
481
+ args: error.args.map {|ty| factory.type(ty) },
482
+ params: error.params,
483
+ location: error.location
484
+ )
485
+ when RBS::NoTypeFoundError,
486
+ RBS::NoSuperclassFoundError,
487
+ RBS::NoMixinFoundError,
488
+ RBS::NoSelfTypeFoundError
489
+ Diagnostic::Signature::UnknownTypeName.new(
490
+ name: error.type_name,
491
+ location: error.location
492
+ )
493
+ when RBS::InvalidOverloadMethodError
494
+ Diagnostic::Signature::InvalidMethodOverload.new(
495
+ class_name: error.type_name,
496
+ method_name: error.method_name,
497
+ location: error.members.fetch(0).location
498
+ )
499
+ when RBS::DuplicatedMethodDefinitionError
500
+ Diagnostic::Signature::DuplicatedMethodDefinition.new(
501
+ class_name: error.type_name,
502
+ method_name: error.method_name,
503
+ location: error.location
504
+ )
505
+ when RBS::DuplicatedInterfaceMethodDefinitionError
506
+ Diagnostic::Signature::DuplicatedMethodDefinition.new(
507
+ class_name: error.type_name,
508
+ method_name: error.method_name,
509
+ location: error.member.location
510
+ )
511
+ when RBS::UnknownMethodAliasError
512
+ Diagnostic::Signature::UnknownMethodAlias.new(
513
+ class_name: error.type_name,
514
+ method_name: error.original_name,
515
+ location: error.location
516
+ )
517
+ when RBS::RecursiveAliasDefinitionError
518
+ Diagnostic::Signature::RecursiveAlias.new(
519
+ class_name: error.type.name,
520
+ names: error.defs.map(&:name),
521
+ location: error.defs.fetch(0).original&.location
522
+ )
523
+ when RBS::RecursiveAncestorError
524
+ Diagnostic::Signature::RecursiveAncestor.new(
525
+ ancestors: error.ancestors,
526
+ location: error.location
527
+ )
528
+ when RBS::SuperclassMismatchError
529
+ Diagnostic::Signature::SuperclassMismatch.new(
530
+ name: error.name,
531
+ location: error.entry.primary.decl.location
532
+ )
533
+ when RBS::InvalidVarianceAnnotationError
534
+ Diagnostic::Signature::InvalidVarianceAnnotation.new(
535
+ name: error.type_name,
536
+ param: error.param,
537
+ location: error.location
538
+ )
539
+ when RBS::MixinClassError
540
+ Diagnostic::Signature::MixinClassError.new(
541
+ location: error.location,
542
+ type_name: error.type_name,
543
+ member: error.member,
544
+ )
545
+ when RBS::RecursiveTypeAliasError
546
+ Diagnostic::Signature::RecursiveTypeAlias.new(
547
+ alias_names: error.alias_names,
548
+ location: error.location
549
+ )
550
+ when RBS::NonregularTypeAliasError
551
+ Diagnostic::Signature::NonregularTypeAlias.new(
552
+ type_name: error.diagnostic.type_name,
553
+ nonregular_type: factory.type(error.diagnostic.nonregular_type),
554
+ location: error.location
555
+ )
556
+ when RBS::InheritModuleError
557
+ Diagnostic::Signature::InheritModuleError.new(error.super_decl)
558
+ when RBS::InconsistentClassModuleAliasError
559
+ Diagnostic::Signature::InconsistentClassModuleAliasError.new(decl: error.alias_entry.decl)
560
+ when RBS::CyclicClassAliasDefinitionError
561
+ Diagnostic::Signature::CyclicClassAliasDefinitionError.new(decl: error.alias_entry.decl)
562
+ when RBS::TypeParamDefaultReferenceError
563
+ Diagnostic::Signature::TypeParamDefaultReferenceError.new(error.type_param, location: error.location)
564
+ else
565
+ raise error
566
+ end
567
+ end
568
+ end
569
+ end
570
+ end
@@ -0,0 +1,52 @@
1
+ module Steep
2
+ module Drivers
3
+ class Annotations
4
+ attr_reader :command_line_patterns
5
+ attr_reader :stdout
6
+ attr_reader :stderr
7
+
8
+ include Utils::DriverHelper
9
+
10
+ def initialize(stdout:, stderr:)
11
+ @stdout = stdout
12
+ @stderr = stderr
13
+
14
+ @command_line_patterns = []
15
+ end
16
+
17
+ def run
18
+ project = load_config()
19
+
20
+ loader = Services::FileLoader.new(base_dir: project.base_dir)
21
+
22
+ project.targets.each do |target|
23
+ Steep.logger.tagged "target=#{target.name}" do
24
+ service = Services::SignatureService.load_from(target.new_env_loader(), implicitly_returns_nil: target.implicitly_returns_nil)
25
+
26
+ sigs = loader.load_changes(target.signature_pattern, changes: {})
27
+ service.update(sigs)
28
+
29
+ factory = AST::Types::Factory.new(builder: service.latest_builder)
30
+
31
+ srcs = loader.load_changes(target.source_pattern, command_line_patterns, changes: {})
32
+ srcs.each do |path, changes|
33
+ text = changes.inject("") {|text, change| change.apply_to(text) }
34
+ source = Source.parse(text, path: path, factory: factory)
35
+
36
+ source.each_annotation.sort_by {|node, _| [node.loc.expression.begin_pos, node.loc.expression.end_pos] }.each do |node, annotations|
37
+ loc = node.loc
38
+ stdout.puts "#{path}:#{loc.line}:#{loc.column}:#{node.type}:\t#{node.loc.expression.source.lines.first}"
39
+ annotations.each do |annotation|
40
+ annotation.location or raise
41
+ stdout.puts " #{annotation.location.source}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ 0
49
+ end
50
+ end
51
+ end
52
+ end