steep 0.12.0 → 0.13.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b3a5b5a55253f50083410cd7d58bf7cda545301d9a7d5b72a5a8fd3865a76e93
4
- data.tar.gz: fcf1273fc81c720266d4cdf2456d996b8f406137b204bb22fe1ad25852850a0a
3
+ metadata.gz: 0e95857ced793435c07c948b2a51ac914c52816811ae8e5d18337bcf946eb33d
4
+ data.tar.gz: 9038e63999222be3e0b7172aa423056ef7792b905e1d277271fa795b6ca06889
5
5
  SHA512:
6
- metadata.gz: a6e6dc76cf7aaf2cdf97965733d6762a1fb75d314d0dd8f859cc617296a433a002a512c829828a927bc43718e2f44776332f1c739d894460d8828195853a24c9
7
- data.tar.gz: c3daca75b0a4846302665a9d165f13de175e1e5436d3605fa5c53948bc5548b1a36a19a43e4200d4f3b37ce257e8369ec645602ccb15b419b5fae0f1c34e39b1
6
+ metadata.gz: 2747b3e5f3303ae48a91e76b2256cd1e402e7022caa714083267da0820f1bce2d81188586e551a10158d4c6716ab7a8db8562aa84b31c98731872b08d05048c9
7
+ data.tar.gz: 9d5bd44685d8228ee304bdaf94ae52e5eef2a2871580e7190ef941ea510406eab28bdb3aa6849fd9234649da10cd9344e2c38ba309a11a73cca70c6ed7e946e3
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.13.0 (2020-02-16)
6
+
7
+ * Improve LSP _hover_ support. ([#117](https://github.com/soutaro/steep/pull/117))
8
+
5
9
  ## 0.12.0 (2020-02-11)
6
10
 
7
11
  * Add `Steepfile` for configuration
data/README.md CHANGED
@@ -204,6 +204,14 @@ Generally, these are by our design.
204
204
 
205
205
  You can find examples in `smoke` directory.
206
206
 
207
+ ## IDEs
208
+
209
+ Steep implements some of the Language Server Protocol features. You can use Steep with VSCode and its plugin.
210
+
211
+ - https://github.com/soutaro/steep-vscode
212
+
213
+ Other LSP supporting tools may work with Steep where it starts the server as `steep langserver`.
214
+
207
215
  ## Development
208
216
 
209
217
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/lib/steep.rb CHANGED
@@ -60,6 +60,7 @@ require "steep/annotation_parser"
60
60
  require "steep/typing"
61
61
  require "steep/errors"
62
62
  require "steep/type_construction"
63
+ require "steep/type_inference/context"
63
64
  require "steep/type_inference/send_args"
64
65
  require "steep/type_inference/block_params"
65
66
  require "steep/type_inference/constant_env"
@@ -72,6 +73,7 @@ require "steep/project/options"
72
73
  require "steep/project/target"
73
74
  require "steep/project/dsl"
74
75
  require "steep/project/file_loader"
76
+ require "steep/project/hover_content"
75
77
  require "steep/drivers/utils/driver_helper"
76
78
  require "steep/drivers/check"
77
79
  require "steep/drivers/validate"
@@ -187,6 +187,8 @@ module Steep
187
187
  [diagnostics_raw(source.status.error.message, source.status.location)]
188
188
  when Project::SourceFile::ParseErrorStatus
189
189
  []
190
+ when Project::SourceFile::TypeCheckErrorStatus
191
+ []
190
192
  end
191
193
 
192
194
  report_diagnostics source.path, diagnostics
@@ -264,22 +266,71 @@ module Steep
264
266
  def response_to_hover(path:, line:, column:)
265
267
  Steep.logger.info { "path=#{path}, line=#{line}, column=#{column}" }
266
268
 
267
- # line in LSP is zero-origin
268
- project.type_of_node(path: path, line: line + 1, column: column) do |type, node|
269
- Steep.logger.warn { "node = #{node.type}, type = #{type.to_s}" }
270
-
271
- start_position = { line: node.location.line - 1, character: node.location.column }
272
- end_position = { line: node.location.last_line - 1, character: node.location.last_column }
273
- range = { start: start_position, end: end_position }
274
-
275
- Steep.logger.warn { "range = #{range.inspect}" }
269
+ hover = Project::HoverContent.new(project: project)
270
+ content = hover.content_for(path: path, line: line+1, column: column+1)
271
+ if content
272
+ range = content.location.yield_self do |location|
273
+ start_position = { line: location.line - 1, character: location.column }
274
+ end_position = { line: location.last_line - 1, character: location.last_column }
275
+ { start: start_position, end: end_position }
276
+ end
276
277
 
277
278
  LanguageServer::Protocol::Interface::Hover.new(
278
- contents: { kind: "markdown", value: "`#{type}`" },
279
+ contents: { kind: "markdown", value: format_hover(content) },
279
280
  range: range
280
281
  )
281
282
  end
282
283
  end
284
+
285
+ def format_hover(content)
286
+ case content
287
+ when Project::HoverContent::VariableContent
288
+ "`#{content.name}`: `#{content.type.to_s}`"
289
+ when Project::HoverContent::MethodCallContent
290
+ method_name = case content.method_name
291
+ when Project::HoverContent::InstanceMethodName
292
+ "#{content.method_name.class_name}##{content.method_name.method_name}"
293
+ when Project::HoverContent::SingletonMethodName
294
+ "#{content.method_name.class_name}.#{content.method_name.method_name}"
295
+ else
296
+ nil
297
+ end
298
+
299
+ if method_name
300
+ string = <<HOVER
301
+ ```
302
+ #{method_name} ~> #{content.type}
303
+ ```
304
+ HOVER
305
+ if content.definition
306
+ if content.definition.comment
307
+ string << "\n----\n\n#{content.definition.comment.string}"
308
+ end
309
+
310
+ string << "\n----\n\n#{content.definition.method_types.map {|x| "- `#{x}`\n" }.join()}"
311
+ end
312
+ else
313
+ "`#{content.type}`"
314
+ end
315
+ when Project::HoverContent::DefinitionContent
316
+ string = <<HOVER
317
+ ```
318
+ def #{content.method_name}: #{content.method_type}
319
+ ```
320
+ HOVER
321
+ if (comment = content.definition.comment)
322
+ string << "\n----\n\n#{comment.string}\n"
323
+ end
324
+
325
+ if content.definition.method_types.size > 1
326
+ string << "\n----\n\n#{content.definition.method_types.map {|x| "- `#{x}`\n" }.join()}"
327
+ end
328
+
329
+ string
330
+ when Project::HoverContent::TypeContent
331
+ "`#{content.type}`"
332
+ end
333
+ end
283
334
  end
284
335
  end
285
336
  end
@@ -1,6 +1,18 @@
1
1
  module Steep
2
2
  module Interface
3
3
  class Substitution
4
+ class InvalidSubstitutionError < StandardError
5
+ attr_reader :vars_size
6
+ attr_reader :types_size
7
+
8
+ def initialize(vars_size:, types_size:)
9
+ @var_size = vars_size
10
+ @types_size = types_size
11
+
12
+ super "Invalid substitution: vars.size=#{vars_size}, types.size=#{types_size}"
13
+ end
14
+ end
15
+
4
16
  attr_reader :dictionary
5
17
  attr_reader :instance_type
6
18
  attr_reader :module_type
@@ -42,7 +54,7 @@ module Steep
42
54
  def self.build(vars, types = nil, instance_type: AST::Types::Instance.new, module_type: AST::Types::Class.new, self_type: AST::Types::Self.new)
43
55
  types ||= vars.map {|var| AST::Types::Var.fresh(var) }
44
56
 
45
- raise "Invalid substitution: vars.size=#{vars.size}, types.size=#{types.size}" unless vars.size == types.size
57
+ raise InvalidSubstitutionError.new(vars_size: vars.size, types_size: types.size) unless vars.size == types.size
46
58
 
47
59
  dic = vars.zip(types).each.with_object({}) do |(var, type), d|
48
60
  d[var] = type
data/lib/steep/project.rb CHANGED
@@ -24,6 +24,7 @@ module Steep
24
24
  source_file = targets.map {|target| target.source_files[path] }.compact[0]
25
25
 
26
26
  if source_file
27
+
27
28
  case (status = source_file.status)
28
29
  when SourceFile::TypeCheckStatus
29
30
  node = status.source.find_node(line: line, column: column)
@@ -11,6 +11,7 @@ module Steep
11
11
  ParseErrorStatus = Struct.new(:error, keyword_init: true)
12
12
  AnnotationSyntaxErrorStatus = Struct.new(:error, :location, keyword_init: true)
13
13
  TypeCheckStatus = Struct.new(:typing, :source, :timestamp, keyword_init: true)
14
+ TypeCheckErrorStatus = Struct.new(:error, keyword_init: true)
14
15
 
15
16
  def initialize(path:)
16
17
  @path = path
@@ -62,20 +63,22 @@ module Steep
62
63
  checker: subtyping,
63
64
  annotations: annotations,
64
65
  source: source,
65
- self_type: AST::Builtin::Object.instance_type,
66
- block_context: nil,
67
- module_context: TypeConstruction::ModuleContext.new(
68
- instance_type: nil,
69
- module_type: nil,
70
- implement_name: nil,
71
- current_namespace: AST::Namespace.root,
72
- const_env: const_env,
73
- class_name: nil
66
+ context: TypeInference::Context.new(
67
+ block_context: nil,
68
+ module_context: TypeInference::Context::ModuleContext.new(
69
+ instance_type: nil,
70
+ module_type: nil,
71
+ implement_name: nil,
72
+ current_namespace: AST::Namespace.root,
73
+ const_env: const_env,
74
+ class_name: nil
75
+ ),
76
+ method_context: nil,
77
+ break_context: nil,
78
+ self_type: AST::Builtin::Object.instance_type,
79
+ type_env: type_env
74
80
  ),
75
- method_context: nil,
76
- typing: typing,
77
- break_context: nil,
78
- type_env: type_env
81
+ typing: typing
79
82
  )
80
83
 
81
84
  construction.synthesize(source.node)
@@ -86,6 +89,8 @@ module Steep
86
89
  source: source,
87
90
  timestamp: Time.now
88
91
  )
92
+ rescue => exn
93
+ @status = TypeCheckErrorStatus.new(error: exn)
89
94
  end
90
95
 
91
96
  true
@@ -0,0 +1,128 @@
1
+ module Steep
2
+ class Project
3
+ class HoverContent
4
+ TypeContent = Struct.new(:node, :type, :location, keyword_init: true)
5
+ VariableContent = Struct.new(:node, :name, :type, :location, keyword_init: true)
6
+ MethodCallContent = Struct.new(:node, :method_name, :type, :definition, :location, keyword_init: true)
7
+ DefinitionContent = Struct.new(:node, :method_name, :method_type, :definition, :location, keyword_init: true)
8
+
9
+ InstanceMethodName = Struct.new(:class_name, :method_name)
10
+ SingletonMethodName = Struct.new(:class_name, :method_name)
11
+
12
+ attr_reader :project
13
+
14
+ def initialize(project:)
15
+ @project = project
16
+ end
17
+
18
+ def method_definition_for(factory, module_name, singleton_method: nil, instance_method: nil)
19
+ type_name = factory.type_name_1(module_name)
20
+
21
+ case
22
+ when instance_method
23
+ factory.definition_builder.build_instance(type_name).methods[instance_method]
24
+ when singleton_method
25
+ methods = factory.definition_builder.build_singleton(type_name).methods
26
+
27
+ if singleton_method == :new
28
+ methods[:new] || methods[:initialize]
29
+ else
30
+ methods[singleton_method]
31
+ end
32
+ end
33
+ end
34
+
35
+ def content_for(path:, line:, column:)
36
+ source_file = project.targets.map {|target| target.source_files[path] }.compact[0]
37
+
38
+ if source_file
39
+ case (status = source_file.status)
40
+ when SourceFile::TypeCheckStatus
41
+ node, *parents = status.source.find_nodes(line: line, column: column)
42
+
43
+ if node
44
+ case node.type
45
+ when :lvar, :lvasgn
46
+ var_name = node.children[0]
47
+ context = status.typing.context_of(node: node)
48
+ var_type = context.type_env.get(lvar: var_name.name)
49
+
50
+ VariableContent.new(node: node, name: var_name.name, type: var_type, location: node.location.name)
51
+ when :send
52
+ receiver, method_name, *_ = node.children
53
+
54
+
55
+ result_node = if parents[0]&.type == :block
56
+ parents[0]
57
+ else
58
+ node
59
+ end
60
+
61
+ context = status.typing.context_of(node: result_node)
62
+
63
+ receiver_type = if receiver
64
+ status.typing.type_of(node: receiver)
65
+ else
66
+ context.self_type
67
+ end
68
+
69
+ factory = context.type_env.subtyping.factory
70
+ method_name, definition = case receiver_type
71
+ when AST::Types::Name::Instance
72
+ method_definition = method_definition_for(factory, receiver_type.name, instance_method: method_name)
73
+ if method_definition&.defined_in
74
+ owner_name = factory.type_name(method_definition.defined_in.name.absolute!)
75
+ [
76
+ InstanceMethodName.new(owner_name, method_name),
77
+ method_definition
78
+ ]
79
+ end
80
+ when AST::Types::Name::Class
81
+ method_definition = method_definition_for(factory, receiver_type.name, singleton_method: method_name)
82
+ if method_definition&.defined_in
83
+ owner_name = factory.type_name(method_definition.defined_in.name.absolute!)
84
+ [
85
+ SingletonMethodName.new(owner_name, method_name),
86
+ method_definition
87
+ ]
88
+ end
89
+ else
90
+ nil
91
+ end
92
+
93
+ MethodCallContent.new(
94
+ node: node,
95
+ method_name: method_name,
96
+ type: status.typing.type_of(node: result_node),
97
+ definition: definition,
98
+ location: result_node.location.expression
99
+ )
100
+ when :def, :defs
101
+ context = status.typing.context_of(node: node)
102
+ method_context = context.method_context
103
+
104
+ if method_context
105
+ DefinitionContent.new(
106
+ node: node,
107
+ method_name: method_context.name,
108
+ method_type: method_context.method_type,
109
+ definition: method_context.method,
110
+ location: node.loc.expression
111
+ )
112
+ end
113
+ else
114
+ type = status.typing.type_of(node: node)
115
+
116
+ TypeContent.new(
117
+ node: node,
118
+ type: type,
119
+ location: node.location.expression
120
+ )
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
data/lib/steep/source.rb CHANGED
@@ -294,8 +294,7 @@ module Steep
294
294
  end
295
295
  end
296
296
 
297
- # @type method find_node: (line: Integer, column: Integer, ?node: any, ?position: Integer?) -> any
298
- def find_node(line:, column:, node: self.node, position: nil)
297
+ def find_nodes(line:, column:, node: self.node, position: nil, parents: [])
299
298
  position ||= (line-1).times.sum do |i|
300
299
  node.location.expression.source_buffer.source_line(i+1).size + 1
301
300
  end + column
@@ -306,14 +305,13 @@ module Steep
306
305
 
307
306
  if range
308
307
  if range === position
308
+ parents.unshift node
309
+
309
310
  Source.each_child_node(node) do |child|
310
- n = find_node(line: line, column: column, node: child, position: position)
311
- if n
312
- return n
313
- end
311
+ ns = find_nodes(line: line, column: column, node: child, position: position, parents: parents) and return ns
314
312
  end
315
313
 
316
- node
314
+ parents
317
315
  end
318
316
  end
319
317
  end
@@ -1,97 +1,43 @@
1
1
  module Steep
2
2
  class TypeConstruction
3
- class MethodContext
4
- attr_reader :name
5
- attr_reader :method
6
- attr_reader :method_type
7
- attr_reader :return_type
8
- attr_reader :constructor
9
- attr_reader :super_method
10
-
11
- def initialize(name:, method:, method_type:, return_type:, constructor:, super_method:)
12
- @name = name
13
- @method = method
14
- @return_type = return_type
15
- @method_type = method_type
16
- @constructor = constructor
17
- @super_method = super_method
18
- end
19
-
20
- def block_type
21
- method_type&.block
22
- end
23
- end
3
+ attr_reader :checker
4
+ attr_reader :source
5
+ attr_reader :annotations
6
+ attr_reader :typing
7
+ attr_reader :type_env
24
8
 
25
- class BlockContext
26
- attr_reader :body_type
9
+ attr_reader :context
27
10
 
28
- def initialize(body_type:)
29
- @body_type = body_type
30
- end
11
+ def module_context
12
+ context.module_context
31
13
  end
32
14
 
33
- class BreakContext
34
- attr_reader :break_type
35
- attr_reader :next_type
15
+ def method_context
16
+ context.method_context
17
+ end
36
18
 
37
- def initialize(break_type:, next_type:)
38
- @break_type = break_type
39
- @next_type = next_type
40
- end
19
+ def block_context
20
+ context.block_context
41
21
  end
42
22
 
43
- class ModuleContext
44
- attr_reader :instance_type
45
- attr_reader :module_type
46
- attr_reader :defined_instance_methods
47
- attr_reader :defined_module_methods
48
- attr_reader :const_env
49
- attr_reader :implement_name
50
- attr_reader :current_namespace
51
- attr_reader :class_name
52
- attr_reader :instance_definition
53
- attr_reader :module_definition
54
-
55
- def initialize(instance_type:, module_type:, implement_name:, current_namespace:, const_env:, class_name:, instance_definition: nil, module_definition: nil)
56
- @instance_type = instance_type
57
- @module_type = module_type
58
- @defined_instance_methods = Set.new
59
- @defined_module_methods = Set.new
60
- @implement_name = implement_name
61
- @current_namespace = current_namespace
62
- @const_env = const_env
63
- @class_name = class_name
64
- @instance_definition = instance_definition
65
- @module_definition = module_definition
66
- end
23
+ def break_context
24
+ context.break_context
25
+ end
67
26
 
68
- def const_context
69
- const_env.context
70
- end
27
+ def self_type
28
+ context.self_type
71
29
  end
72
30
 
73
- attr_reader :checker
74
- attr_reader :source
75
- attr_reader :annotations
76
- attr_reader :typing
77
- attr_reader :method_context
78
- attr_reader :block_context
79
- attr_reader :module_context
80
- attr_reader :self_type
81
- attr_reader :break_context
82
- attr_reader :type_env
31
+ def type_env
32
+ context.type_env
33
+ end
83
34
 
84
- def initialize(checker:, source:, annotations:, type_env:, typing:, self_type:, method_context:, block_context:, module_context:, break_context:)
35
+ def initialize(checker:, source:, annotations:, typing:, context:)
85
36
  @checker = checker
86
37
  @source = source
87
38
  @annotations = annotations
88
39
  @typing = typing
89
- @self_type = self_type
90
- @block_context = block_context
91
- @method_context = method_context
92
- @module_context = module_context
93
- @break_context = break_context
94
- @type_env = type_env
40
+ @context = context
95
41
  end
96
42
 
97
43
  def with_new_typing(typing)
@@ -99,13 +45,8 @@ module Steep
99
45
  checker: checker,
100
46
  source: source,
101
47
  annotations: annotations,
102
- type_env: type_env,
103
48
  typing: typing,
104
- self_type: self_type,
105
- method_context: method_context,
106
- block_context: block_context,
107
- module_context: module_context,
108
- break_context: break_context
49
+ context: context
109
50
  )
