steep 1.8.0.dev.2 → 1.8.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +39 -0
  3. data/bin/mem_graph.rb +67 -0
  4. data/bin/mem_prof.rb +102 -0
  5. data/bin/stackprof_test.rb +19 -0
  6. data/bin/steep-check.rb +251 -0
  7. data/lib/steep/annotation_parser.rb +1 -1
  8. data/lib/steep/ast/builtin.rb +5 -5
  9. data/lib/steep/ast/node/type_application.rb +7 -6
  10. data/lib/steep/ast/types/any.rb +1 -9
  11. data/lib/steep/ast/types/boolean.rb +8 -16
  12. data/lib/steep/ast/types/bot.rb +2 -10
  13. data/lib/steep/ast/types/class.rb +1 -13
  14. data/lib/steep/ast/types/factory.rb +101 -85
  15. data/lib/steep/ast/types/instance.rb +1 -13
  16. data/lib/steep/ast/types/intersection.rb +8 -15
  17. data/lib/steep/ast/types/literal.rb +2 -8
  18. data/lib/steep/ast/types/logic.rb +3 -24
  19. data/lib/steep/ast/types/name.rb +5 -16
  20. data/lib/steep/ast/types/nil.rb +3 -12
  21. data/lib/steep/ast/types/proc.rb +4 -13
  22. data/lib/steep/ast/types/record.rb +22 -13
  23. data/lib/steep/ast/types/self.rb +1 -13
  24. data/lib/steep/ast/types/shared_instance.rb +11 -0
  25. data/lib/steep/ast/types/top.rb +1 -9
  26. data/lib/steep/ast/types/tuple.rb +4 -10
  27. data/lib/steep/ast/types/union.rb +10 -15
  28. data/lib/steep/ast/types/var.rb +4 -13
  29. data/lib/steep/ast/types/void.rb +2 -10
  30. data/lib/steep/diagnostic/ruby.rb +4 -4
  31. data/lib/steep/drivers/check.rb +11 -14
  32. data/lib/steep/drivers/checkfile.rb +8 -10
  33. data/lib/steep/drivers/stats.rb +17 -13
  34. data/lib/steep/drivers/utils/driver_helper.rb +24 -3
  35. data/lib/steep/drivers/watch.rb +3 -3
  36. data/lib/steep/interface/builder.rb +162 -138
  37. data/lib/steep/interface/method_type.rb +12 -20
  38. data/lib/steep/interface/shape.rb +66 -10
  39. data/lib/steep/interface/substitution.rb +2 -0
  40. data/lib/steep/interface/type_param.rb +20 -7
  41. data/lib/steep/located_value.rb +20 -0
  42. data/lib/steep/server/change_buffer.rb +5 -7
  43. data/lib/steep/server/custom_methods.rb +61 -0
  44. data/lib/steep/server/delay_queue.rb +8 -1
  45. data/lib/steep/server/interaction_worker.rb +10 -5
  46. data/lib/steep/server/lsp_formatter.rb +8 -6
  47. data/lib/steep/server/master.rb +193 -140
  48. data/lib/steep/server/type_check_worker.rb +18 -19
  49. data/lib/steep/server/work_done_progress.rb +64 -0
  50. data/lib/steep/services/completion_provider.rb +24 -22
  51. data/lib/steep/services/goto_service.rb +3 -2
  52. data/lib/steep/services/hover_provider/ruby.rb +7 -6
  53. data/lib/steep/services/signature_help_provider.rb +7 -6
  54. data/lib/steep/services/signature_service.rb +1 -1
  55. data/lib/steep/services/type_check_service.rb +3 -3
  56. data/lib/steep/signature/validator.rb +17 -20
  57. data/lib/steep/subtyping/check.rb +105 -55
  58. data/lib/steep/subtyping/constraints.rb +11 -15
  59. data/lib/steep/type_construction.rb +101 -101
  60. data/lib/steep/type_inference/block_params.rb +6 -6
  61. data/lib/steep/type_inference/logic_type_interpreter.rb +11 -7
  62. data/lib/steep/type_inference/method_call.rb +3 -3
  63. data/lib/steep/type_inference/method_params.rb +1 -1
  64. data/lib/steep/type_inference/send_args.rb +1 -1
  65. data/lib/steep/typing.rb +158 -102
  66. data/lib/steep/version.rb +1 -1
  67. data/lib/steep.rb +28 -3
  68. data/steep.gemspec +2 -2
  69. metadata +15 -8
  70. data/lib/steep/type_inference/context_array.rb +0 -112
@@ -154,7 +154,7 @@ module Steep
154
154
  definition_method_type = if definition
155
155
  definition.methods[method_name]&.yield_self do |method|
156
156
  method.method_types
