steep 0.50.0 → 0.51.0

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