110
51
  end
111
52
 
@@ -173,7 +114,7 @@ module Steep
173
114
  end
174
115
  end
175
116
 
176
- method_context = MethodContext.new(
117
+ method_context = TypeInference::Context::MethodContext.new(
177
118
  name: method_name,
178
119
  method: definition && definition.methods[method_name],
179
120
  method_type: method_type,
@@ -205,13 +146,15 @@ module Steep
205
146
  checker: checker,
206
147
  source: source,
207
148
  annotations: annots,
208
- type_env: type_env,
209
- block_context: nil,
210
- self_type: annots.self_type || self_type,
211
- method_context: method_context,
149
+ context: TypeInference::Context.new(
150
+ method_context: method_context,
151
+ module_context: module_context,
152
+ block_context: nil,
153
+ break_context: nil,
154
+ self_type: annots.self_type || self_type,
155
+ type_env: type_env
156
+ ),
212
157
  typing: typing,
213
- module_context: module_context,
214
- break_context: nil
215
158
  )
216
159
  end
217
160
 
@@ -283,7 +226,7 @@ module Steep
283
226
  end
284
227
  module_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
285
228
 
286
- module_context_ = ModuleContext.new(
229
+ module_context_ = TypeInference::Context::ModuleContext.new(
287
230
  instance_type: instance_type,
288
231
  module_type: annots.self_type || module_type,
289
232
  implement_name: implement_module_name,
@@ -303,13 +246,15 @@ module Steep
303
246
  checker: checker,
304
247
  source: source,
305
248
  annotations: annots,
306
- type_env: module_type_env,
307
249
  typing: typing,
308
- method_context: nil,
309
- block_context: nil,
310
- module_context: module_context_,
311
- self_type: module_context_.module_type,
312
- break_context: nil
250
+ context: TypeInference::Context.new(
251
+ method_context: nil,
252
+ block_context: nil,
253
+ break_context: nil,
254
+ module_context: module_context_,
255
+ self_type: module_context_.module_type,
256
+ type_env: module_type_env
257
+ )
313
258
  )
314
259
  end
315
260
 
@@ -380,7 +325,7 @@ module Steep
380
325
  end
381
326
  class_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
382
327
 
383
- module_context = ModuleContext.new(
328
+ module_context = TypeInference::Context::ModuleContext.new(
384
329
  instance_type: annots.instance_type || instance_type,
385
330
  module_type: annots.self_type || annots.module_type || module_type,
386
331
  implement_name: implement_module_name,
@@ -401,21 +346,21 @@ module Steep
401
346
  checker: checker,
402
347
  source: source,
403
348
  annotations: annots,
404
- type_env: class_type_env,
405
349
  typing: typing,
406
- method_context: nil,
407
- block_context: nil,
408
- module_context: module_context,
409
- self_type: module_context.module_type,
410
- break_context: nil
350
+ context: TypeInference::Context.new(
351
+ method_context: nil,
352
+ block_context: nil,
353
+ module_context: module_context,
354
+ break_context: nil,
355
+ self_type: module_context.module_type,
356
+ type_env: class_type_env
357
+ )
411
358
  )
412
359
  end
413
360
 
414
- def for_branch(node, truthy_vars: Set.new, type_case_override: nil)
361
+ def for_branch(node, truthy_vars: Set.new, type_case_override: nil, break_context: context.break_context)
415
362
  annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
416
363
 
417
- type_env = self.type_env
418
-
419
364
  lvar_types = self.type_env.lvar_types.each.with_object({}) do |(var, type), env|
420
365
  if truthy_vars.member?(var)
421
366
  env[var] = unwrap(type)
@@ -423,7 +368,8 @@ module Steep
423
368
  env[var] = type
424
369
  end
425
370
  end
426
- type_env = type_env.with_annotations(lvar_types: lvar_types, self_type: self_type) do |var, relation, result|
371
+
372
+ type_env = self.type_env.with_annotations(lvar_types: lvar_types, self_type: self_type) do |var, relation, result|
427
373
  raise "Unexpected annotate failure: #{relation}"
428
374
  end
429
375
 
@@ -453,23 +399,18 @@ module Steep
453
399
  )
454
400
  end
455
401
 
456
- with(type_env: type_env)
402
+ with(context: context.with(type_env: type_env, break_context: break_context))
457
403
  end
458
404
 
459
405
  NOTHING = ::Object.new
460
406
 
461
- def with(annotations: NOTHING, type_env: NOTHING, method_context: NOTHING, block_context: NOTHING, module_context: NOTHING, self_type: NOTHING, break_context: NOTHING)
407
+ def with(annotations: NOTHING, context: NOTHING)
462
408
  self.class.new(
463
409
  checker: checker,
464
410
  source: source,
465
411
  annotations: annotations.equal?(NOTHING) ? self.annotations : annotations,
466
- type_env: type_env.equal?(NOTHING) ? self.type_env : type_env,
467
412
  typing: typing,
468
- method_context: method_context.equal?(NOTHING) ? self.method_context : method_context,
469
- block_context: block_context.equal?(NOTHING) ? self.block_context : block_context,
470
- module_context: module_context.equal?(NOTHING) ? self.module_context : module_context,
471
- self_type: self_type.equal?(NOTHING) ? self.self_type : self_type,
472
- break_context: break_context.equal?(NOTHING) ? self.break_context : break_context
413
+ context: context.equal?(NOTHING) ? self.context : context
473
414
  )
474
415
  end
475
416
 
@@ -489,7 +430,7 @@ module Steep
489
430
  type = AST::Builtin.nil_type
490
431
  end
491
432
 
492
- typing.add_typing(node, type)
433
+ typing.add_typing(node, type, context)
493
434
  end
494
435
 
495
436
  when :lvasgn
@@ -500,9 +441,9 @@ module Steep
500
441
  case var.name
501
442
  when :_, :__any__
502
443
  synthesize(rhs, hint: AST::Builtin.any_type)
503
- typing.add_typing(node, AST::Builtin.any_type)
444
+ typing.add_typing(node, AST::Builtin.any_type, context)
504
445
  when :__skip__
505
- typing.add_typing(node, AST::Builtin.any_type)
446
+ typing.add_typing(node, AST::Builtin.any_type, context)
506
447
  else
507
448
  type_assignment(var, rhs, node, hint: hint)
508
449
  end
@@ -515,7 +456,7 @@ module Steep
515
456
  fallback_to_any node
516
457
  end
517
458
 
518
- typing.add_typing node, type
459
+ typing.add_typing node, type, context
519
460
  end
520
461
 
521
462
  when :ivasgn
@@ -530,7 +471,7 @@ module Steep
530
471
  type = type_env.get(ivar: name) do
531
472
  fallback_to_any node
532
473
  end
533
- typing.add_typing(node, type)
474
+ typing.add_typing(node, type, context)
534
475
  end
535
476
 
536
477
  when :send
@@ -543,7 +484,7 @@ module Steep
543
484
  module_type
544
485
  end
545
486
 
546
- typing.add_typing(node, type)
487
+ typing.add_typing(node, type, context)
547
488
  else
548
489
  type_send(node, send_node: node, block_params: nil, block_body: nil)
549
490
  end
@@ -558,7 +499,7 @@ module Steep
558
499
  else
559
500
  module_type
560
501
  end
561
- typing.add_typing(node, type)
502
+ typing.add_typing(node, type, context)
562
503
  else
563
504
  type_send(node, send_node: node, block_params: nil, block_body: nil, unwrap: true)
564
505
  end
@@ -570,7 +511,7 @@ module Steep
570
511
  each_child_node(node) do |child|
571
512
  synthesize(child)
572
513
  end
573
- typing.add_typing(node, AST::Builtin.any_type)
514
+ typing.add_typing(node, AST::Builtin.any_type, context)
574
515
 
575
516
  when :op_asgn
576
517
  yield_self do
@@ -594,7 +535,7 @@ module Steep
594
535
 
595
536
  case
596
537
  when lhs_type == AST::Builtin.any_type
597
- typing.add_typing(node, lhs_type)
538
+ typing.add_typing(node, lhs_type, context)
598
539
  when !lhs_type
599
540
  fallback_to_any(node)
600
541
  else
@@ -627,7 +568,7 @@ module Steep
627
568
  typing.add_error Errors::NoMethod.new(node: node, method: op, type: expand_self(lhs_type))
628
569
  end
629
570
 
630
- typing.add_typing(node, lhs_type)
571
+ typing.add_typing(node, lhs_type, context)
631
572
  end
632
573
  end
633
574
 
@@ -656,7 +597,7 @@ module Steep
656
597
  block_body: nil,
657
598
  topdown_hint: true)
658
599
 
659
- typing.add_typing node, return_type
600
+ typing.add_typing node, return_type, context
660
601
  else
661
602
  fallback_to_any node do
662
603
  Errors::UnexpectedSuper.new(node: node, method: method_context.name)
@@ -717,7 +658,7 @@ module Steep
717
658
  module_context.defined_instance_methods << node.children[0]
718
659
  end
719
660
 
720
- typing.add_typing(node, AST::Builtin.any_type)
661
+ typing.add_typing(node, AST::Builtin.any_type, new.context)
721
662
 
722
663
  when :defs
723
664
  synthesize(node.children[0]).tap do |self_type|
@@ -762,7 +703,7 @@ module Steep
762
703
  end
763
704
  end
764
705
 
765
- typing.add_typing(node, AST::Builtin::Symbol.instance_type)
706
+ typing.add_typing(node, AST::Builtin::Symbol.instance_type, context)
766
707
 
767
708
  when :return
768
709
  yield_self do
@@ -791,7 +732,7 @@ module Steep
791
732
  end
792
733
  end
793
734
 
794
- typing.add_typing(node, AST::Builtin.any_type)
735
+ typing.add_typing(node, AST::Builtin.any_type, context)
795
736
  end
796
737
 
797
738
  when :break
@@ -817,7 +758,7 @@ module Steep
817
758
  typing.add_error Errors::UnexpectedJump.new(node: node)
818
759
  end
819
760
 
820
- typing.add_typing(node, AST::Builtin.any_type)
761
+ typing.add_typing(node, AST::Builtin.any_type, context)
821
762
 
822
763
  when :next
823
764
  value = node.children[0]
@@ -842,13 +783,13 @@ module Steep
842
783
  typing.add_error Errors::UnexpectedJump.new(node: node)
843
784
  end
844
785
 
845
- typing.add_typing(node, AST::Builtin.any_type)
786
+ typing.add_typing(node, AST::Builtin.any_type, context)
846
787
 
847
788
  when :retry
848
789
  unless break_context
849
790
  typing.add_error Errors::UnexpectedJump.new(node: node)
850
791
  end
851
- typing.add_typing(node, AST::Builtin.any_type)
792
+ typing.add_typing(node, AST::Builtin.any_type, context)
852
793
 
853
794
  when :arg, :kwarg, :procarg0
854
795
  yield_self do
@@ -856,7 +797,7 @@ module Steep
856
797
  type = type_env.get(lvar: var.name) do
857
798
  fallback_to_any node
858
799
  end
859
- typing.add_typing(node, type)
800
+ typing.add_typing(node, type, context)
860
801
  end
861
802
 
862
803
  when :optarg, :kwoptarg
@@ -874,7 +815,7 @@ module Steep
874
815
  AST::Builtin::Array.instance_type(AST::Builtin.any_type)
875
816
  end
876
817
 
877
- typing.add_typing(node, type)
818
+ typing.add_typing(node, type, context)
878
819
  end
879
820
 
880
821
  when :kwrestarg
@@ -885,23 +826,23 @@ module Steep
885
826
  AST::Builtin::Hash.instance_type(AST::Builtin::Symbol.instance_type, AST::Builtin.any_type)
886
827
  end
887
828
 
888
- typing.add_typing(node, type)
829
+ typing.add_typing(node, type, context)
889
830
  end
890
831
 
891
832
  when :float
892
- typing.add_typing(node, AST::Builtin::Float.instance_type)
833
+ typing.add_typing(node, AST::Builtin::Float.instance_type, context)
893
834
 
894
835
  when :nil
895
- typing.add_typing(node, AST::Builtin.nil_type)
836
+ typing.add_typing(node, AST::Builtin.nil_type, context)
896
837
 
897
838
  when :int
898
839
  yield_self do
899
840
  literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
900
841
 
901
842
  if literal_type
902
- typing.add_typing(node, literal_type)
843
+ typing.add_typing(node, literal_type, context)
903
844
  else
904
- typing.add_typing(node, AST::Builtin::Integer.instance_type)
845
+ typing.add_typing(node, AST::Builtin::Integer.instance_type, context)
905
846
  end
906
847
  end
907
848
 
@@ -910,9 +851,9 @@ module Steep
910
851
  literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
911
852
 
912
853
  if literal_type
913
- typing.add_typing(node, literal_type)
854
+ typing.add_typing(node, literal_type, context)
914
855
  else
915
- typing.add_typing(node, AST::Builtin::Symbol.instance_type)
856
+ typing.add_typing(node, AST::Builtin::Symbol.instance_type, context)
916
857
  end
917
858
  end
918
859
 
@@ -921,14 +862,14 @@ module Steep
921
862
  literal_type = expand_alias(hint) {|hint_| test_literal_type(node.children[0], hint_)}
922
863
 
923
864
  if literal_type
924
- typing.add_typing(node, literal_type)
865
+ typing.add_typing(node, literal_type, context)
925
866
  else
926
- typing.add_typing(node, AST::Builtin::String.instance_type)
867
+ typing.add_typing(node, AST::Builtin::String.instance_type, context)
927
868
  end
928
869
  end
929
870
 
930
871
  when :true, :false
931
- typing.add_typing(node, AST::Types::Boolean.new)
872
+ typing.add_typing(node, AST::Types::Boolean.new, context)
932
873
 
933
874
  when :hash
934
875
  yield_self do
@@ -975,7 +916,7 @@ module Steep
975
916
  typing.add_error Errors::FallbackAny.new(node: node)
976
917
  end
977
918
 
978
- typing.add_typing(node, AST::Builtin::Hash.instance_type(key_type, value_type))
919
+ typing.add_typing(node, AST::Builtin::Hash.instance_type(key_type, value_type), context)
979
920
  end
980
921
 
981
922
  when :dstr, :xstr
@@ -983,14 +924,14 @@ module Steep
983
924
  synthesize(child)
984
925
  end
985
926
 
986
- typing.add_typing(node, AST::Builtin::String.instance_type)
927
+ typing.add_typing(node, AST::Builtin::String.instance_type, context)
987
928
 
988
929
  when :dsym
989
930
  each_child_node(node) do |child|
990
931
  synthesize(child)
991
932
  end
992
933
 
993
- typing.add_typing(node, AST::Builtin::Symbol.instance_type)
934
+ typing.add_typing(node, AST::Builtin::Symbol.instance_type, context)
994
935
 
995
936
  when :class
996
937
  yield_self do
@@ -1002,7 +943,7 @@ module Steep
1002
943
  end
1003
944
  end
1004
945
 
1005
- typing.add_typing(node, AST::Builtin.nil_type)
946
+ typing.add_typing(node, AST::Builtin.nil_type, context)
1006
947
  end
1007
948
 
1008
949
  when :module
@@ -1015,11 +956,11 @@ module Steep
1015
956
  end
1016
957
  end
1017
958
 
1018
- typing.add_typing(node, AST::Builtin.nil_type)
959
+ typing.add_typing(node, AST::Builtin.nil_type, context)
1019
960
  end
1020
961
 
1021
962
  when :self
1022
- typing.add_typing node, AST::Types::Self.new
963
+ typing.add_typing node, AST::Types::Self.new, context
1023
964
 
1024
965
  when :const
1025
966
  const_name = Names::Module.from_node(node)
@@ -1027,7 +968,7 @@ module Steep
1027
968
  type = type_env.get(const: const_name) do
1028
969
  fallback_to_any node
1029
970
  end
1030
- typing.add_typing node, type
971
+ typing.add_typing node, type, context
1031
972
  else
1032
973
  fallback_to_any node
1033
974
  end
@@ -1050,7 +991,7 @@ module Steep
1050
991
  end
1051
992
  end
1052
993
 
1053
- typing.add_typing(node, type)
994
+ typing.add_typing(node, type, context)
1054
995
  else
1055
996
  synthesize(node.children.last)
1056
997
  fallback_to_any(node)
@@ -1072,7 +1013,7 @@ module Steep
1072
1013
  end
1073
1014
  end
1074
1015
 
1075
- typing.add_typing(node, block_type.type.return_type)
1016
+ typing.add_typing(node, block_type.type.return_type, context)
1076
1017
  else
1077
1018
  typing.add_error(Errors::UnexpectedYield.new(node: node))
1078
1019
  fallback_to_any node
@@ -1095,7 +1036,7 @@ module Steep
1095
1036
  raise "Unexpected method_type: #{method_type.inspect}"
1096
1037
  end
1097
1038
  }