157
- .map {|method_type| checker.factory.method_type(method_type, method_decls: Set[]) }
157
+ .map {|method_type| checker.factory.method_type(method_type) }
158
158
  .select {|method_type| method_type.is_a?(Interface::MethodType) }
159
159
  .inject {|t1, t2| t1 + t2}
160
160
  end
@@ -195,11 +195,11 @@ module Steep
195
195
  end
196
196
 
197
197
  method_params =
198
- if method_type
199
- TypeInference::MethodParams.build(node: node, method_type: method_type)
200
- else
201
- TypeInference::MethodParams.empty(node: node)
202
- end
198
+ if method_type
199
+ TypeInference::MethodParams.build(node: node, method_type: method_type)
200
+ else
201
+ TypeInference::MethodParams.empty(node: node)
202
+ end
203
203
 
204
204
  method_context = TypeInference::Context::MethodContext.new(
205
205
  name: method_name,
@@ -405,9 +405,10 @@ module Steep
405
405
  type_params = definition.type_params_decl.map do |param|
406
406
  Interface::TypeParam.new(
407
407
  name: param.name,
408
- upper_bound: checker.factory.type_opt(param.upper_bound),
408
+ upper_bound: checker.factory.type_opt(param.upper_bound_type),
409
409
  variance: param.variance,
410
- unchecked: param.unchecked?
410
+ unchecked: param.unchecked?,
411
+ default_type: checker.factory.type_opt(param.default_type)
411
412
  )
412
413
  end
413
414
  variable_context = TypeInference::Context::TypeVariableContext.new(type_params)
@@ -494,10 +495,11 @@ module Steep
494
495
  type_params = definition.type_params_decl.map do |type_param|
495
496
  Interface::TypeParam.new(
496
497
  name: type_param.name,
497
- upper_bound: type_param.upper_bound&.yield_self {|t| checker.factory.type(t) },
498
+ upper_bound: type_param.upper_bound_type&.yield_self {|t| checker.factory.type(t) },
498
499
  variance: type_param.variance,
499
500
  unchecked: type_param.unchecked?,
500
- location: type_param.location
501
+ location: type_param.location,
502
+ default_type: checker.factory.type_opt(type_param.default_type)
501
503
  )
502
504
  end
503
505
  variable_context = TypeInference::Context::TypeVariableContext.new(type_params)
@@ -705,7 +707,7 @@ module Steep
705
707
  if new_pair.constr.context != pair.constr.context
706
708
  # update context
707
709
  range = node.loc.expression.end_pos..end_pos
708
- typing.add_context(range, context: new_pair.constr.context)
710
+ typing.cursor_context.set(range, new_pair.constr.context)
709
711
  end
710
712
  end
711
713
  end
@@ -878,16 +880,11 @@ module Steep
878
880
  if self_type && method_context!.method
879
881
  if super_def = method_context!.super_method
880
882
  super_method = Interface::Shape::Entry.new(
883
+ method_name: method_context!.name,
881
884
  private_method: true,
882
- method_types: super_def.defs.map {|type_def|
883
- decl = TypeInference::MethodCall::MethodDecl.new(
884
- method_name: InstanceMethodName.new(
885
- type_name: super_def.implemented_in || super_def.defined_in || raise,
886
- method_name: method_context!.name || raise("method context must have a name")
887
- ),
888
- method_def: type_def
889
- )
890
- checker.factory.method_type(type_def.type, method_decls: Set[decl])
885
+ overloads: super_def.defs.map {|type_def|
886
+ type = checker.factory.method_type(type_def.type)
887
+ Interface::Shape::MethodOverload.new(type, [type_def])
891
888
  }
892
889
  )
893
890
 
@@ -949,8 +946,8 @@ module Steep
949
946
  ) do |new|
950
947
  # @type var new: TypeConstruction
951
948
 
952
- new.typing.add_context_for_node(node, context: new.context)
953
- new.typing.add_context_for_body(node, context: new.context)
949
+ new.typing.cursor_context.set_node_context(node, new.context)
950
+ new.typing.cursor_context.set_body_context(node, new.context)
954
951
 
955
952
  new.method_context!.tap do |method_context|
956
953
  if method_context.method
@@ -1028,7 +1025,7 @@ module Steep
1028
1025
  # Skip end-less def
1029
1026
  begin_pos = body_node.loc.expression.end_pos
1030
1027
  end_pos = node.loc.end.begin_pos
1031
- typing.add_context(begin_pos..end_pos, context: body_pair.context)
1028
+ typing.cursor_context.set(begin_pos..end_pos, body_pair.context)
1032
1029
  end
1033
1030
  end
1034
1031
 
@@ -1061,8 +1058,8 @@ module Steep
1061
1058
  self_type: self_type,
1062
1059
  definition: definition
1063
1060
  )
