steep 0.39.0 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -35,10 +35,13 @@ module Steep
35
35
  def handle_request(request)
36
36
  case request[:method]
37
37
  when "initialize"
38
- # Don't respond to initialize request, but start type checking.
38
+ # Start type checking.
39
39
  project.targets.each do |target|
40
40
  enqueue_target(target: target, timestamp: Time.now)
41
41
  end
42
+
43
+ writer.write({ id: request[:id], result: nil})
44
+
42
45
  when "textDocument/didChange"
43
46
  update_source(request)
44
47
  validate_signature_if_required(request)
@@ -55,73 +58,18 @@ module Steep
55
58
  Steep.logger.info "Finished signature validation: #{target.name} (#{timestamp})"
56
59
 
57
60
  diagnostics = case status = target.status
58
- when Project::Target::SignatureSyntaxErrorStatus
59
- target.signature_files.each.with_object({}) do |(path, file), hash|
60
- if file.status.is_a?(Project::SignatureFile::ParseErrorStatus)
61
- location = case error = file.status.error
62
- when RBS::Parser::SyntaxError
63
- if error.error_value.is_a?(String)
64
- buf = RBS::Buffer.new(name: path, content: file.content)
65
- RBS::Location.new(buffer: buf, start_pos: buf.content.size, end_pos: buf.content.size)
66
- else
67
- error.error_value.location
68
- end
69
- when RBS::Parser::SemanticsError
70
- error.location
71
- else
72
- raise
73
- end
74
-
75
- hash[path] =
76
- [
77
- LSP::Interface::Diagnostic.new(
78
- message: file.status.error.message,
79
- severity: LSP::Constant::DiagnosticSeverity::ERROR,
80
- range: LSP::Interface::Range.new(
81
- start: LSP::Interface::Position.new(
82
- line: location.start_line - 1,
83
- character: location.start_column,
84
- ),
85
- end: LSP::Interface::Position.new(
86
- line: location.end_line - 1,
87
- character: location.end_column
88
- )
89
- )
90
- )
91
- ]
92
- else
93
- hash[path] = []
94
- end
95
- end
96
- when Project::Target::SignatureValidationErrorStatus
61
+ when Project::Target::SignatureErrorStatus
97
62
  error_hash = status.errors.group_by {|error| error.location.buffer.name }
63
+ formatter = Diagnostic::LSPFormatter.new
98
64
 
99
65
  target.signature_files.each_key.with_object({}) do |path, hash|
100
66
  errors = error_hash[path] || []
101
- hash[path] = errors.map do |error|
102
- LSP::Interface::Diagnostic.new(
103
- message: StringIO.new.tap {|io| error.puts(io) }.string.split(/\t/, 2).last,
104
- severity: LSP::Constant::DiagnosticSeverity::ERROR,
105
- range: LSP::Interface::Range.new(
106
- start: LSP::Interface::Position.new(
107
- line: error.location.start_line - 1,
108
- character: error.location.start_column,
109
- ),
110
- end: LSP::Interface::Position.new(
111
- line: error.location.end_line - 1,
112
- character: error.location.end_column
113
- )
114
- )
115
- )
116
- end
67
+ hash[path] = errors.map {|error| formatter.format(error) }
117
68
  end
118
69
  when Project::Target::TypeCheckStatus
119
70
  target.signature_files.each_key.with_object({}) do |path, hash|
120
71
  hash[path] = []
121
72
  end
122
- when Project::Target::SignatureOtherErrorStatus
123
- Steep.log_error status.error
124
- {}
125
73
  else
126
74
  Steep.logger.info "Unexpected target status: #{status.class}"
127
75
  {}
@@ -16,7 +16,7 @@ module Steep
16
16
  @name = name
17
17
  end
18
18
 
19
- def self.spawn_worker(type, name:, steepfile:)
19
+ def self.spawn_worker(type, name:, steepfile:, delay_shutdown: false)
20
20
  log_level = %w(debug info warn error fatal unknown)[Steep.logger.level]
21
21
  command = case type
22
22
  when :code
@@ -29,6 +29,10 @@ module Steep
29
29
  raise
30
30
  end
31
31
 
32
+ if delay_shutdown
33
+ command << "--delay-shutdown"
34
+ end
35
+
32
36
  stdin, stdout, thread = Open3.popen2(*command, pgroup: true)
33
37
  stderr = nil
34
38
 
@@ -38,9 +42,9 @@ module Steep
38
42
  new(reader: reader, writer: writer, stderr: stderr, wait_thread: thread, name: name)
39
43
  end
40
44
 
41
- def self.spawn_code_workers(steepfile:, count: [Etc.nprocessors-3, 1].max)
45
+ def self.spawn_code_workers(steepfile:, count: [Etc.nprocessors-3, 1].max, delay_shutdown: false)
42
46
  count.times.map do |i|
43
- spawn_worker(:code, name: "code@#{i}", steepfile: steepfile)
47
+ spawn_worker(:code, name: "code@#{i}", steepfile: steepfile, delay_shutdown: delay_shutdown)
44
48
  end
45
49
  end
46
50
 
@@ -52,12 +56,8 @@ module Steep
52
56
  reader.read(&block)
53
57
  end
54
58
 
55
- def shutdown
56
- self << { method: :shutdown, params: nil }
57
- self << { method: :exit, params: nil }
58
-
59
- writer.io.close()
60
- @wait_thread.join()
59
+ def kill
60
+ Process.kill(:TERM, @wait_thread.pid)
61
61
  end
62
62
  end
63
63
  end
@@ -129,47 +129,71 @@ module Steep
129
129
  def rescue_validation_errors(type_name = nil)
130
130
  yield
131
131
  rescue RBS::InvalidTypeApplicationError => exn