1098
- typing.add_typing(node, union_type(*types))
1039
+ typing.add_typing(node, union_type(*types), context)
1099
1040
  else
1100
1041
  typing.add_error(Errors::UnexpectedSuper.new(node: node, method: method_context.name))
1101
1042
  fallback_to_any node
@@ -1117,7 +1058,7 @@ module Steep
1117
1058
  end
1118
1059
  end
1119
1060
 
1120
- typing.add_typing(node, array_type || AST::Builtin::Array.instance_type(AST::Builtin.any_type))
1061
+ typing.add_typing(node, array_type || AST::Builtin::Array.instance_type(AST::Builtin.any_type), context)
1121
1062
  else
1122
1063
  is_tuple = nil
1123
1064
 
@@ -1170,7 +1111,7 @@ module Steep
1170
1111
  array_type = AST::Builtin::Array.instance_type(AST::Types::Union.build(types: element_types))
1171
1112
  end
1172
1113
 
1173
- typing.add_typing(node, array_type)
1114
+ typing.add_typing(node, array_type, context)
1174
1115
  end
1175
1116
  end
1176
1117
 
@@ -1189,9 +1130,9 @@ module Steep
1189
1130
  const_env: nil)])
1190
1131
 
1191
1132
  if left_type.is_a?(AST::Types::Boolean)