1064
- new.typing.add_context_for_node(node, context: new.context)
1065
- new.typing.add_context_for_body(node, context: new.context)
1061
+ new.typing.cursor_context.set_node_context(node, new.context)
1062
+ new.typing.cursor_context.set_body_context(node, new.context)
1066
1063
 
1067
1064
  new.method_context!.tap do |method_context|
1068
1065
  if method_context.method
@@ -1426,7 +1423,7 @@ module Steep
1426
1423
  when condition
1427
1424
  add_typing(node, type: ty)
1428
1425
  else
1429
- add_typing(node, type: AST::Types::Boolean.new)
1426
+ add_typing(node, type: AST::Types::Boolean.instance)
1430
1427
  end
1431
1428
 
1432
1429
  when :hash, :kwargs
@@ -1505,13 +1502,13 @@ module Steep
1505
1502
  _, constructor = constructor.fallback_to_any(name_node)
1506
1503
  end
1507
1504
 
1508
- constructor.typing.add_context_for_node(node, context: constructor.context)
1509
- constructor.typing.add_context_for_body(node, context: constructor.context)
1505
+ constructor.typing.cursor_context.set_node_context(node, constructor.context)
1506
+ constructor.typing.cursor_context.set_body_context(node, constructor.context)
1510
1507
 
1511
1508
  constructor.synthesize(node.children[2]) if node.children[2]
1512
1509
 
1513
1510
  if constructor.module_context&.implement_name && !namespace_module?(node)
1514
- constructor.validate_method_definitions(node, constructor.module_context.implement_name)
1511
+ constructor.validate_method_definitions(node, constructor.module_context.implement_name || raise)
1515
1512
  end
1516
1513
  end
1517
1514
 
@@ -1544,13 +1541,13 @@ module Steep
1544
1541
  _, constructor = constructor.fallback_to_any(name_node)
1545
1542
  end
1546
1543
 
1547
- constructor.typing.add_context_for_node(node, context: constructor.context)
1548
- constructor.typing.add_context_for_body(node, context: constructor.context)
1544
+ constructor.typing.cursor_context.set_node_context(node, constructor.context)
1545
+ constructor.typing.cursor_context.set_body_context(node, constructor.context)
1549
1546
 
1550
1547
  constructor.synthesize(node.children[1]) if node.children[1]
1551
1548
 
1552
1549
  if constructor.module_context&.implement_name && !namespace_module?(node)
1553
- constructor.validate_method_definitions(node, constructor.module_context.implement_name)
1550
+ constructor.validate_method_definitions(node, constructor.module_context.implement_name || raise)
1554
1551
  end
1555
1552
  end
1556
1553
 
@@ -1572,8 +1569,8 @@ module Steep
1572
1569
  return constr.add_typing(node, type: AST::Builtin.nil_type)
1573
1570
  end
1574
1571
 
1575
- constructor.typing.add_context_for_node(node, context: constructor.context)
1576
- constructor.typing.add_context_for_body(node, context: constructor.context)
1572
+ constructor.typing.cursor_context.set_node_context(node, constructor.context)
1573
+ constructor.typing.cursor_context.set_body_context(node, constructor.context)
1577
1574
 
1578
1575
  constructor.synthesize(node.children[1]) if node.children[1]
1579
1576
 
@@ -1588,10 +1585,10 @@ module Steep
1588
1585
  end
1589
1586
 
1590
1587
  when :self
1591
- add_typing node, type: AST::Types::Self.new
1588
+ add_typing node, type: AST::Types::Self.instance
1592
1589
 
1593
1590
  when :cbase
1594
- add_typing node, type: AST::Types::Void.new
1591
+ add_typing node, type: AST::Types::Void.instance
1595
1592
 
1596
1593
  when :const
1597
1594
  yield_self do
@@ -1683,7 +1680,7 @@ module Steep
1683
1680
  if method_context && method_context.method
1684
1681
  if method_context.super_method
1685
1682
  types = method_context.super_method.method_types.map {|method_type|
1686
- checker.factory.method_type(method_type, method_decls: Set[]).type.return_type
1683
+ checker.factory.method_type(method_type).type.return_type
1687
1684
  }
1688
1685
  add_typing(node, type: union_type(*types))
1689
1686
  else
@@ -1711,13 +1708,11 @@ module Steep
1711
1708
  add_typing node, type: AST::Builtin::Array.instance_type(AST::Builtin.any_type)
1712
1709
  end
1713
1710
  else
1714
- node_range = node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }
1715
-
1716
1711
  if hint
1717
1712
  tuples = select_flatten_types(hint) {|type| type.is_a?(AST::Types::Tuple) } #: Array[AST::Types::Tuple]
1718
1713
  unless tuples.empty?
1719
1714
  tuples.each do |tuple|