132
- @errors << Errors::InvalidTypeApplicationError.new(
132
+ @errors << Diagnostic::Signature::InvalidTypeApplication.new(
133
133
  name: exn.type_name,
134
134
  args: exn.args.map {|ty| factory.type(ty) },
135
135
  params: exn.params,
136
136
  location: exn.location
137
137
  )
138
- rescue RBS::NoTypeFoundError, RBS::NoSuperclassFoundError, RBS::NoMixinFoundError => exn
139
- @errors << Errors::UnknownTypeNameError.new(
138
+ rescue RBS::NoTypeFoundError,
139
+ RBS::NoSuperclassFoundError,
140
+ RBS::NoMixinFoundError,
141
+ RBS::NoSelfTypeFoundError => exn
142
+ @errors << Diagnostic::Signature::UnknownTypeName.new(
140
143
  name: exn.type_name,
141
144
  location: exn.location
142
145
  )
143
146
  rescue RBS::InvalidOverloadMethodError => exn
144
- @errors << Errors::InvalidMethodOverloadError.new(
147
+ @errors << Diagnostic::Signature::InvalidMethodOverload.new(
145
148
  class_name: exn.type_name,
146
149
  method_name: exn.method_name,
147
150
  location: exn.members[0].location
148
151
  )
149
152
  rescue RBS::DuplicatedMethodDefinitionError => exn
150
- @errors << Errors::DuplicatedMethodDefinitionError.new(
153
+ @errors << Diagnostic::Signature::DuplicatedMethodDefinition.new(
151
154
  class_name: type_name,
152
155
  method_name: exn.method_name,
153
156
  location: exn.location
154
157
  )
155
158
  rescue RBS::DuplicatedInterfaceMethodDefinitionError => exn
156
- @errors << Errors::DuplicatedMethodDefinitionError.new(
159
+ @errors << Diagnostic::Signature::DuplicatedMethodDefinition.new(
157
160
  class_name: type_name,
158
161
  method_name: exn.method_name,
159
162
  location: exn.member.location
160
163
  )
161
164
  rescue RBS::UnknownMethodAliasError => exn
162
- @errors << Errors::UnknownMethodAliasError.new(
165
+ @errors << Diagnostic::Signature::UnknownMethodAlias.new(
163
166
  class_name: type_name,
164
- method_name: exn.aliased_name,
167
+ method_name: exn.original_name,
165
168
  location: exn.location
166
169
  )
167
170
  rescue RBS::RecursiveAliasDefinitionError => exn
168
- @errors << Errors::RecursiveAliasError.new(
171
+ @errors << Diagnostic::Signature::RecursiveAlias.new(
169
172
  class_name: exn.type.name,
170
173
  names: exn.defs.map(&:name),
171
174
  location: exn.defs[0].original.location
172
175
  )
176
+ rescue RBS::RecursiveAncestorError => exn
177
+ @errors << Diagnostic::Signature::RecursiveAncestor.new(
178
+ ancestors: exn.ancestors,
179
+ location: exn.location
180
+ )
181
+ rescue RBS::SuperclassMismatchError => exn
182
+ @errors << Diagnostic::Signature::SuperclassMismatch.new(
183
+ name: exn.name,
184
+ location: exn.entry.primary.decl.location
185
+ )
186
+ rescue RBS::GenericParameterMismatchError => exn
187
+ @errors << Diagnostic::Signature::GenericParameterMismatch.new(
188
+ name: exn.name,
189
+ location: exn.decl.location
190
+ )
191
+ rescue RBS::InvalidVarianceAnnotationError => exn
192
+ @errors << Diagnostic::Signature::InvalidVarianceAnnotation.new(
193
+ name: exn.type_name,
194
+ param: exn.param,
195
+ location: exn.location
196
+ )
173
197
  end
174
198
  end
175
199
  end
@@ -142,10 +142,14 @@ module Steep
142
142
 
143
143
  if annots&.return_type && method_type&.type&.return_type
144
144
  check_relation(sub_type: annots.return_type, super_type: method_type.type.return_type).else do |result|
145
- typing.add_error Errors::MethodReturnTypeAnnotationMismatch.new(node: node,
146
- method_type: method_type.type.return_type,
147
- annotation_type: annots.return_type,
148
- result: result)
145
+ typing.add_error(
146
+ Diagnostic::Ruby::MethodReturnTypeAnnotationMismatch.new(
147
+ node: node,
148
+ method_type: method_type.type.return_type,
149
+ annotation_type: annots.return_type,
150
+ result: result
151
+ )
152
+ )
149
153
  end
150
154
  end
151
155
 
@@ -154,7 +158,7 @@ module Steep
154
158
  if method_type
155
159
  var_types = TypeConstruction.parameter_types(args, method_type.type)
156
160
  unless TypeConstruction.valid_parameter_env?(var_types, args.reject {|arg| arg.type == :blockarg}, method_type.type.params)
157
- typing.add_error Errors::MethodArityMismatch.new(node: node)
161
+ typing.add_error Diagnostic::Ruby::MethodArityMismatch.new(node: node, method_type: method_type)
158
162
  end
159
163
  end
160
164
 
@@ -574,7 +578,7 @@ module Steep
574
578
  lvar_env.assign!(name, node: node, type: type) do |declared_type, assigned_type, result|
575
579
  relation = Subtyping::Relation.new(sub_type: assigned_type, super_type: declared_type)
576
580
  typing.add_error(
577
- Errors::IncompatibleTypeCase.new(
581
+ Diagnostic::Ruby::IncompatibleTypeCase.new(
578
582
  node: node,
579
583
  var_name: name,
580
584
  relation: relation,
@@ -588,10 +592,12 @@ module Steep
588
592
  lvar_env = lvar_env.annotate(annots) do |var, outer_type, inner_type, result|
589
593
  relation = Subtyping::Relation.new(sub_type: inner_type, super_type: outer_type)
590
594
  typing.add_error(
591
- Errors::IncompatibleAnnotation.new(node: node,
592
- var_name: var,
593
- relation: relation,
594
- result: result)
595
+ Diagnostic::Ruby::IncompatibleAnnotation.new(
596
+ node: node,
597
+ var_name: var,
598
+ relation: relation,
599
+ result: result
600
+ )
595
601
  )
596
602
  end
597
603
 
@@ -608,10 +614,12 @@ module Steep
608
614
  self_type: self_type
609
615
  ) do |var, relation, result|
610
616
  typing.add_error(
611
- Errors::IncompatibleAnnotation.new(node: node,
612
- var_name: var,
613
- relation: relation,
614
- result: result)
617
+ Diagnostic::Ruby::IncompatibleAnnotation.new(
618
+ node: node,
619
+ var_name: var,
620
+ relation: relation,
621
+ result: result
622
+ )
615
623
  )
616
624
  end
617
625
 
@@ -694,10 +702,14 @@ module Steep
694
702
 
695
703
  constr = rhs_result.constr.update_lvar_env do |lvar_env|
696
704
  lvar_env.assign(name, node: node, type: rhs_result.type) do |declared_type, actual_type, result|
697
- typing.add_error(Errors::IncompatibleAssignment.new(node: node,
698
- lhs_type: declared_type,
699
- rhs_type: actual_type,
700
- result: result))
705
+ typing.add_error(
706
+ Diagnostic::Ruby::IncompatibleAssignment.new(
707
+ node: node,
708
+ lhs_type: declared_type,
709
+ rhs_type: actual_type,
710
+ result: result
711
+ )
712
+ )
701
713
  end
702
714
  end
703
715
 
@@ -852,7 +864,7 @@ module Steep
852
864
  constr.add_call(call)
853
865
  else
854
866
  fallback_to_any node do
855
- Errors::UnexpectedSuper.new(node: node, method: method_context.name)
867
+ Diagnostic::Ruby::UnexpectedSuper.new(node: node, method: method_context.name)
856
868
  end
857
869
  end
858
870
  else
@@ -888,10 +900,14 @@ module Steep
888
900
  return_type = expand_alias(new.method_context&.return_type)
889
901
  if return_type && !return_type.is_a?(AST::Types::Void)
890
902
  new.check(body_node, return_type) do |_, actual_type, result|
891
- typing.add_error(Errors::MethodBodyTypeMismatch.new(node: node,
892
- expected: new.method_context&.return_type,
893
- actual: actual_type,
894
- result: result))
903
+ typing.add_error(
904
+ Diagnostic::Ruby::MethodBodyTypeMismatch.new(
905
+ node: node,
906
+ expected: new.method_context&.return_type,
907
+ actual: actual_type,
908
+ result: result
909
+ )
910
+ )
895
911
  end
896
912
  else
897
913
  new.synthesize(body_node)
@@ -901,10 +917,14 @@ module Steep
901
917
  if return_type && !return_type.is_a?(AST::Types::Void)
902
918
  result = check_relation(sub_type: AST::Builtin.nil_type, super_type: return_type)
903
919
  if result.failure?
904
- typing.add_error(Errors::MethodBodyTypeMismatch.new(node: node,
905
- expected: new.method_context&.return_type,
906
- actual: AST::Builtin.nil_type,
907
- result: result))
920
+ typing.add_error(
921
+ Diagnostic::Ruby::MethodBodyTypeMismatch.new(
922
+ node: node,
923
+ expected: new.method_context&.return_type,
924
+ actual: AST::Builtin.nil_type,
925
+ result: result
926
+ )
927
+ )
908
928
  end
909
929
  end
910
930
 
@@ -956,10 +976,14 @@ module Steep
956
976
  return_type = expand_alias(new.method_context&.return_type)
957
977
  if return_type && !return_type.is_a?(AST::Types::Void)
958
978
  new.check(node.children[3], return_type) do |return_type, actual_type, result|
959
- typing.add_error(Errors::MethodBodyTypeMismatch.new(node: node,
960
- expected: return_type,
961
- actual: actual_type,
962
- result: result))
979
+ typing.add_error(
980
+ Diagnostic::Ruby::MethodBodyTypeMismatch.new(
981
+ node: node,
982
+ expected: return_type,
983
+ actual: actual_type,
984
+ result: result
985
+ )
986
+ )
963
987
  end
964
988
  else
965
989
  new.synthesize(node.children[3])
@@ -1000,10 +1024,14 @@ module Steep
1000
1024
  result = check_relation(sub_type: value_type, super_type: method_return_type)
1001
1025
 
1002
1026
  if result.failure?
1003
- typing.add_error(Errors::ReturnTypeMismatch.new(node: node,
1004
- expected: method_context&.return_type,
1005
- actual: value_type,
1006
- result: result))
1027
+ typing.add_error(
1028
+ Diagnostic::Ruby::ReturnTypeMismatch.new(
1029
+ node: node,
1030
+ expected: method_context&.return_type,
1031
+ actual: value_type,
1032
+ result: result
1033
+ )
1034
+ )
1007
1035
  end
1008
1036
  end
1009
1037
  end
@@ -1019,28 +1047,36 @@ module Steep
1019
1047
  if break_type = break_context.break_type
1020
1048
  if value
1021
1049
  check(value, break_type) do |break_type, actual_type, result|
1022
- typing.add_error Errors::BreakTypeMismatch.new(node: node,
1023
- expected: break_type,
1024
- actual: actual_type,
1025
- result: result)
1050
+ typing.add_error(
1051
+ Diagnostic::Ruby::BreakTypeMismatch.new(
1052
+ node: node,
1053
+ expected: break_type,
1054
+ actual: actual_type,
1055
+ result: result
1056
+ )
1057
+ )
1026
1058
  end
1027
1059
  else
1028
1060
  check_relation(sub_type: AST::Builtin.nil_type, super_type: break_type).else do |result|
1029
- typing.add_error Errors::BreakTypeMismatch.new(node: node,
1030
- expected: break_type,
1031
- actual: AST::Builtin.nil_type,
1032
- result: result)
1061
+ typing.add_error(
1062
+ Diagnostic::Ruby::BreakTypeMismatch.new(
1063
+ node: node,
1064
+ expected: break_type,
1065
+ actual: AST::Builtin.nil_type,
1066
+ result: result
1067
+ )
1068
+ )
1033
1069
  end
1034
1070
  end
1035
1071
  else
1036
1072
  if value
1037
1073
  synthesize(value)
1038
- typing.add_error Errors::UnexpectedJumpValue.new(node: node)
1074
+ typing.add_error Diagnostic::Ruby::UnexpectedJumpValue.new(node: node)
1039
1075
  end
1040
1076
  end
1041
1077
  else
1042
1078
  synthesize(value) if value
1043
- typing.add_error Errors::UnexpectedJump.new(node: node)
1079
+ typing.add_error Diagnostic::Ruby::UnexpectedJump.new(node: node)
1044
1080
  end
1045
1081
 
1046
1082
  add_typing(node, type: AST::Builtin.bottom_type)
@@ -1054,35 +1090,43 @@ module Steep
1054
1090
 
1055
1091
  if value
1056
1092
  _, constr = check(value, next_type) do |break_type, actual_type, result|
1057
- typing.add_error Errors::BreakTypeMismatch.new(node: node,
1058
- expected: break_type,
1059
- actual: actual_type,
1060
- result: result)
1093
+ typing.add_error(
1094
+ Diagnostic::Ruby::BreakTypeMismatch.new(
1095
+ node: node,
1096
+ expected: break_type,
1097
+ actual: actual_type,
1098
+ result: result
1099
+ )
1100
+ )
1061
1101
  end
1062
1102
  else
1063
1103
  check_relation(sub_type: AST::Builtin.nil_type, super_type: next_type).else do |result|
1064
- typing.add_error Errors::BreakTypeMismatch.new(node: node,
1065
- expected: next_type,
1066
- actual: AST::Builtin.nil_type,
1067
- result: result)
1104
+ typing.add_error(
1105
+ Diagnostic::Ruby::BreakTypeMismatch.new(
1106
+ node: node,
1107
+ expected: next_type,
1108
+ actual: AST::Builtin.nil_type,
1109
+ result: result
1110
+ )
1111
+ )
1068
1112
  end
1069
1113
  end
1070
1114
  else
1071
1115
  if value
1072
1116
  synthesize(value)
1073
- typing.add_error Errors::UnexpectedJumpValue.new(node: node)
1117
+ typing.add_error Diagnostic::Ruby::UnexpectedJumpValue.new(node: node)
1074
1118
  end
1075
1119
  end
1076
1120
  else
1077
1121
  synthesize(value) if value
1078
- typing.add_error Errors::UnexpectedJump.new(node: node)
1122
+ typing.add_error Diagnostic::Ruby::UnexpectedJump.new(node: node)
1079
1123
  end
1080
1124
 
1081
1125
  add_typing(node, type: AST::Builtin.bottom_type)
1082
1126
 
1083
1127
  when :retry
1084
1128
  unless break_context
1085
- typing.add_error Errors::UnexpectedJump.new(node: node)
1129
+ typing.add_error Diagnostic::Ruby::UnexpectedJump.new(node: node)
1086
1130
  end
1087
1131
  add_typing(node, type: AST::Builtin.bottom_type)
1088
1132
 
@@ -1112,10 +1156,12 @@ module Steep
1112
1156
  constr_ = constr.update_lvar_env do |env|
1113
1157
  env.assign(var.name, node: node, type: type) do |declared_type, type, result|
1114
1158
  typing.add_error(
1115
- Errors::IncompatibleAssignment.new(node: node,
1116
- lhs_type: declared_type,
1117
- rhs_type: type,
1118
- result: result)
1159
+ Diagnostic::Ruby::IncompatibleAssignment.new(
1160
+ node: node,
1161
+ lhs_type: declared_type,
1162
+ rhs_type: type,
1163
+ result: result
1164
+ )
1119
1165
  )
1120
1166
  end
1121
1167
  end
@@ -1131,7 +1177,7 @@ module Steep
1131
1177
  if context&.method_context&.method_type
1132
1178
  Steep.logger.error { "Unknown variable: #{node}" }
1133
1179
  end
1134
- typing.add_error Errors::FallbackAny.new(node: node)
1180
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
1135
1181
  type = AST::Builtin::Array.instance_type(AST::Builtin.any_type)
1136
1182
  end
1137
1183
 
@@ -1146,7 +1192,7 @@ module Steep
1146
1192
  if context&.method_context&.method_type
1147
1193
  Steep.logger.error { "Unknown variable: #{node}" }
1148
1194
  end
1149
- typing.add_error Errors::FallbackAny.new(node: node)
1195
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
1150
1196
  type = AST::Builtin::Hash.instance_type(AST::Builtin::Symbol.instance_type, AST::Builtin.any_type)
1151
1197
  end
1152
1198
 
@@ -1229,7 +1275,7 @@ module Steep
1229
1275
  key_types << splat_type.args[0]
1230
1276
  value_types << splat_type.args[1]
1231
1277
  else
1232
- typing.add_error Errors::UnexpectedSplat.new(node: child, type: original_type)
1278
+ typing.add_error Diagnostic::Ruby::UnexpectedSplat.new(node: child, type: original_type)
1233
1279
  key_types << AST::Builtin.any_type
1234
1280
  value_types << AST::Builtin.any_type
1235
1281
  end
@@ -1243,7 +1289,7 @@ module Steep
1243
1289
  value_type = value_types.empty? ? AST::Builtin.any_type : AST::Types::Union.build(types: value_types)
1244
1290
 
1245
1291
  if key_types.empty? && value_types.empty? && !hint
1246
- typing.add_error Errors::FallbackAny.new(node: node)
1292
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
1247
1293
  end
1248
1294
 
1249
1295
  add_typing(node, type: AST::Builtin::Hash.instance_type(key_type, value_type))
@@ -1337,7 +1383,7 @@ module Steep
1337
1383
 
1338
1384
  unless constructor
1339
1385
  typing.add_error(
1340
- Errors::UnsupportedSyntax.new(
1386
+ Diagnostic::Ruby::UnsupportedSyntax.new(
1341
1387
  node: node,
1342
1388
  message: "sclass receiver must be instance type or singleton type, but type given `#{type}`"
1343
1389
  )
@@ -1408,12 +1454,22 @@ module Steep
1408
1454
  case error
1409
1455
  when Subtyping::Result::Failure
1410
1456
  const_type = type_env.get(const: const_name)
1411
- typing.add_error(Errors::IncompatibleAssignment.new(node: node,
1412
- lhs_type: const_type,
1413
- rhs_type: value_type,
1414
- result: error))
1457
+ typing.add_error(
1458
+ Diagnostic::Ruby::IncompatibleAssignment.new(
1459
+ node: node,
1460
+ lhs_type: const_type,
1461
+ rhs_type: value_type,
1462
+ result: error
1463
+ )
1464
+ )
1415
1465
  when nil
1416
- typing.add_error(Errors::UnknownConstantAssigned.new(node: node, type: value_type))
1466
+ typing.add_error(
1467
+ Diagnostic::Ruby::UnknownConstantAssigned.new(
1468
+ node: node,
1469
+ name: const_name,
1470
+ context: module_context
1471
+ )
1472
+ )
1417
1473
  end
1418
1474
  end
1419
1475
 
@@ -1431,17 +1487,21 @@ module Steep
1431
1487
  block_type.type.params.flat_unnamed_params.map(&:last).zip(node.children).each do |(type, node)|
1432
1488
  if node && type
1433
1489
  check(node, type) do |_, rhs_type, result|
1434
- typing.add_error(Errors::IncompatibleAssignment.new(node: node,
1435
- lhs_type: type,
1436
- rhs_type: rhs_type,
1437
- result: result))
1490
+ typing.add_error(
1491
+ Diagnostic::Ruby::IncompatibleAssignment.new(
1492
+ node: node,
1493
+ lhs_type: type,
1494
+ rhs_type: rhs_type,
1495
+ result: result
1496
+ )
1497
+ )
1438
1498
  end
1439
1499
  end
1440
1500
  end
1441
1501
 
1442
1502
  add_typing(node, type: block_type.type.return_type)
1443
1503
  else
1444
- typing.add_error(Errors::UnexpectedYield.new(node: node))
1504
+ typing.add_error(Diagnostic::Ruby::UnexpectedYield.new(node: node))
1445
1505
  fallback_to_any node
1446
1506
  end
1447
1507
  else
@@ -1457,7 +1517,7 @@ module Steep
1457
1517
  }
1458
1518
  add_typing(node, type: union_type(*types))
1459
1519
  else
1460
- typing.add_error(Errors::UnexpectedSuper.new(node: node, method: method_context.name))
1520
+ typing.add_error(Diagnostic::Ruby::UnexpectedSuper.new(node: node, method: method_context.name))
1461
1521
  fallback_to_any node
1462
1522
  end
1463
1523
  else
@@ -1476,7 +1536,7 @@ module Steep
1476
1536
  add_typing node, type: array
1477
1537
  end
1478
1538
  else
1479
- typing.add_error Errors::FallbackAny.new(node: node)
1539
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
1480
1540
  add_typing node, type: AST::Builtin::Array.instance_type(AST::Builtin.any_type)
1481
1541
  end
1482
1542
  else
@@ -1580,14 +1640,14 @@ module Steep
1580
1640
  end
1581
1641
 
1582
1642
  type = case
1583
- when check_relation(sub_type: left_type, super_type: AST::Builtin.bool_type).success?
1643
+ when check_relation(sub_type: left_type, super_type: AST::Builtin.bool_type).success? && !left_type.is_a?(AST::Types::Any)
1584
1644
  AST::Builtin.bool_type
1585
1645
  else
1586
1646
  union_type(left_type, right_type)
1587
1647
  end
1588
1648
 
1589
1649
  type = AST::Types::Logic::Env.new(truthy: env, falsy: falsey_env, type: type) if condition
1590
-
1650
+
1591
1651
  add_typing(node,
1592
1652
  type: type,
1593
1653
  constr: constr.update_lvar_env { env })
@@ -1718,7 +1778,7 @@ module Steep
1718
1778
  if when_constr.context.lvar_env[cond_vars.first].is_a?(AST::Types::Bot)
1719
1779
  # Exhaustive
1720
1780
  if els
1721
- typing.add_error Errors::ElseOnExhaustiveCase.new(node: els, type: cond_type)
1781
+ typing.add_error Diagnostic::Ruby::ElseOnExhaustiveCase.new(node: els, type: cond_type)
1722
1782
  end
1723
1783
  else
1724
1784
  unless els
@@ -1906,7 +1966,7 @@ module Steep
1906
1966
  add_typing(node, type: collection_type, constr: constr)
1907
1967
  else
1908
1968
  fallback_to_any(node) do
1909
- Errors::NoMethod.new(
1969
+ Diagnostic::Ruby::NoMethod.new(
1910
1970
  node: node,
1911
1971
  method: :each,
1912
1972
  type: collection_type
@@ -2055,11 +2115,13 @@ module Steep
2055
2115
  end
2056
2116
 
2057
2117
  check(rhs, type) do |_, rhs_type, result|
2058
- typing.add_error(Errors::IncompatibleAssignment.new(
2059
- node: node,
2060
- lhs_type: type,
2061
- rhs_type: rhs_type,
2062
- result: result)
2118
+ typing.add_error(
2119
+ Diagnostic::Ruby::IncompatibleAssignment.new(
2120
+ node: node,
2121
+ lhs_type: type,
2122
+ rhs_type: rhs_type,
2123
+ result: result
2124
+ )
2063
2125
  )
2064
2126
  end
2065
2127
  end
@@ -2068,7 +2130,7 @@ module Steep
2068
2130
  yield_self do
2069
2131
  name = node.children.first
2070
2132
  type = type_env.get(gvar: name) do
2071
- typing.add_error Errors::FallbackAny.new(node: node)
2133
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
2072
2134
  end
2073
2135
 
2074
2136
  add_typing(node, type: type)
@@ -2082,24 +2144,29 @@ module Steep
2082
2144
  if hint.one_arg?
2083
2145
  # Assumes Symbol#to_proc implementation
2084
2146
  param_type = hint.type.params.required[0]
2085
- interface = checker.factory.interface(param_type, private: true)
2086
- method = interface.methods[value.children[0]]
2087
- if method
2088
- return_types = method.method_types.select {|method_type|
2089
- method_type.type.params.empty?
2090
- }.map {|method_type|
2091
- method_type.type.return_type
2092
- }
2093
-
2094
- unless return_types.empty?
2095
- type = AST::Types::Proc.new(
2096
- type: Interface::Function.new(
2097
- params: Interface::Function::Params.empty.update(required: [param_type]),
2098
- return_type: AST::Types::Union.build(types: return_types),
2099
- location: nil
2100
- ),
2101
- block: nil
2102
- )
2147
+ case param_type
2148
+ when AST::Types::Any
2149
+ type = AST::Types::Any.new
2150
+ else
2151
+ interface = checker.factory.interface(param_type, private: true)
2152
+ method = interface.methods[value.children[0]]
2153
+ if method
2154
+ return_types = method.method_types.select {|method_type|
2155
+ method_type.type.params.empty?
2156
+ }.map {|method_type|
2157
+ method_type.type.return_type
2158
+ }
2159
+
2160
+ unless return_types.empty?
2161
+ type = AST::Types::Proc.new(
2162
+ type: Interface::Function.new(
2163
+ params: Interface::Function::Params.empty.update(required: [param_type]),
2164
+ return_type: AST::Types::Union.build(types: return_types),
2165
+ location: nil
2166
+ ),
2167
+ block: nil
2168
+ )
2169
+ end
2103
2170
  end
2104
2171
  end
2105
2172
  else
@@ -2137,10 +2204,12 @@ module Steep
2137
2204
  add_typing node, type: type, constr: constr
2138
2205
  else
2139
2206
  fallback_to_any node do
2140
- Errors::IncompatibleAssignment.new(node: node,
2141
- lhs_type: var_type,
2142
- rhs_type: type,
2143
- result: result)
2207
+ Diagnostic::Ruby::IncompatibleAssignment.new(
2208
+ node: node,
2209
+ lhs_type: var_type,
2210
+ rhs_type: type,
2211
+ result: result
2212
+ )
2144
2213
  end
2145
2214
  end
2146
2215
  else
@@ -2165,7 +2234,7 @@ module Steep
2165
2234
  when :splat
2166
2235
  yield_self do
2167
2236
  typing.add_error(
2168
- Errors::UnsupportedSyntax.new(
2237
+ Diagnostic::Ruby::UnsupportedSyntax.new(
2169
2238
  node: node,
2170
2239
  message: "Unsupported splat node occurrence"
2171
2240
  )
@@ -2188,7 +2257,7 @@ module Steep
2188
2257
  add_typing node, type: AST::Builtin.any_type, constr: constr
2189
2258
 
2190
2259
  else
2191
- typing.add_error(Errors::UnsupportedSyntax.new(node: node))
2260
+ typing.add_error(Diagnostic::Ruby::UnsupportedSyntax.new(node: node))
2192
2261
 
2193
2262
  end.tap do |pair|
2194
2263
  unless pair.is_a?(Pair) && !pair.type.is_a?(Pair)
@@ -2218,10 +2287,14 @@ module Steep
2218
2287
  case error
2219
2288
  when Subtyping::Result::Failure
2220
2289
  type = type_env.get(ivar: name)
2221
- typing.add_error(Errors::IncompatibleAssignment.new(node: node,
2222
- lhs_type: type,
2223
- rhs_type: rhs_type,
2224
- result: error))
2290
+ typing.add_error(
2291
+ Diagnostic::Ruby::IncompatibleAssignment.new(
2292
+ node: node,
2293
+ lhs_type: type,
2294
+ rhs_type: rhs_type,
2295
+ result: error
2296
+ )
2297
+ )
2225
2298
  when nil
2226
2299
  fallback_to_any node
2227
2300
  end
@@ -2244,10 +2317,12 @@ module Steep
2244
2317
  name = node.children[0].name
2245
2318
  env = context.lvar_env.assign(name, node: node, type: type) do |declared_type, type, result|
2246
2319
  typing.add_error(
2247
- Errors::IncompatibleAssignment.new(node: node,
2248
- lhs_type: declared_type,
2249
- rhs_type: type,
2250
- result: result)
2320
+ Diagnostic::Ruby::IncompatibleAssignment.new(
2321
+ node: node,
2322
+ lhs_type: declared_type,
2323
+ rhs_type: type,
2324
+ result: result
2325
+ )
2251
2326
  )
2252
2327
  end
2253
2328
 
@@ -2261,10 +2336,14 @@ module Steep
2261
2336
  case error
2262
2337
  when Subtyping::Result::Failure
2263
2338
  var_type = type_env.get(ivar: ivar)
2264
- typing.add_error(Errors::IncompatibleAssignment.new(node: node,
2265
- lhs_type: var_type,
2266
- rhs_type: type,
2267
- result: error))
2339
+ typing.add_error(
2340
+ Diagnostic::Ruby::IncompatibleAssignment.new(
2341
+ node: node,
2342
+ lhs_type: var_type,
2343
+ rhs_type: type,
2344
+ result: error
2345
+ )
2346
+ )
2268
2347
  when nil
2269
2348
  fallback_to_any node
2270
2349
  end
@@ -2462,8 +2541,8 @@ module Steep
2462
2541
  if expected_block_type = block_constr.block_context.body_type
2463
2542
  check_relation(sub_type: return_type, super_type: expected_block_type).else do |result|
2464
2543
  block_constr.typing.add_error(
2465
- Errors::BlockBodyTypeMismatch.new(
2466
- node: block_body,
2544
+ Diagnostic::Ruby::BlockBodyTypeMismatch.new(
2545
+ node: node,
2467
2546
  expected: expected_block_type,
2468
2547
  actual: return_type,
2469
2548
  result: result
@@ -2525,7 +2604,7 @@ module Steep
2525
2604
  end
2526
2605
  end
2527
2606
  else
2528
- error = Errors::UnresolvedOverloading.new(
2607
+ error = Diagnostic::Ruby::UnresolvedOverloading.new(
2529
2608
  node: node,
2530
2609
  receiver_type: receiver_type,
2531
2610
  method_name: method_name,
@@ -2581,7 +2660,7 @@ module Steep
2581
2660
  context: context.method_context,
2582
2661
  method_name: method_name,
2583
2662
  receiver_type: receiver_type,
2584
- error: Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
2663
+ error: Diagnostic::Ruby::NoMethod.new(node: node, method: method_name, type: receiver_type)
2585
2664
  )
2586
2665
  )
2587
2666
  end
@@ -2619,7 +2698,7 @@ module Steep
2619
2698
  context: context.method_context,
2620
2699
  method_name: method_name,
2621
2700
  receiver_type: receiver_type,
2622
- error: Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
2701
+ error: Diagnostic::Ruby::NoMethod.new(node: node, method: method_name, type: receiver_type)
2623
2702
  )
2624
2703
  )
2625
2704
 
@@ -2636,7 +2715,7 @@ module Steep
2636
2715
  context: context.method_context,
2637
2716
  method_name: method_name,
2638
2717
  receiver_type: receiver_type,
2639
- error: Errors::NoMethod.new(node: node, method: method_name, type: receiver_type)
2718
+ error: Diagnostic::Ruby::NoMethod.new(node: node, method: method_name, type: receiver_type)
2640
2719
  )
2641
2720
  )
2642
2721
  else
@@ -2677,7 +2756,7 @@ module Steep
2677
2756
  Steep.log_error(exn, message: "Unexpected error in #type_send: #{exn.message} (#{exn.class})")
2678
2757
  end
2679
2758
 
2680
- error = Errors::UnexpectedError.new(node: node, error: exn)
2759
+ error = Diagnostic::Ruby::UnexpectedError.new(node: node, error: exn)
2681
2760
 
2682
2761
  type_any_rec(node)
2683
2762
 
@@ -2731,7 +2810,8 @@ module Steep
2731
2810
  all_decls = method.method_types.each.with_object(Set[]) do |method_type, set|
2732
2811
  set.merge(method_type.method_decls)
2733
2812
  end
2734
- error = Errors::IncompatibleArguments.new(node: node, receiver_type: receiver_type, method_type: method_type)
2813
+
2814
+ error = Diagnostic::Ruby::IncompatibleArguments.new(node: node, method_name: method_name, receiver_type: receiver_type, method_types: method.method_types)
2735
2815
  call = TypeInference::MethodCall::Error.new(
2736
2816
  node: node,
2737
2817
  context: context.method_context,
@@ -2796,7 +2876,7 @@ module Steep
2796
2876
 
2797
2877
  if keyword_type
2798
2878
  check(value_node, keyword_type, constraints: constraints) do |expected, actual, result|
2799
- return Errors::IncompatibleAssignment.new(
2879
+ return Diagnostic::Ruby::IncompatibleAssignment.new(
2800
2880
  node: value_node,
2801
2881
  lhs_type: expected,
2802
2882
  rhs_type: actual,
@@ -2809,7 +2889,7 @@ module Steep
2809
2889
 
2810
2890
  else
2811
2891
  check(key_node, AST::Builtin::Symbol.instance_type, constraints: constraints) do |expected, actual, result|
2812
- return Errors::IncompatibleAssignment.new(
2892
+ return Diagnostic::Ruby::IncompatibleAssignment.new(
2813
2893
  node: key_node,
2814
2894
  lhs_type: expected,
2815
2895
  rhs_type: actual,
@@ -2822,7 +2902,7 @@ module Steep
2822
2902
  Steep.logger.warn("Keyword arg with kwsplat(**) node are not supported.")
2823
2903
 
2824
2904
  check(element.children[0], keyword_hash_type, constraints: constraints) do |expected, actual, result|
2825
- return Errors::IncompatibleAssignment.new(
2905
+ return Diagnostic::Ruby::IncompatibleAssignment.new(
2826
2906
  node: node,
2827
2907
  lhs_type: expected,
2828
2908
  rhs_type: actual,
@@ -2838,14 +2918,18 @@ module Steep
2838
2918
  when Set
2839
2919
  missing_keywords = Set.new(params.required_keywords.keys) - given_keys
2840
2920
  unless missing_keywords.empty?
2841
- return Errors::MissingKeyword.new(node: node,
2842
- missing_keywords: missing_keywords)
2921
+ return Diagnostic::Ruby::MissingKeyword.new(
2922
+ node: node,
2923
+ missing_keywords: missing_keywords
2924
+ )
2843
2925
  end
2844
2926
 
2845
2927
  extra_keywords = given_keys - Set.new(params.required_keywords.keys) - Set.new(params.optional_keywords.keys)
2846
2928
  if extra_keywords.any? && !params.rest_keywords
2847
- return Errors::UnexpectedKeyword.new(node: node,
2848
- unexpected_keywords: extra_keywords)
2929
+ return Diagnostic::Ruby::UnexpectedKeyword.new(
2930
+ node: node,
2931
+ unexpected_keywords: extra_keywords
2932
+ )
2849
2933
  end
2850
2934
  end
2851
2935
  else
@@ -2872,12 +2956,13 @@ module Steep
2872
2956
 
2873
2957
  node_type = synthesize(node, hint: hash_type).type
2874
2958
 
2875
- check_relation(sub_type: node_type, super_type: hash_type).else do
2876
- return Errors::ArgumentTypeMismatch.new(
2959
+ check_relation(sub_type: node_type, super_type: hash_type).else do |result|
2960
+ return Diagnostic::Ruby::ArgumentTypeMismatch.new(
2877
2961
  node: node,
2878
2962
  receiver_type: receiver_type,
2879
2963
  expected: hash_type,
2880
- actual: node_type
2964
+ actual: node_type,
2965
+ result: result
2881
2966
  )
2882
2967
  end
2883
2968
  end
@@ -2912,11 +2997,12 @@ module Steep
2912
2997
  constr.synthesize(arg_node, hint: topdown_hint ? param_type : nil)
2913
2998
  end
2914
2999
 
2915
- check_relation(sub_type: arg_type, super_type: param_type, constraints: constraints).else do
2916
- errors << Errors::ArgumentTypeMismatch.new(node: arg_node,
2917
- receiver_type: receiver_type,
2918
- expected: param_type,
2919
- actual: arg_type)
3000
+ check_relation(sub_type: arg_type, super_type: param_type, constraints: constraints).else do |result|
3001
+ errors << Diagnostic::Ruby::ArgumentTypeMismatch.new(node: arg_node,
3002
+ receiver_type: receiver_type,
3003
+ expected: param_type,
3004
+ actual: arg_type,
3005
+ result: result)
2920
3006
  end
2921
3007
  else
2922
3008
  # keyword
@@ -2925,7 +3011,7 @@ module Steep
2925
3011
  method_type: method_type,
2926
3012
  constraints: constraints)
2927
3013
 
2928
- if result.is_a?(Errors::Base)
3014
+ if result.is_a?(Diagnostic::Ruby::Base)
2929
3015
  errors << result
2930
3016
  end
2931
3017
  end
@@ -2961,7 +3047,7 @@ module Steep
2961
3047
 
2962
3048
  if param.type
2963
3049
  check_relation(sub_type: type, super_type: param.type, constraints: constraints).else do |result|
2964
- error = Errors::IncompatibleAssignment.new(
3050
+ error = Diagnostic::Ruby::IncompatibleAssignment.new(
2965
3051
  node: param.node,
2966
3052
  lhs_type: param.type,
2967
3053
  rhs_type: type,
@@ -3005,36 +3091,20 @@ module Steep
3005
3091
  end
3006
3092
 
3007
3093
  when Subtyping::Result::Failure
3008
- given_block_type = AST::Types::Proc.new(
3009
- type: Interface::Function.new(
3010
- params: method_type.block.type.params || block_params.params_type,
3011
- return_type: block_body_type,
3012
- location: nil
3013
- ),
3014
- block: nil
3015
- )
3016
-
3017
- method_block_type = AST::Types::Proc.new(
3018
- type: Interface::Function.new(
3019
- params: method_type.block.type.params,
3020
- return_type: method_type.block.type.return_type,
3021
- location: nil
3022
- ),
3023
- block: nil
3094
+ errors << Diagnostic::Ruby::BlockBodyTypeMismatch.new(
3095
+ node: node,
3096
+ expected: method_type.block.type.return_type,
3097
+ actual: block_body_type,
3098
+ result: result
3024
3099
  )
3025
3100
 
3026
- errors << Errors::BlockTypeMismatch.new(node: node,
3027
- expected: method_block_type,
3028
- actual: given_block_type,
3029
- result: result)
3030
-
3031
3101
  return_type = method_type.type.return_type
3032
3102
  end
3033
3103
 
3034
3104
  block_constr.typing.save!
3035
3105
 
3036
3106
  rescue Subtyping::Constraints::UnsatisfiableConstraint => exn
3037
- errors << Errors::UnsatisfiableConstraint.new(
3107
+ errors << Diagnostic::Ruby::UnsatisfiableConstraint.new(
3038
3108
  node: node,
3039
3109
  method_type: method_type,
3040
3110
  var: exn.var,
@@ -3052,7 +3122,7 @@ module Steep
3052
3122
  method_type = method_type.subst(s)
3053
3123
  end
3054
3124
  else
3055
- errors << Errors::UnsupportedSyntax.new(
3125
+ errors << Diagnostic::Ruby::UnsupportedSyntax.new(
3056
3126
  node: block_params,
3057
3127
  message: "Unsupported block params pattern, probably masgn?"
3058
3128
  )
@@ -3067,7 +3137,7 @@ module Steep
3067
3137
  errors << error
3068
3138
  end
3069
3139
 
3070
- errors << Errors::UnexpectedBlockGiven.new(
3140
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
3071
3141
  node: node,
3072
3142
  method_type: method_type
3073
3143
  )
@@ -3085,7 +3155,7 @@ module Steep
3085
3155
  s = constraints.solution(checker, variance: variance, variables: fresh_vars, self_type: self_type)
3086
3156
  method_type = method_type.subst(s)
3087
3157
 
3088
- errors << Errors::UnexpectedBlockGiven.new(
3158
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
3089
3159
  node: node,
3090
3160
  method_type: method_type
3091
3161
  )
@@ -3093,7 +3163,7 @@ module Steep
3093
3163
  else
3094
3164
  unless args.block_pass_arg
3095
3165
  # Required block is missing
3096
- errors << Errors::RequiredBlockMissing.new(
3166
+ errors << Diagnostic::Ruby::RequiredBlockMissing.new(
3097
3167
  node: node,
3098
3168
  method_type: method_type
3099
3169
  )
@@ -3118,10 +3188,12 @@ module Steep
3118
3188
 
3119
3189
  result = check_relation(sub_type: given_block_type, super_type: method_block_type, constraints: constraints)
3120
3190
  result.else do |result|
3121
- errors << Errors::BlockTypeMismatch.new(node: node,
3122
- expected: method_block_type,
3123
- actual: given_block_type,
3124
- result: result)
3191
+ errors << Diagnostic::Ruby::BlockTypeMismatch.new(
3192
+ node: args.block_pass_arg,
3193
+ expected: method_block_type,
3194
+ actual: given_block_type,
3195
+ result: result
3196
+ )
3125
3197
  end
3126
3198
 
3127
3199
  method_type = method_type.subst(constraints.solution(checker, self_type: self_type, variance: variance, variables: method_type.free_variables))
@@ -3178,7 +3250,7 @@ module Steep
3178
3250
  if expected_block_type = block_constr.block_context.body_type
3179
3251
  block_constr.check_relation(sub_type: block_type, super_type: expected_block_type).else do |result|
3180
3252
  block_constr.typing.add_error(
3181
- Errors::BlockBodyTypeMismatch.new(
3253
+ Diagnostic::Ruby::BlockBodyTypeMismatch.new(
3182
3254
  node: node,
3183
3255
  expected: expected_block_type,
3184
3256
  actual: block_type,
@@ -3391,10 +3463,14 @@ module Steep
3391
3463
  # ok
3392
3464
  else
3393
3465
  if module_name.name == module_context&.class_name
3394
- typing.add_error Errors::MethodDefinitionMissing.new(node: node,
3395
- module_name: module_name.name,
3396
- kind: :instance,
3397
- missing_method: method_name)
3466
+ typing.add_error(
3467
+ Diagnostic::Ruby::MethodDefinitionMissing.new(
3468
+ node: node,
3469
+ module_name: module_name.name,
3470
+ kind: :instance,
3471
+ missing_method: method_name
3472
+ )
3473
+ )
3398
3474
  end
3399
3475
  end
3400
3476
  end
@@ -3406,26 +3482,32 @@ module Steep
3406
3482
  # ok
3407
3483
  else
3408
3484
  if module_name.name == module_context&.class_name
3409
- typing.add_error Errors::MethodDefinitionMissing.new(node: node,
3410
- module_name: module_name.name,
3411
- kind: :module,
3412
- missing_method: method_name)
3485
+ typing.add_error(
3486
+ Diagnostic::Ruby::MethodDefinitionMissing.new(node: node,
3487
+ module_name: module_name.name,
3488
+ kind: :module,
3489
+ missing_method: method_name)
3490
+ )
3413
3491
  end
3414
3492
  end
3415
3493
  end
3416
3494
 
3417
3495
  annotations.instance_dynamics.each do |method_name|
3418
3496
  unless expected_instance_method_names.member?(method_name)
3419
- typing.add_error Errors::UnexpectedDynamicMethod.new(node: node,
3420
- module_name: module_name.name,
3421
- method_name: method_name)
3497
+ typing.add_error(
3498
+ Diagnostic::Ruby::UnexpectedDynamicMethod.new(node: node,
3499
+ module_name: module_name.name,
3500
+ method_name: method_name)
3501
+ )
3422
3502
  end
3423
3503
  end
3424
3504
  annotations.module_dynamics.each do |method_name|
3425
3505
  unless expected_module_method_names.member?(method_name)
3426
- typing.add_error Errors::UnexpectedDynamicMethod.new(node: node,
3427
- module_name: module_name.name,
3428
- method_name: method_name)
3506
+ typing.add_error(
3507
+ Diagnostic::Ruby::UnexpectedDynamicMethod.new(node: node,
3508
+ module_name: module_name.name,
3509
+ method_name: method_name)
3510
+ )
3429
3511
  end
3430
3512
  end
3431
3513
  end
@@ -3453,7 +3535,7 @@ module Steep
3453
3535
  if block_given?
3454
3536
  typing.add_error yield
3455
3537
  else
3456
- typing.add_error Errors::FallbackAny.new(node: node)
3538
+ typing.add_error Diagnostic::Ruby::FallbackAny.new(node: node)
3457
3539
  end
3458
3540
 
3459
3541
  add_typing node, type: AST::Builtin.any_type