1192
- typing.add_typing(node, union_type(left_type, right_type))
1133
+ typing.add_typing(node, union_type(left_type, right_type), context)
1193
1134
  else
1194
- typing.add_typing(node, union_type(right_type, AST::Builtin.nil_type))
1135
+ typing.add_typing(node, union_type(right_type, AST::Builtin.nil_type), context)
1195
1136
  end
1196
1137
  end
1197
1138
 
@@ -1201,7 +1142,7 @@ module Steep
1201
1142
  t1 = synthesize(c1, hint: hint)
1202
1143
  t2 = synthesize(c2, hint: unwrap(t1))
1203
1144
  type = union_type(unwrap(t1), t2)
1204
- typing.add_typing(node, type)
1145
+ typing.add_typing(node, type, context)
1205
1146
  end
1206
1147
 
1207
1148
  when :if
@@ -1224,7 +1165,7 @@ module Steep
1224
1165
  end
1225
1166
 
1226
1167
  type_env.join!([true_env, false_env].compact)
1227
- typing.add_typing(node, union_type(true_type, false_type))
1168
+ typing.add_typing(node, union_type(true_type, false_type), context)
1228
1169
 
1229
1170
  when :case
1230
1171
  yield_self do
@@ -1306,7 +1247,7 @@ module Steep
1306
1247
  end