1720
- typing.new_child(node_range) do |child_typing|
1715
+ typing.new_child() do |child_typing|
1721
1716
  if pair = with_new_typing(child_typing).try_tuple_type(node, tuple)
1722
1717
  return pair.with(constr: pair.constr.save_typing)
1723
1718
  end
@@ -1730,7 +1725,7 @@ module Steep
1730
1725
  arrays = select_flatten_types(hint) {|type| AST::Builtin::Array.instance_type?(type) } #: Array[AST::Types::Name::Instance]
1731
1726
  unless arrays.empty?
1732
1727
  arrays.each do |array|
1733
- typing.new_child(node_range) do |child_typing|
1728
+ typing.new_child() do |child_typing|
1734
1729
  pair = with_new_typing(child_typing).try_array_type(node, array)
1735
1730
  if pair.constr.check_relation(sub_type: pair.type, super_type: hint).success?
1736
1731
  return pair.with(constr: pair.constr.save_typing)
@@ -1760,7 +1755,7 @@ module Steep
1760
1755
  right_type, constr, right_context =
1761
1756
  constr
1762
1757
  .update_type_env { left_truthy.env }
1763
- .tap {|constr| typing.add_context_for_node(right_node, context: constr.context) }
1758
+ .tap {|constr| typing.cursor_context.set_node_context(right_node, constr.context) }
1764
1759
  .for_branch(right_node)
1765
1760
  .synthesize(right_node, hint: hint, condition: true).to_ary
1766
1761
 
@@ -1783,8 +1778,8 @@ module Steep
1783
1778
  type = union_type(left_falsy.type, right_type)
1784
1779
 
1785
1780
  unless type.is_a?(AST::Types::Any)
1786
- if check_relation(sub_type: type, super_type: AST::Types::Boolean.new).success?
1787
- type = AST::Types::Boolean.new
1781
+ if check_relation(sub_type: type, super_type: AST::Types::Boolean.instance).success?
1782
+ type = AST::Types::Boolean.instance
1788
1783
  end
1789
1784
  end
1790
1785
  end
@@ -1819,7 +1814,7 @@ module Steep
1819
1814
  right_type, constr, right_context =
1820
1815
  constr
1821
1816
  .update_type_env { left_falsy.env }
1822
- .tap {|constr| typing.add_context_for_node(right_node, context: constr.context) }
1817
+ .tap {|constr| typing.cursor_context.set_node_context(right_node, constr.context) }
1823
1818
  .for_branch(right_node)
1824
1819
  .synthesize(right_node, hint: left_truthy.type, condition: true).to_ary
1825
1820
 
@@ -1841,8 +1836,8 @@ module Steep
1841
1836
  type = union_type(left_truthy.type, right_type)
1842
1837
 
1843
1838
  unless type.is_a?(AST::Types::Any)
1844
- if check_relation(sub_type: type, super_type: AST::Types::Boolean.new).success?
1845
- type = AST::Types::Boolean.new
1839
+ if check_relation(sub_type: type, super_type: AST::Types::Boolean.instance).success?
1840
+ type = AST::Types::Boolean.instance
1846
1841
  end
1847
1842
  end
1848
1843
  end
@@ -1871,7 +1866,7 @@ module Steep
1871
1866
  constr
1872
1867
  .update_type_env { truthy.env }
1873
1868
  .for_branch(true_clause)
1874
- .tap {|constr| typing.add_context_for_node(true_clause, context: constr.context) }
1869
+ .tap {|constr| typing.cursor_context.set_node_context(true_clause, constr.context) }
1875
1870
  .synthesize(true_clause, hint: hint)
1876
1871
  end
1877
1872
 
@@ -1880,7 +1875,7 @@ module Steep
1880
1875
  constr
1881
1876
  .update_type_env { falsy.env }
1882
1877
  .for_branch(false_clause)
1883
- .tap {|constr| typing.add_context_for_node(false_clause, context: constr.context) }
1878
+ .tap {|constr| typing.cursor_context.set_node_context(false_clause, constr.context) }
1884
1879
  .synthesize(false_clause, hint: hint)
1885
1880
  end
1886
1881
 
@@ -2010,7 +2005,7 @@ module Steep
2010
2005
  when_clause_constr
2011
2006
  .for_branch(body)
2012
2007
  .update_type_env {|env| env.join(*body_envs) }
2013
- .tap {|constr| typing.add_context_for_node(body, context: constr.context) }
2008
+ .tap {|constr| typing.cursor_context.set_node_context(body, constr.context) }
2014
2009
  .synthesize(body, hint: hint)
2015
2010
  else
2016
2011
  Pair.new(type: AST::Builtin.nil_type, constr: when_clause_constr)
@@ -2112,7 +2107,7 @@ module Steep
2112
2107
  end
2113
2108
 
2114
2109
  if body
