steep 0.50.0 → 0.51.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.
@@ -5,16 +5,42 @@ module Steep
5
5
  VariableContent = Struct.new(:node, :name, :type, :location, keyword_init: true)
6
6
  MethodCallContent = Struct.new(:node, :method_name, :type, :definition, :location, keyword_init: true)
7
7
  DefinitionContent = Struct.new(:node, :method_name, :method_type, :definition, :location, keyword_init: true) do
8
- TypeAliasContent = Struct.new(:location, :decl, keyword_init: true)
9
- ClassContent = Struct.new(:location, :decl, keyword_init: true)
10
- InterfaceContent = Struct.new(:location, :decl, keyword_init: true)
11
-
12
8
  def comment_string
13
9
  if comments = definition&.comments
14
10
  comments.map {|c| c.string.chomp }.uniq.join("\n----\n")
15
11
  end
16
12
  end
17
13
  end
14
+ ConstantContent = Struct.new(:location, :full_name, :type, :decl, keyword_init: true) do
15
+ def comment_string
16
+ if class_or_module?
17
+ comments = decl.decls.filter_map {|d| d.decl.comment&.string }
18
+ unless comments.empty?
19
+ return comments.join("\n----\n")
20
+ end
21
+ end
22
+
23
+ if constant?
24
+ if comment = decl.decl.comment
25
+ return comment.string
26
+ end
27
+ end
28
+
29
+ nil
30
+ end
31
+
32
+ def constant?
33
+ decl.is_a?(RBS::Environment::SingleEntry)
34
+ end
35
+
36
+ def class_or_module?
37
+ decl.is_a?(RBS::Environment::MultiEntry)
38
+ end
39
+ end
40
+
41
+ TypeAliasContent = Struct.new(:location, :decl, keyword_init: true)
42
+ ClassContent = Struct.new(:location, :decl, keyword_init: true)
43
+ InterfaceContent = Struct.new(:location, :decl, keyword_init: true)
18
44
 
19
45
  InstanceMethodName = Struct.new(:class_name, :method_name)
20
46
  SingletonMethodName = Struct.new(:class_name, :method_name)
@@ -190,6 +216,28 @@ module Steep
190
216
  location: node.loc.expression
191
217
  )
192
218
  end
219
+ when :const, :casgn
220
+ context = typing.context_at(line: line, column: column)
221
+
222
+ type = typing.type_of(node: node)
223
+ const_name = typing.source_index.reference(constant_node: node)
224
+
225
+ if const_name
226
+ decl = context.env.class_decls[const_name] || context.env.constant_decls[const_name]
227
+
228
+ ConstantContent.new(
229
+ location: node.location.name,
230
+ full_name: const_name,
231
+ type: type,
232
+ decl: decl
233
+ )
234
+ else
235
+ TypeContent.new(
236
+ node: node,
237
+ type: type,
238
+ location: node.location.expression
239
+ )
240
+ end
193
241
  else
194
242
  type = typing.type_of(node: node)
195
243
 
@@ -338,8 +338,12 @@ module Steep
338
338
  end
339
339
 
340
340
  def self.type_check(source:, subtyping:)