1307
1248
 
1308
1249
  type_env.join!(envs.compact)
1309
- typing.add_typing(node, union_type(*types))
1250
+ typing.add_typing(node, union_type(*types), context)
1310
1251
  end
1311
1252
 
1312
1253
  when :rescue
@@ -1373,7 +1314,7 @@ module Steep
1373
1314
  type_env.join!([*resbody_envs, else_env].compact)
1374
1315
 
1375
1316
  types = [body_type, *resbody_types, else_type].compact
1376
- typing.add_typing(node, union_type(*types))
1317
+ typing.add_typing(node, union_type(*types), context)
1377
1318
  end
1378
1319
 
1379
1320
  when :resbody
@@ -1382,7 +1323,7 @@ module Steep
1382
1323
  synthesize(klasses) if klasses
1383
1324
  synthesize(asgn) if asgn
1384
1325
  body_type = synthesize(body) if body
1385
- typing.add_typing(node, body_type)
1326
+ typing.add_typing(node, body_type, context)
1386
1327
  end
1387
1328
 
1388
1329
  when :ensure
@@ -1390,7 +1331,7 @@ module Steep
1390
1331
  body, ensure_body = node.children
1391
1332
  body_type = synthesize(body) if body
1392
1333
  synthesize(ensure_body) if ensure_body