2115
- resbody_construction.typing.add_context_for_node(body, context: resbody_construction.context)
2110
+ resbody_construction.typing.cursor_context.set_node_context(body, resbody_construction.context)
2116
2111
  resbody_construction.synthesize(body, hint: hint)
2117
2112
  else
2118
2113
  Pair.new(constr: body_constr, type: AST::Builtin.nil_type)
@@ -2120,7 +2115,7 @@ module Steep
2120
2115
  end
2121
2116
 
2122
2117
  resbody_pairs.select! do |pair|
2123
- no_subtyping?(sub_type: pair.type, super_type: AST::Types::Bot.new)
2118
+ no_subtyping?(sub_type: pair.type, super_type: AST::Types::Bot.instance)
2124
2119
  end
2125
2120
 
2126
2121
  resbody_types = resbody_pairs.map(&:type)
@@ -2213,7 +2208,7 @@ module Steep
2213
2208
  type_env.merge(local_variable_types: pins)
2214
2209
  end
2215
2210
 
2216
- typing.add_context_for_body(node, context: body_constr.context)
2211
+ typing.cursor_context.set_body_context(node, body_constr.context)
2217
2212
  _, _, body_context = body_constr.synthesize(body).to_ary
2218
2213
 
2219
2214
  constr = constr.update_type_env do |env|
@@ -2267,7 +2262,7 @@ module Steep
2267
2262
  constr
2268
2263
  .update_type_env { body_env }
2269
2264
  .for_branch(body, break_context: TypeInference::Context::BreakContext.new(break_type: hint || AST::Builtin.nil_type, next_type: nil))
2270
- .tap {|constr| typing.add_context_for_node(body, context: constr.context) }
2265
+ .tap {|constr| typing.cursor_context.set_node_context(body, constr.context) }
2271
2266
  .synthesize(body).to_ary
2272
2267
 
2273
2268
  constr = constr.update_type_env {|env| env.join(exit_env, body_constr.context.type_env) }
@@ -2290,7 +2285,7 @@ module Steep
2290
2285
  .update_type_env {|env| env.merge(local_variable_types: env.pin_local_variables(nil)) }
2291
2286
  .for_branch(body, break_context: TypeInference::Context::BreakContext.new(break_type: hint || AST::Builtin.nil_type, next_type: nil))
2292
2287
 
2293
- typing.add_context_for_node(body, context: for_loop.context)
2288
+ typing.cursor_context.set_node_context(body, for_loop.context)
2294
2289
  _, body_constr, body_context = for_loop.synthesize(body)
2295
2290
 
2296
2291
  constr = cond_constr.update_type_env {|env| env.join(env, body_context.type_env) }
@@ -2413,7 +2408,7 @@ module Steep
2413
2408
  param_type = hint.type.params.required[0]
2414
2409
  case param_type
2415
2410
  when AST::Types::Any
2416
- type = AST::Types::Any.new
2411
+ type = AST::Types::Any.instance
2417
2412
  else
2418
2413
  if method = calculate_interface(param_type, private: true)&.methods&.[](value_node.children[0])
2419
2414
  return_types = method.method_types.filter_map do |method_type|
@@ -2456,7 +2451,6 @@ module Steep
2456
2451
  if block_type = method_context!.block_type
2457
2452
  type = AST::Types::Proc.new(
2458
2453
  type: block_type.type,
2459
- location: nil,
2460
2454
  block: nil,
2461
2455
  self_type: block_type.self_type
2462
2456
  )
@@ -3087,7 +3081,7 @@ module Steep
3087
3081
  node_type_hint: nil
3088
3082
  )
3089
3083
 
3090
- block_constr.typing.add_context_for_body(node, context: block_constr.context)
3084
+ block_constr.typing.cursor_context.set_body_context(node, block_constr.context)
3091
3085
 
3092
3086
  params.each_single_param do |param|
3093
3087
  _, block_constr = block_constr.synthesize(param.node, hint: param.type)
@@ -3295,7 +3289,11 @@ module Steep
3295
3289
  method_name: method_name,
3296
3290
  method_types: method.method_types
3297
3291
  )
3298
- decls = method.method_types.each_with_object(Set[]) {|type, decls| decls.merge(type.method_decls) }
3292
+
3293
+ decls = method.overloads.flat_map do |method_overload|
3294
+ method_overload.method_decls(method_name)
3295
+ end.to_set
3296
+
3299
3297
  call = TypeInference::MethodCall::Error.new(
3300
3298
  node: node,
3301
3299
  context: context.call_context,
@@ -3499,8 +3497,9 @@ module Steep
3499
3497
  ]
3500
3498
  }
3501
3499
 