341
- annotations = source.annotations(block: source.node, factory: subtyping.factory, current_module: RBS::Namespace.root)
342
- const_env = TypeInference::ConstantEnv.new(factory: subtyping.factory, context: [RBS::Namespace.root])
341
+ annotations = source.annotations(block: source.node, factory: subtyping.factory, context: nil)
342
+ const_env = TypeInference::ConstantEnv.new(
343
+ factory: subtyping.factory,
344
+ context: nil,
345
+ resolver: RBS::Resolver::ConstantResolver.new(builder: subtyping.factory.definition_builder)
346
+ )
343
347
  type_env = TypeInference::TypeEnv.build(annotations: annotations,
344
348
  subtyping: subtyping,
345
349
  const_env: const_env,
@@ -357,7 +361,6 @@ module Steep
357
361
  instance_type: AST::Builtin::Object.instance_type,
358
362
  module_type: AST::Builtin::Object.module_type,
359
363
  implement_name: nil,
360
- current_namespace: RBS::Namespace.root,
361
364
  const_env: const_env,
362
365
  class_name: AST::Builtin::Object.module_name,
363
366
  instance_definition: subtyping.factory.definition_builder.build_instance(AST::Builtin::Object.module_name),
data/lib/steep/source.rb CHANGED
@@ -283,11 +283,11 @@ module Steep
283
283
  node.updated(nil, children)
284
284
  end
285
285
 
286
- def annotations(block:, factory:, current_module:)
286
+ def annotations(block:, factory:, context:)
287
287
  AST::Annotation::Collection.new(
288
288
  annotations: (mapping[block] || []).map(&:annotation),
289
289
  factory: factory,
290
- current_module: current_module
290
+ context: context
291
291
  )
292
292
  end
293
293
 
@@ -302,6 +302,8 @@ module Steep
302
302
  end
303
303
 
304
304
  def find_nodes(line:, column:, node: self.node, position: nil, parents: [])
305
+ return [] unless node
306
+
305
307
  position ||= (line-1).times.sum do |i|
306
308
  node.location.expression.source_buffer.source_line(i+1).size + 1
307
309
  end + column
@@ -345,22 +347,26 @@ module Steep
345
347
  end
346
348
 
347
349
  def without_unrelated_defs(line:, column:)
348
- nodes = find_nodes(line: line, column: column) || []
349
- defs = Set[].compare_by_identity.merge(nodes.select {|node| node.type == :def || node.type == :defs })
350
+ if node
351
+ nodes = find_nodes(line: line, column: column) || []
352
+ defs = Set[].compare_by_identity.merge(nodes.select {|node| node.type == :def || node.type == :defs })
350
353
 
351
- node_ = Source.delete_defs(node, defs)
354
+ node_ = Source.delete_defs(node, defs)
352
355
 
353
- mapping = {}.compare_by_identity
356
+ mapping = {}.compare_by_identity
354
357
 
355
- annotations = self.mapping.values.flatten
356
- Source.construct_mapping(node: node_, annotations: annotations, mapping: mapping)
358
+ annotations = self.mapping.values.flatten
359
+ Source.construct_mapping(node: node_, annotations: annotations, mapping: mapping)
357
360
 
358
- annotations.each do |annot|
359
- mapping[node] ||= []
360
- mapping[node] << annot
361
- end
361
+ annotations.each do |annot|
362
+ mapping[node] ||= []
363
+ mapping[node] << annot
364
+ end
362
365
 
363
- Source.new(path: path, node: node_, mapping: mapping)
366
+ Source.new(path: path, node: node_, mapping: mapping)
367
+ else
368
+ self
369
+ end
364
370
  end
365
371
 
366
372
  def compact_siblings(node)
@@ -130,9 +130,8 @@ module Steep
130
130
  end
131
131
 
132
132
  def for_new_method(method_name, node, args:, self_type:, definition:)
133
- annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
134
- type_env = TypeInference::TypeEnv.new(subtyping: checker,
135
- const_env: module_context&.const_env || self.type_env.const_env)
133
+ annots = source.annotations(block: node, factory: checker.factory, context: nesting)
134
+ type_env = TypeInference::TypeEnv.new(subtyping: checker, const_env: module_context&.const_env || self.type_env.const_env)
136
135
 
137
136
  self.type_env.const_types.each do |name, type|
138
137
  type_env.set(const: name, type: type)
@@ -285,17 +284,9 @@ module Steep
285
284
  end
286
285
  end
287
286
  else
288
- name = nil
289
- name ||= absolute_name(module_name).yield_self do |absolute_name|
290
- absolute_name if checker.factory.class_name?(absolute_name) || checker.factory.module_name?(absolute_name)
291
- end
292
- name ||= super_name && absolute_name(super_name).yield_self do |absolute_name|
293
- absolute_name if checker.factory.class_name?(absolute_name) || checker.factory.module_name?(absolute_name)
294
- end
287
+ name = module_name || super_name
295
288
 
296
- if name
297
- absolute_name_ = name
298
- entry = checker.factory.env.class_decls[absolute_name_]
289
+ if name && entry = checker.factory.env.class_decls[name]
299
290
  AST::Annotation::Implements::Module.new(
300
291
  name: name,
301
292
  args: entry.type_params.each.map(&:name)
@@ -304,9 +295,9 @@ module Steep
304
295
  end
305
296
  end
306
297
 
307
- def default_module_context(implement_module_name, const_env:, current_namespace:)
298
+ def default_module_context(implement_module_name, const_env:)
308
299
  if implement_module_name
309
- module_name = checker.factory.absolute_type_name(implement_module_name.name, namespace: current_namespace)
300
+ module_name = checker.factory.absolute_type_name(implement_module_name.name, context: const_env.context)
310
301
  module_args = implement_module_name.args.map {|name| AST::Types::Var.new(name: name) }
311
302
 
312
303
  instance_def = checker.factory.definition_builder.build_instance(module_name)
@@ -319,7 +310,6 @@ module Steep
319
310
  instance_type: instance_type,
320
311
  module_type: module_type,
321
312
  implement_name: implement_module_name,
322
- current_namespace: current_namespace,
323
313
  const_env: const_env,
324
314
  class_name: module_name,
325
315
  instance_definition: instance_def,
@@ -330,7 +320,6 @@ module Steep
330
320
  instance_type: nil,
331
321
  module_type: nil,
332
322
  implement_name: nil,
333
- current_namespace: current_namespace,
334
323
  const_env: self.module_context.const_env,
335
324
  class_name: self.module_context.class_name,
336
325
  module_definition: nil,
@@ -339,17 +328,19 @@ module Steep
339
328
  end
340
329
  end
341
330
 
342
- def for_module(node)
343
- new_module_name = module_name_from_node(node.children.first) or raise "Unexpected module name: #{node.children.first}"
344
- new_namespace = nested_namespace_for_module(new_module_name)
331
+ def for_module(node, new_module_name)
332
+ new_nesting = [nesting, new_module_name || false]
345
333
 
346
- const_context = [new_namespace] + self.module_context.const_env.context
347
- module_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
334
+ module_const_env = TypeInference::ConstantEnv.new(
335
+ factory: checker.factory,
336
+ context: new_nesting,
337
+ resolver: self.module_context.const_env.resolver
338
+ )
348
339
 
349
- annots = source.annotations(block: node, factory: checker.factory, current_module: new_namespace)
340
+ annots = source.annotations(block: node, factory: checker.factory, context: new_nesting)
350
341
 
351
342
  implement_module_name = implement_module(module_name: new_module_name, annotations: annots)
352
- module_context = default_module_context(implement_module_name, const_env: module_const_env, current_namespace: new_namespace)
343
+ module_context = default_module_context(implement_module_name, const_env: module_const_env)
353
344
 
354
345
  unless implement_module_name
355
346
  module_context = module_context.update(
@@ -446,25 +437,25 @@ module Steep
446
437
  )
447
438
  end
448
439
 
449
- def with_module_constr(node)
450
- constr = for_module(node)
440
+ def with_module_constr(node, module_name)
441
+ constr = for_module(node, module_name)
451
442
  constr.checker.push_variable_bounds(constr.variable_context.upper_bounds) do
452
443
  yield constr
453
444
  end
454
445
  end
455
446
 
456
- def for_class(node)
457
- new_class_name = module_name_from_node(node.children.first) or raise "Unexpected class name: #{node.children.first}"
458
- super_class_name = node.children[1] && module_name_from_node(node.children[1])
459
- new_namespace = nested_namespace_for_module(new_class_name)
447
+ def for_class(node, new_class_name, super_class_name)
448
+ new_nesting = [nesting, new_class_name || false]
449
+ annots = source.annotations(block: node, factory: checker.factory, context: new_nesting)
460
450
 
461
- annots = source.annotations(block: node, factory: checker.factory, current_module: new_namespace)
462
-
463
- const_context = [new_namespace] + self.module_context.const_env.context
464
- class_const_env = TypeInference::ConstantEnv.new(factory: checker.factory, context: const_context)
451
+ class_const_env = TypeInference::ConstantEnv.new(
452
+ factory: checker.factory,
453
+ context: new_nesting,
454
+ resolver: self.module_context.const_env.resolver
455
+ )
465
456
 
466
457
  implement_module_name = implement_module(module_name: new_class_name, super_name: super_class_name, annotations: annots)
467
- module_context = default_module_context(implement_module_name, const_env: class_const_env, current_namespace: new_namespace)
458
+ module_context = default_module_context(implement_module_name, const_env: class_const_env)
468
459
 
469
460
  if implement_module_name
470
461
  if super_class_name && implement_module_name.name == absolute_name(super_class_name)
@@ -534,8 +525,8 @@ module Steep
534
525
  )
535
526
  end
536
527
 
537
- def with_class_constr(node)
538
- constr = for_class(node)
528
+ def with_class_constr(node, new_class_name, super_class_name)
529
+ constr = for_class(node, new_class_name, super_class_name)
539
530
 
540
531
  constr.checker.push_variable_bounds(constr.variable_context.upper_bounds) do
541
532
  yield constr
@@ -553,7 +544,7 @@ module Steep
553
544
  end
554
545
 
555
546
  def for_sclass(node, type)
556
- annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
547
+ annots = source.annotations(block: node, factory: checker.factory, context: nesting)
557
548
 
558
549
  instance_type = if type.is_a?(AST::Types::Self)
559
550
  context.self_type
@@ -601,7 +592,6 @@ module Steep
601
592
  instance_type: annots.instance_type || instance_type,
602
593
  module_type: annots.self_type || annots.module_type || module_type,
603
594
  implement_name: nil,
604
- current_namespace: current_namespace,
605
595
  const_env: self.module_context.const_env,
606
596
  class_name: self.module_context.class_name,
607
597
  module_definition: module_definition,
@@ -642,7 +632,7 @@ module Steep
642
632
  end
643
633
 
644
634
  def for_branch(node, truthy_vars: Set.new, type_case_override: nil, break_context: context.break_context)
645
- annots = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
635
+ annots = source.annotations(block: node, factory: checker.factory, context: nesting)
646
636
 
647
637
  lvar_env = context.lvar_env
648
638
 
@@ -1497,33 +1487,37 @@ module Steep
1497
1487
  yield_self do
1498
1488
  constr = self
1499
1489
 
1500
- name, sup, _ = node.children
1501
- if name.type == :const
1502
- # skip the last constant reference
1503
- if const_parent = name.children[0]
1504
- _, constr = constr.synthesize(const_parent)
1490
+ name_node, super_node, _ = node.children
1491
+ _, constr, class_name = synthesize_constant(name_node, name_node.children[0], name_node.children[1]) do
1492
+ typing.add_error(
1493
+ Diagnostic::Ruby::UnknownConstant.new(node: name_node, name: name_node.children[1]).class!
1494
+ )
1495
+ end
1496
+ if class_name
1497
+ typing.source_index.add_definition(constant: class_name, definition: name_node)
1498
+ end
1499
+
1500
+ if super_node
1501
+ _, constr, super_name = constr.synthesize_constant(super_node, super_node.children[0], super_node.children[1]) do
1502
+ typing.add_error(
1503
+ Diagnostic::Ruby::UnknownConstant.new(node: super_node, name: super_node.children[1]).class!
1504
+ )
1505
+ end
1506
+ if super_name
1507
+ typing.source_index.add_reference(constant: super_name, ref: super_node)
1505
1508
  end
1506
- else
1507
- _, constr = constr.synthesize(name)
1508
1509
  end
1509
- _, constr = constr.synthesize(sup) if sup
1510
1510
 
1511
- with_class_constr(node) do |constructor|
1511
+ with_class_constr(node, class_name, super_name) do |constructor|
1512
1512
  if module_type = constructor.module_context&.module_type
1513
1513
  _, constructor = constructor.add_typing(name, type: module_type)
1514
1514
  else
1515
1515
  _, constructor = constructor.fallback_to_any(name)
1516
1516
  end
1517
1517
 
1518
- constructor.typing.source_index.add_definition(
1519
- constant: constructor.module_context.class_name,
1520
- definition: node
1521
- )
1522
-
1523
1518
  constructor.typing.add_context_for_node(node, context: constructor.context)
1524
1519
  constructor.typing.add_context_for_body(node, context: constructor.context)
1525
1520
 
1526
- constructor.synthesize(node.children[1]) if node.children[1]
1527
1521
  constructor.synthesize(node.children[2]) if node.children[2]
1528
1522
 
1529
1523
  if constructor.module_context&.implement_name && !namespace_module?(node)
@@ -1538,28 +1532,22 @@ module Steep
1538
1532
  yield_self do
1539
1533
  constr = self
1540
1534
 
1541
- name, _ = node.children
1542
- if name.type == :const
1543
- # skip the last constant reference
1544
- if const_parent = name.children[0]
1545
- _, constr = constr.synthesize(const_parent)
1546
- end
1547
- else
1548
- _, constr = constr.synthesize(name)
1535
+ name_node, _ = node.children
1536
+ _, constr, module_name = synthesize_constant(name_node, name_node.children[0], name_node.children[1]) do
1537
+ typing.add_error Diagnostic::Ruby::UnknownConstant.new(node: name_node, name: name_node.children[1]).module!
1538
+ end
1539
+
1540
+ if module_name
1541
+ constr.typing.source_index.add_definition(constant: module_name, definition: name_node)
1549
1542
  end
1550
1543
 
1551
- with_module_constr(node) do |constructor|
1544
+ with_module_constr(node, module_name) do |constructor|
1552
1545
  if module_type = constructor.module_context&.module_type
1553
1546
  _, constructor = constructor.add_typing(name, type: module_type)
1554
1547
  else
1555
1548
  _, constructor = constructor.fallback_to_any(name)
1556
1549
  end
1557
1550
 
1558
- constructor.typing.source_index.add_definition(
1559
- constant: constructor.module_context.class_name,
1560
- definition: node
1561
- )
1562
-
1563
1551
  constructor.typing.add_context_for_node(node, context: constructor.context)
1564
1552
  constructor.typing.add_context_for_body(node, context: constructor.context)
1565
1553
 
@@ -1611,75 +1599,47 @@ module Steep
1611
1599
  add_typing node, type: AST::Types::Void.new
1612
1600
 
1613
1601
  when :const
1614
- parent = node.children[0]
1615
- if parent
1616
- _, constr = synthesize(parent)
1617
- else
1618
- constr = self
1619
- end
1620
-
1621
- const_name = constr.module_name_from_node(node)
1602
+ yield_self do
1603
+ type, constr, name = synthesize_constant(node, node.children[0], node.children[1])
1622
1604
 
1623
- if const_name
1624
- if constant = module_context.const_env.lookup_constant(const_name)
1625
- typing.source_index.add_reference(constant: constant.name, ref: node)
1605
+ if name
1606
+ typing.source_index.add_reference(constant: name, ref: node)
1626
1607
  end
1627
1608
 
1628
- type = type_env.get(const: const_name) do
1629
- constr.fallback_to_any(node)
1630
- end
1631
- constr.add_typing(node, type: type)
1632
- else
1633
- constr.fallback_to_any(node)
1609
+ Pair.new(type: type, constr: constr)
1634
1610
  end
1635
1611
 
1636
1612
  when :casgn
1637
1613
  yield_self do
1638
- constr = self
1614
+ constant_type, constr, constant_name = synthesize_constant(nil, node.children[0], node.children[1]) do
1615
+ typing.add_error(
1616
+ Diagnostic::Ruby::UnknownConstant.new(
1617
+ node: node,
1618
+ name: node.children[1]
1619
+ )
1620
+ )
1621
+ end
1639
1622
 
1640
- parent = node.children[0]
1641
- _, constr = constr.synthesize(parent) if parent
1642
- const_name = constr.module_name_from_node(node)
1623
+ if constant_name
1624
+ typing.source_index.add_definition(constant: constant_name, definition: node)
1625
+ end
1643
1626
 
1644
- if const_name
1645
- if constant = module_context.const_env.lookup_constant(const_name)
1646
- typing.source_index.add_definition(constant: constant.name, definition: node)
1647
- end
1627
+ value_type, constr = constr.synthesize(node.children.last, hint: constant_type)
1648
1628
 
1649
- const_type = type_env.get(const: const_name) {}
1650
- value_type, constr = constr.synthesize(node.children.last, hint: const_type)
1651
- type = type_env.assign(
1652
- const: const_name,
1653
- type: value_type,
1654
- self_type: self_type,
1655
- instance_type: module_context.instance_type,
1656
- class_type: module_context.module_type
1657
- ) do |error|
1658
- if error
1659
- const_type = type_env.get(const: const_name)
1660
- typing.add_error(
1661
- Diagnostic::Ruby::IncompatibleAssignment.new(
1662
- node: node,
1663
- lhs_type: const_type,
1664
- rhs_type: value_type,
1665
- result: error
1666
- )
1667
- )
1668
- else
1669
- typing.add_error(
1670
- Diagnostic::Ruby::UnknownConstantAssigned.new(
1671
- node: node,
1672
- name: const_name,
1673
- context: module_context
1674
- )
1675
- )
1676
- end
1677
- end
1629
+ result = check_relation(sub_type: value_type, super_type: constant_type)
1630
+ if result.failure?
1631
+ typing.add_error(
1632
+ Diagnostic::Ruby::IncompatibleAssignment.new(
1633
+ node: node,
1634
+ lhs_type: constant_type,
1635
+ rhs_type: value_type,
1636
+ result: result
1637
+ )
1638
+ )
1678
1639
 
1679
- constr.add_typing(node, type: type)
1640
+ constr.add_typing(node, type: constant_type)
1680
1641
  else
1681
- _, constr = constr.synthesize(node.children.last)
1682
- constr.fallback_to_any(node)
1642
+ constr.add_typing(node, type: value_type)
1683
1643
  end
1684
1644
  end
1685
1645
 
@@ -2724,6 +2684,70 @@ module Steep
2724
2684
  end
2725
2685
  end
2726
2686
 
2687
+ def synthesize_constant(node, parent_node, constant_name)
2688
+ const_name = module_name_from_node(parent_node, constant_name)
2689
+
2690
+ if const_name && type = type_env.get(const: const_name) { break }
2691
+ # const-type annotation wins
2692
+ if node
2693
+ constr = synthesize_children(node)
2694
+ type, constr = constr.add_typing(node, type: type)
2695
+ [type, constr, nil]
2696
+ else
2697
+ [type, self, nil]
2698
+ end
2699
+ else
2700
+ case
2701
+ when !parent_node
2702
+ constr = self
2703
+
2704
+ if (type, name = module_context.const_env.resolve(constant_name))
2705
+ if node
2706
+ _, constr = add_typing(node, type: type)
2707
+ end
2708
+
2709
+ return [type, constr, name]
2710
+ end
2711
+ when parent_node.type == :cbase
2712
+ _, constr = add_typing(parent_node, type: AST::Builtin.nil_type)
2713
+
2714
+ if (type, name = constr.module_context.const_env.toplevel(constant_name))
2715
+ if node
2716
+ _, constr = constr.add_typing(node, type: type)
2717
+ end
2718
+
2719
+ return [type, constr, name]
2720
+ end
2721
+ else
2722
+ parent_type, constr = synthesize(parent_node)
2723
+ parent_type = deep_expand_alias(parent_type)
2724
+
2725
+ case parent_type
2726
+ when AST::Types::Name::Singleton
2727
+ if (type, name = module_context.const_env.resolve_child(parent_type.name, constant_name))
2728
+ if node
2729
+ _, constr = add_typing(node, type: type)
2730
+ end
2731
+
2732
+ return [type, constr, name]
2733
+ end
2734
+ end
2735
+ end
2736
+
2737
+ if block_given?
2738
+ yield
2739
+ else
2740
+ if node
2741
+ constr.typing.add_error(
2742
+ Diagnostic::Ruby::UnknownConstant.new(node: node, name: constant_name)
2743
+ )
2744
+ end
2745
+ end
2746
+
2747
+ [AST::Builtin.any_type, constr, nil]
2748
+ end
2749
+ end
2750
+
2727
2751
  def optional_proc?(type)
2728
2752
  if type.is_a?(AST::Types::Union)
2729
2753
  if type.types.size == 2
@@ -2737,7 +2761,7 @@ module Steep
2737
2761
  end
2738
2762
 
2739
2763
  def type_lambda(node, params_node:, body_node:, type_hint:)
2740
- block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2764
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
2741
2765
  params = TypeInference::BlockParams.from_node(params_node, annotations: block_annotations)
2742
2766
 
2743
2767
  type_hint = deep_expand_alias(type_hint) if type_hint
@@ -2894,7 +2918,7 @@ module Steep
2894
2918
 
2895
2919
  constr = synthesize_children(node, skips: skips)
2896
2920
  if block_params
2897
- block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2921
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
2898
2922
 
2899
2923
  constr.type_block_without_hint(
2900
2924
  node: node,
@@ -2915,7 +2939,7 @@ module Steep
2915
2939
 
2916
2940
  constr = synthesize_children(node, skips: skips)
2917
2941
  if block_params
2918
- block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2942
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
2919
2943
 
2920
2944
  constr.type_block_without_hint(
2921
2945
  node: node,
@@ -3296,7 +3320,7 @@ module Steep
3296
3320
 
3297
3321
  if block_params
3298
3322
  # block is given
3299
- block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
3323
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
3300
3324
  block_params_ = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
3301
3325
 
3302
3326
  if method_type.block
@@ -3638,8 +3662,7 @@ module Steep
3638
3662
  if implements = block_annotations.implement_module_annotation
3639
3663
  module_context = default_module_context(
3640
3664
  implements.name,
3641
- const_env: self.module_context.const_env,
3642
- current_namespace: current_namespace
3665
+ const_env: self.module_context.const_env
3643
3666
  )
3644
3667
 
3645
3668
  self_type = module_context.module_type
@@ -3693,30 +3716,25 @@ module Steep
3693
3716
  end
3694
3717
  end
3695
3718
 
3696
- def current_namespace
3697
- module_context&.current_namespace || AST::Namespace.root
3719
+ def nesting
3720
+ module_context&.nesting
3698
3721
  end
3699
3722
 
3700
- def nested_namespace_for_module(module_name)
3701
- if module_name.namespace.relative?
3702
- (current_namespace + module_name.namespace).append(module_name.name)
3703
- else
3704
- module_name.to_namespace
3723
+ def absolute_nested_module_name(module_name)
3724
+ n = nesting
3725
+ while n && !n[1]
3726
+ n = n[0]
3705
3727
  end
3706
- end
3707
3728
 
3708
- def absolute_name(module_name)
3709
- if current_namespace
3710
- module_name.with_prefix(current_namespace)
3711
- else
3729
+ if n
3712
3730
  module_name.absolute!
3731
+ else
3732
+ n + module_name
3713
3733
  end
3714
3734
  end
3715
3735
 
3716
- def absolute_type(type)
3717
- if type
3718
- checker.builder.absolute_type(type, current: current_namespace)
3719
- end
3736
+ def absolute_name(name)
3737
+ checker.factory.absolute_type_name(name, context: nesting)
3720
3738
  end
3721
3739
 
3722
3740
  def union_type(*types)