steep 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
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|