3502
- def try_special_method(node, receiver_type:, method_name:, method_type:, arguments:, block_params:, block_body:, hint:)
3503
- decls = method_type.method_decls
3500
+ def try_special_method(node, receiver_type:, method_name:, method_overload:, arguments:, block_params:, block_body:, hint:)
3501
+ method_type = method_overload.method_type
3502
+ decls = method_overload.method_decls(method_name).to_set
3504
3503
 
3505
3504
  case
3506
3505
  when decl = decls.find {|decl| SPECIAL_METHOD_NAMES[:array_compact].include?(decl.method_name) }
@@ -3573,21 +3572,19 @@ module Steep
3573
3572
  end
3574
3573
 
3575
3574
  def type_method_call(node, method_name:, receiver_type:, method:, arguments:, block_params:, block_body:, tapp:, hint:)
3576
- node_range = node.loc.expression.to_range
3577
-
3578
3575
  # @type var fails: Array[[TypeInference::MethodCall::t, TypeConstruction]]
3579
3576
  fails = []
3580
3577
 
3581
- method.method_types.each do |method_type|
3582
- Steep.logger.tagged method_type.to_s do
3583
- typing.new_child(node_range) do |child_typing|
3578
+ method.overloads.each do |overload|
3579
+ Steep.logger.tagged overload.method_type.to_s do
3580
+ typing.new_child() do |child_typing|
3584
3581
  constr = self.with_new_typing(child_typing)
3585
3582
 
3586
3583
  call, constr = constr.try_special_method(
3587
3584
  node,
3588
3585
  receiver_type: receiver_type,
3589
3586
  method_name: method_name,
3590
- method_type: method_type,
3587
+ method_overload: overload,
3591
3588
  arguments: arguments,
3592
3589
  block_params: block_params,
3593
3590
  block_body: block_body,
@@ -3596,7 +3593,7 @@ module Steep
3596
3593
  node,
3597
3594
  receiver_type: receiver_type,
3598
3595
  method_name: method_name,
3599
- method_type: method_type,
3596
+ method_overload: overload,
3600
3597
  arguments: arguments,
3601
3598
  block_params: block_params,
3602
3599
  block_body: block_body,
@@ -3648,8 +3645,8 @@ module Steep
3648
3645
  end
3649
3646
  end
3650
3647
 
3651
- def with_child_typing(range:)
3652
- constr = with_new_typing(typing.new_child(range))
3648
+ def with_child_typing()
3649
+ constr = with_new_typing(typing.new_child())
3653
3650
 
3654
3651
  if block_given?
3655
3652
  yield constr
@@ -3752,7 +3749,7 @@ module Steep
3752
3749
  when TypeInference::SendArgs::PositionalArgs::SplatArg
3753
3750
  arg_type, _ =
3754
3751
  constr
3755
- .with_child_typing(range: arg.node.loc.expression.begin_pos ... arg.node.loc.expression.end_pos)
3752
+ .with_child_typing()
3756
3753
  .try_tuple_type!(arg.node.children[0])
3757
3754
  arg.type = arg_type
3758
3755
 
@@ -3834,9 +3831,12 @@ module Steep
3834
3831
  constr
3835
3832
  end
3836
3833
 
3837
- def try_method_type(node, receiver_type:, method_name:, method_type:, arguments:, block_params:, block_body:, tapp:, hint:)
3834
+ def try_method_type(node, receiver_type:, method_name:, method_overload:, arguments:, block_params:, block_body:, tapp:, hint:)
3838
3835
  constr = self
3839
3836
 
3837
+ method_type = method_overload.method_type
3838
+ decls = method_overload.method_decls(method_name).to_set
3839
+
3840
3840
  if tapp && type_args = tapp.types?(module_context.nesting, checker, [])
3841
3841
  type_arity = method_type.type_params.size
3842
3842
  type_param_names = method_type.type_params.map(&:name)
@@ -3848,21 +3848,23 @@ module Steep
3848
3848
 
3849
3849
  type_args.each_with_index do |type, index|
3850
3850
  param = method_type.type_params[index]
3851
- if param.upper_bound
3852
- if result = no_subtyping?(sub_type: type, super_type: param.upper_bound)
3851
+
3852
+ if upper_bound = param.upper_bound
3853
+ if result = no_subtyping?(sub_type: type.value, super_type: upper_bound)
3853
3854
  args_ << AST::Builtin.any_type
3854
3855
  constr.typing.add_error(
3855
3856
  Diagnostic::Ruby::TypeArgumentMismatchError.new(
3856
- type_arg: type,
3857
+ type_arg: type.value,
3857
3858
  type_param: param,
3858
- result: result
3859
+ result: result,
3860
+ location: type.location
3859
3861
  )
3860
3862
  )
3861
3863
  else
3862
- args_ << type
3864
+ args_ << type.value
3863
3865
  end
3864
3866
  else
3865
- args_ << type
3867
+ args_ << type.value
3866
3868
  end
3867
3869
  end
3868
3870
 
@@ -3872,8 +3874,9 @@ module Steep
3872
3874
  type_args.drop(type_arity).each do |type_arg|
3873
3875
  constr.typing.add_error(
3874
3876
  Diagnostic::Ruby::UnexpectedTypeArgument.new(
3875
- type_arg: type_arg,
3876
- method_type: method_type
3877
+ type_arg: type_arg.value,
3878
+ method_type: method_type,
3879
+ location: type_arg.location
3877
3880
  )
3878
3881
  )
3879
3882
  end
@@ -3883,7 +3886,7 @@ module Steep
3883
3886
  constr.typing.add_error(
3884
3887
  Diagnostic::Ruby::InsufficientTypeArgument.new(
3885
3888
  node: tapp.node,
3886
- type_args: type_args,
3889
+ type_args: type_args.map(&:value),
3887
3890
  method_type: method_type
3888
3891
  )
3889
3892
  )
@@ -3995,10 +3998,10 @@ module Steep
3995
3998
  )