1393
- typing.add_typing(node, union_type(body_type))
1334
+ typing.add_typing(node, union_type(body_type), context)
1394
1335
  end
1395
1336
 
1396
1337
  when :masgn
@@ -1404,38 +1345,43 @@ module Steep
1404
1345
  truthy_vars = node.type == :while ? TypeConstruction.truthy_variables(cond) : Set.new
1405
1346
 
1406
1347
  if body
1407
- for_loop = for_branch(body, truthy_vars: truthy_vars).with(break_context: BreakContext.new(break_type: nil, next_type: nil))
1348
+ for_loop = for_branch(body,
1349
+ truthy_vars: truthy_vars,
1350
+ break_context: TypeInference::Context::BreakContext.new(
1351
+ break_type: nil,
1352
+ next_type: nil
1353
+ ))
1408
1354
  for_loop.synthesize(body)
1409
1355
  type_env.join!([for_loop.type_env])
1410
1356
  end
1411
1357
 
1412
- typing.add_typing(node, AST::Builtin.any_type)
1358
+ typing.add_typing(node, AST::Builtin.any_type, context)
1413
1359
  end
1414
1360
 
1415
1361
  when :irange, :erange
1416
1362
  types = node.children.map {|n| synthesize(n)}
1417
1363
  type = AST::Builtin::Range.instance_type(union_type(*types))