3996
3999
 
3997
4000
  block_constr = block_constr.with_new_typing(
3998
- block_constr.typing.new_child(block_constr.typing.block_range(node))
4001
+ block_constr.typing.new_child()
3999
4002
  )
4000
4003
 
4001
- block_constr.typing.add_context_for_body(node, context: block_constr.context)
4004
+ block_constr.typing.cursor_context.set_body_context(node, block_constr.context)
4002
4005
 
4003
4006
  pairs.each do |param, type|
4004
4007
  case param
@@ -4280,7 +4283,7 @@ module Steep
4280
4283
  method_name: method_name,
4281
4284
  actual_method_type: method_type,
4282
4285
  return_type: return_type || method_type.type.return_type,
4283
- method_decls: method_type.method_decls
4286
+ method_decls: decls
4284
4287
  )
4285
4288
  else
4286
4289
  TypeInference::MethodCall::Error.new(
@@ -4289,7 +4292,7 @@ module Steep
4289
4292
  receiver_type: receiver_type,
4290
4293
  method_name: method_name,
4291
4294
  return_type: return_type || method_type.type.return_type,
4292
- method_decls: method_type.method_decls,
4295
+ method_decls: decls,
4293
4296
  errors: errors
4294
4297
  )
4295
4298
  end
@@ -4345,7 +4348,7 @@ module Steep
4345
4348
  node_type_hint: nil
4346
4349
  )
4347
4350
 
4348
- block_constr.typing.add_context_for_body(node, context: block_constr.context)
4351
+ block_constr.typing.cursor_context.set_body_context(node, block_constr.context)
4349
4352
 
4350
4353
  block_params.params.each do |param|
4351
4354
  param.each_param do |param|
@@ -4523,7 +4526,7 @@ module Steep
4523
4526
  body_type, _, context = synthesize(block_body, hint: block_context&.body_type || block_type_hint)
4524
4527
 
4525
4528
  range = block_body.loc.expression.end_pos..node.loc.end.begin_pos
4526
- typing.add_context(range, context: context)
4529
+ typing.cursor_context.set(range, context)
4527
4530
 
4528
4531
  body_type
4529
4532
  else
@@ -4548,7 +4551,7 @@ module Steep
4548
4551
  types = types.reject {|t| t.is_a?(AST::Types::Bot) }
4549
4552
 
4550
4553
  if types.empty?
4551
- AST::Types::Bot.new
4554
+ AST::Types::Bot.instance
4552
4555
  else
4553
4556
  types.inject do |type1, type2|
4554
4557
  next type2 if type1.is_a?(AST::Types::Any)
@@ -4718,7 +4721,7 @@ module Steep
4718
4721
  end
4719
4722
 
4720
4723
  def unwrap(type)
4721
- checker.factory.unwrap_optional(type) || AST::Types::Bot.new
4724
+ checker.factory.unwrap_optional(type) || AST::Types::Bot.instance
4722
4725
  end
4723
4726
 
4724
4727
  def deep_expand_alias(type)
@@ -4765,7 +4768,7 @@ module Steep
4765
4768
  when AST::Types::Any
4766
4769
  nil
4767
4770
  else
4768
- literal_type = AST::Types::Literal.new(value: literal, location: nil)
4771
+ literal_type = AST::Types::Literal.new(value: literal)
4769
4772
  if check_relation(sub_type: literal_type, super_type: hint).success?
4770
4773
  hint
4771
4774
  end
@@ -4788,9 +4791,7 @@ module Steep
4788
4791
  def try_tuple_type!(node, hint: nil)
4789
4792
  if node.type == :array
4790
4793
  if hint.nil? || hint.is_a?(AST::Types::Tuple)
4791
- node_range = node.loc.expression.to_range
4792
-
4793
- typing.new_child(node_range) do |child_typing|
4794
+ typing.new_child() do |child_typing|
4794
4795
  if pair = with_new_typing(child_typing).try_tuple_type(node, hint)
4795
4796
  return pair.with(constr: pair.constr.save_typing)
4796
4797
  end
@@ -4961,11 +4962,11 @@ module Steep
4961
4962
  each_child_node(hash_node) do |child|
4962
4963
  if child.type == :pair
4963
4964
  case child.children[0].type
4964
- when :sym, :str, :int
4965
+ when :sym, :int, :str, :true, :false
4965
4966
  key_node = child.children[0] #: Parser::AST::Node
4966
4967
  value_node = child.children[1] #: Parser::AST::Node
4967
4968
 
4968
- key = key_node.children[0] #: String | Symbol | Integer
4969
+ key = key_node.children[0] #: AST::Types::Record::key
4969
4970
 
4970
4971
  _, constr = constr.synthesize(key_node, hint: AST::Types::Literal.new(value: key))
4971
4972
 
@@ -4990,7 +4991,7 @@ module Steep
4990
4991
  end
4991
4992
  end
4992
4993
 
4993
- type = AST::Types::Record.new(elements: elems)
4994
+ type = AST::Types::Record.new(elements: elems, required_keys: record_type&.required_keys || Set.new(elems.keys))
4994
4995
  constr.add_typing(hash_node, type: type)
4995
4996
  end
4996
4997
 
@@ -4998,18 +4999,17 @@ module Steep
4998
4999
  if hint
4999
5000
  hint = deep_expand_alias(hint)
5000
5001
  end
5001
- range = hash_node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }
5002
5002
 
5003
5003
  case hint
5004
5004
  when AST::Types::Record
5005
- with_child_typing(range: range) do |constr|
5005
+ with_child_typing() do |constr|
5006
5006
  pair = constr.type_hash_record(hash_node, hint)
5007
5007
  if pair
5008
5008
  return pair.with(constr: pair.constr.save_typing)
5009
5009
  end
5010
5010
  end
5011
5011
  when AST::Types::Union
5012
- pair = pick_one_of(hint.types, range: range) do |type, constr|
5012
+ pair = pick_one_of(hint.types) do |type, constr|
5013
5013
  constr.type_hash(hash_node, hint: type)
5014
5014
  end
5015
5015
 
@@ -5075,9 +5075,9 @@ module Steep
5075
5075
  constr.add_typing(hash_node, type: hash_type)
5076
5076
  end
5077
5077
 
5078
- def pick_one_of(types, range:)
5078
+ def pick_one_of(types)
5079
5079
  types.each do |type|
5080
- with_child_typing(range: range) do |constr|
5080
+ with_child_typing() do |constr|
5081
5081
  if (type_, constr = yield(type, constr))
5082
5082
  constr.check_relation(sub_type: type_, super_type: type).then do
5083
5083
  constr = constr.save_typing
@@ -174,7 +174,7 @@ module Steep
174
174
  def params_type0(hint:)
175
175
  # @type var leadings: Array[AST::Types::t]
176
176
  # @type var optionals: Array[AST::Types::t]
177
-
177
+
178
178
  if hint
179
179
  case
180
180
  when leading_params.size == hint.required.size
@@ -223,8 +223,8 @@ module Steep
223
223
  end
224
224
  end
225
225
  else
226
- leadings = leading_params.map {|param| param.type || AST::Types::Any.new }
227
- optionals = optional_params.map {|param| param.type || AST::Types::Any.new }
226
+ leadings = leading_params.map {|param| param.type || AST::Types::Any.instance }
227
+ optionals = optional_params.map {|param| param.type || AST::Types::Any.instance }
228
228
 
229
229
  if rest_param
230
230
  if rest_type = rest_param.type
@@ -232,7 +232,7 @@ module Steep
232
232
  rest = array.args.first or raise
233
233
  end
234
234
  end
235
- rest ||= AST::Types::Any.new
235
+ rest ||= AST::Types::Any.instance
236
236
  end
237
237
  end
238
238
 
@@ -282,7 +282,7 @@ module Steep
282
282
  if ty
283
283
  zip << [param, ty]
284
284
  else
285
- zip << [param, AST::Types::Nil.new]
285
+ zip << [param, AST::Types::Nil.instance]
286
286
  end
287
287
  end
288
288
 
@@ -291,7 +291,7 @@ module Steep
291
291
  union = AST::Types::Union.build(types: types)
292
292
  zip << [rest_param, AST::Builtin::Array.instance_type(union)]
293
293
  else
294
- zip << [rest_param, AST::Types::Nil.new]
294
+ zip << [rest_param, AST::Types::Nil.instance]
295
295
  end
296
296
  end
297
297
  end