1418
- typing.add_typing(node, type)
1364
+ typing.add_typing(node, type, context)
1419
1365
 
1420
1366
  when :regexp
1421
1367
  each_child_node(node) do |child|
1422
1368
  synthesize(child)
1423
1369
  end
1424
1370
 
1425
- typing.add_typing(node, AST::Builtin::Regexp.instance_type)
1371
+ typing.add_typing(node, AST::Builtin::Regexp.instance_type, context)
1426
1372
 
1427
1373
  when :regopt
1428
1374
  # ignore
1429
- typing.add_typing(node, AST::Builtin.any_type)
1375
+ typing.add_typing(node, AST::Builtin.any_type, context)
1430
1376
 
1431
1377
  when :nth_ref, :back_ref
1432
- typing.add_typing(node, AST::Builtin::String.instance_type)
1378
+ typing.add_typing(node, AST::Builtin::String.instance_type, context)
1433
1379
 
1434
1380
  when :or_asgn, :and_asgn
1435
1381
  yield_self do
1436
1382
  _, rhs = node.children
1437
1383
  rhs_type = synthesize(rhs)
1438
- typing.add_typing(node, rhs_type)
1384
+ typing.add_typing(node, rhs_type, context)
1439
1385
  end
1440
1386
 
1441
1387
  when :defined?
@@ -1443,7 +1389,7 @@ module Steep
1443
1389
  synthesize(child)
1444
1390
  end
1445
1391
 
1446
- typing.add_typing(node, AST::Builtin.any_type)
1392
+ typing.add_typing(node, AST::Builtin.any_type, context)
1447
1393
 
1448
1394
  when :gvasgn
1449
1395
  yield_self do
@@ -1469,7 +1415,7 @@ module Steep
1469
1415
  typing.add_error Errors::FallbackAny.new(node: node)
1470
1416
  end
1471
1417
 
1472
- typing.add_typing(node, type)
1418
+ typing.add_typing(node, type, context)
1473
1419
  end
1474
1420
 
1475
1421
  when :block_pass
@@ -1499,7 +1445,7 @@ module Steep
1499
1445
 
1500
1446
  type ||= synthesize(node.children[0], hint: hint)
1501
1447
 
1502
- typing.add_typing node, type
1448
+ typing.add_typing node, type, context
1503
1449
  end
1504
1450
 
1505
1451
  when :blockarg
@@ -1508,7 +1454,7 @@ module Steep
1508
1454
  synthesize(child)
1509
1455
  end
1510
1456
 
1511
- typing.add_typing node, AST::Builtin.any_type
1457
+ typing.add_typing node, AST::Builtin.any_type, context
1512
1458
  end
1513
1459
 
1514
1460
  when :splat, :sclass, :alias
@@ -1519,7 +1465,7 @@ module Steep
1519
1465
  synthesize(child)
1520
1466
  end
1521
1467
 
1522
- typing.add_typing node, AST::Builtin.any_type
1468
+ typing.add_typing node, AST::Builtin.any_type, context
1523
1469
  end
1524
1470
 
1525
1471
  else
@@ -1541,14 +1487,14 @@ module Steep
1541
1487
  if rhs
1542
1488
  expand_alias(synthesize(rhs, hint: type_env.lvar_types[var.name] || hint)) do |rhs_type|
1543
1489
  node_type = assign_type_to_variable(var, rhs_type, node)
1544
- typing.add_typing(node, node_type)
1490
+ typing.add_typing(node, node_type, context)
1545
1491
  end
1546
1492
  else
1547
1493
  raise
1548
1494
  lhs_type = variable_type(var)
1549
1495
 
1550
1496
  if lhs_type
1551
- typing.add_typing(node, lhs_type)
1497
+ typing.add_typing(node, lhs_type, context)
1552
1498
  else
1553
1499
  fallback_to_any node
1554
1500
  end
@@ -1580,7 +1526,7 @@ module Steep
1580
1526
  fallback_to_any node
1581
1527
  end
1582
1528
  end
1583
- typing.add_typing(node, ivar_type)
1529
+ typing.add_typing(node, ivar_type, context)
1584
1530
  end
1585
1531
 
1586
1532
  def type_masgn(node)
@@ -1600,7 +1546,7 @@ module Steep
1600
1546
  end
1601
1547
  end
1602
1548
 
1603
- typing.add_typing(node, rhs_type)
1549
+ typing.add_typing(node, rhs_type, context)
1604
1550
 
1605
1551
  when rhs_type.is_a?(AST::Types::Tuple) && lhs.children.all? {|a| a.type == :lvasgn || a.type == :ivasgn}
1606
1552
  lhs.children.each.with_index do |asgn, index|
@@ -1628,7 +1574,7 @@ module Steep
1628
1574
  end
1629
1575
  end
1630
1576
 
1631
- typing.add_typing(node, rhs_type)
1577
+ typing.add_typing(node, rhs_type, context)
1632
1578
 
1633
1579
  when rhs_type.is_a?(AST::Types::Any)
1634
1580
  fallback_to_any(node)
@@ -1658,7 +1604,7 @@ module Steep
1658
1604
  end
1659
1605
  end
1660
1606
 
1661
- typing.add_typing node, rhs_type
1607
+ typing.add_typing node, rhs_type, context
1662
1608
 
1663
1609
  when rhs_type.is_a?(AST::Types::Union) &&
1664
1610
  rhs_type.types.all? {|type| AST::Builtin::Array.instance_type?(type)}
@@ -1691,7 +1637,7 @@ module Steep
1691
1637
  end
1692
1638
  end
1693
1639
 
1694
- typing.add_typing node, rhs_type
1640
+ typing.add_typing node, rhs_type, context
1695
1641
 
1696
1642
  else
1697
1643
  Steep.logger.error("Unsupported masgn: #{rhs.type} (#{rhs_type})")
@@ -1717,7 +1663,7 @@ module Steep
1717
1663
  block_annotations: block_annotations,
1718
1664
  topdown_hint: true)
1719
1665
 
1720
- typing.add_typing node, block_type
1666
+ typing.add_typing node, block_type, context
1721
1667
  end
1722
1668
 
1723
1669
  def type_send(node, send_node:, block_params:, block_body:, unwrap: false)
@@ -1732,7 +1678,7 @@ module Steep
1732
1678
 
1733
1679
  return_type = case receiver_type
1734
1680
  when AST::Types::Any
1735
- typing.add_typing node, AST::Builtin.any_type
1681
+ typing.add_typing node, AST::Builtin.any_type, context
1736
1682
 
1737
1683
  when nil
1738
1684
  fallback_to_any node
@@ -1768,7 +1714,7 @@ module Steep
1768
1714
  receiver_type: receiver_type,
1769
1715
  topdown_hint: true)
1770
1716
 
1771
- typing.add_typing node, return_type
1717
+ typing.add_typing node, return_type, context
1772
1718
  else
1773
1719
  fallback_to_any node do
1774
1720
  Errors::NoMethod.new(node: node, method: method_name, type: expanded_receiver_type)
@@ -1793,7 +1739,7 @@ module Steep
1793
1739
  unless typing.has_type?(arg)
1794
1740
  if arg.type == :splat
1795
1741
  type = synthesize(arg.children[0])
1796
- typing.add_typing(arg, AST::Builtin::Array.instance_type(type))
1742
+ typing.add_typing(arg, AST::Builtin::Array.instance_type(type), context)
1797
1743
  else
1798
1744
  synthesize(arg)
1799
1745
  end
@@ -1843,10 +1789,10 @@ module Steep
1843
1789
  end
1844
1790
  Steep.logger.debug("return_type = #{return_type}")
1845
1791
 
1846
- block_context = BlockContext.new(body_type: block_annotations.block_type)
1792
+ block_context = TypeInference::Context::BlockContext.new(body_type: block_annotations.block_type)
1847
1793
  Steep.logger.debug("block_context { body_type: #{block_context.body_type} }")
1848
1794
 
1849
- break_context = BreakContext.new(
1795
+ break_context = TypeInference::Context::BreakContext.new(
1850
1796
  break_type: block_annotations.break_type || method_return_type,
1851
1797
  next_type: block_annotations.block_type
1852
1798
  )
@@ -1856,13 +1802,15 @@ module Steep
1856
1802
  checker: checker,
1857
1803
  source: source,
1858
1804
  annotations: annotations.merge_block_annotations(block_annotations),
1859
- type_env: block_type_env,
1860
- block_context: block_context,
1861
1805
  typing: typing,
1862
- method_context: method_context,
1863
- module_context: module_context,
1864
- self_type: block_annotations.self_type || self_type,
1865
- break_context: break_context
1806
+ context: TypeInference::Context.new(
1807
+ block_context: block_context,
1808
+ method_context: method_context,
1809
+ module_context: module_context,
1810
+ break_context: break_context,
1811
+ self_type: block_annotations.self_type || self_type,
1812
+ type_env: block_type_env
1813
+ )
1866
1814
  ), return_type]
1867
1815
  end
1868
1816
 
@@ -1979,7 +1927,7 @@ module Steep
1979
1927
  this.synthesize(block_body)
1980
1928
  end
1981
1929
 
1982
- child_typing.add_typing node, AST::Builtin.any_type
1930
+ child_typing.add_typing node, AST::Builtin.any_type, context
1983
1931
 
1984
1932
  [[AST::Builtin.any_type, child_typing, :any]]
1985
1933
  end
@@ -2029,7 +1977,7 @@ module Steep
2029
1977
  when :hash
2030
1978
  keyword_hash_type = AST::Builtin::Hash.instance_type(AST::Builtin::Symbol.instance_type,
2031
1979
  AST::Builtin.any_type)
2032
- typing.add_typing node, keyword_hash_type
1980
+ typing.add_typing node, keyword_hash_type, context
2033
1981
 
2034
1982
  given_keys = Set.new()
2035
1983
 
@@ -2053,7 +2001,7 @@ module Steep
2053
2001
  params.rest_keywords
2054
2002
  end
2055
2003
 
2056
- typing.add_typing key_node, AST::Builtin::Symbol.instance_type
2004
+ typing.add_typing key_node, AST::Builtin::Symbol.instance_type, context
2057
2005
 
2058
2006
  given_keys << key_symbol
2059
2007
 
@@ -2159,13 +2107,8 @@ module Steep
2159
2107
  checker: checker,
2160
2108
  source: source,
2161
2109
  annotations: annotations,
2162
- type_env: type_env,
2163
2110
  typing: child_typing,
2164
- self_type: self_type,
2165
- method_context: method_context,
2166
- block_context: block_context,
2167
- module_context: module_context,
2168
- break_context: break_context
2111
+ context: context
2169
2112
  )
2170
2113
 
2171
2114
  method_type.instantiate(instantiation).yield_self do |method_type|
@@ -2182,7 +2125,7 @@ module Steep
2182
2125
 
2183
2126
  arg_type = if arg_node.type == :splat
2184
2127
  type = construction.synthesize(arg_node.children[0])
2185
- child_typing.add_typing(arg_node, type)
2128
+ child_typing.add_typing(arg_node, type, context)
2186
2129
  else
2187
2130
  construction.synthesize(arg_node, hint: topdown_hint ? param_type : nil)
2188
2131
  end
@@ -2364,10 +2307,10 @@ module Steep
2364
2307
  end
2365
2308
  Steep.logger.debug("return_type = #{break_type}")
2366
2309
 
2367
- block_context = BlockContext.new(body_type: block_annotations.block_type)
2310
+ block_context = TypeInference::Context::BlockContext.new(body_type: block_annotations.block_type)
2368
2311
  Steep.logger.debug("block_context { body_type: #{block_context.body_type} }")
2369
2312
 
2370
- break_context = BreakContext.new(
2313
+ break_context = TypeInference::Context::BreakContext.new(
2371
2314
  break_type: break_type,
2372
2315
  next_type: block_context.body_type
2373
2316
  )
@@ -2377,13 +2320,15 @@ module Steep
2377
2320
  checker: checker,
2378
2321
  source: source,
2379
2322
  annotations: annotations.merge_block_annotations(block_annotations),
2380
- type_env: block_type_env,
2381
- block_context: block_context,
2382
2323
  typing: typing,
2383
- method_context: method_context,
2384
- module_context: module_context,
2385
- self_type: block_annotations.self_type || self_type,
2386
- break_context: break_context
2324
+ context: TypeInference::Context.new(
2325
+ block_context: block_context,
2326
+ method_context: method_context,
2327
+ module_context: module_context,
2328
+ break_context: break_context,
2329
+ self_type: block_annotations.self_type || self_type,
2330
+ type_env: block_type_env
2331
+ )
2387
2332
  )
2388
2333
 
2389
2334
  if block_body
@@ -2600,7 +2545,7 @@ module Steep
2600
2545
  typing.add_error Errors::FallbackAny.new(node: node)
2601
2546
  end
2602
2547
 
2603
- typing.add_typing node, AST::Builtin.any_type
2548
+ typing.add_typing node, AST::Builtin.any_type, context
2604
2549
  end
2605
2550
 
2606
2551
  def self_class?(node)
@@ -2774,7 +2719,7 @@ module Steep
2774
2719
  child_typing.save!
2775
2720
 
2776
2721
  hash = AST::Types::Record.new(elements: elements)
2777
- typing.add_typing(node, hash)
2722
+ typing.add_typing(node, hash, context)
2778
2723
  end
2779
2724
  when AST::Types::Union
2780
2725
  hint.types.find do |type|