steep 0.27.0 → 0.28.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -90,20 +90,32 @@ module Steep
90
90
 
91
91
  def except(vars)
92
92
  self.class.new(
93
- dictionary: dictionary.reject {|k, _| vars.include?(k) },
93
+ dictionary: dictionary,
94
94
  instance_type: instance_type,
95
95
  module_type: module_type,
96
96
  self_type: self_type
97
- )
97
+ ).except!(vars)
98
98
  end
99
99
 
100
- def merge!(s)
100
+ def except!(vars)
101
+ vars.each do |var|
102
+ dictionary.delete(var)
103
+ end
104
+
105
+ self
106
+ end
107
+
108
+ def merge!(s, overwrite: false)
101
109
  dictionary.transform_values! {|ty| ty.subst(s) }
102
110
  dictionary.merge!(s.dictionary) do |key, a, b|
103
111
  if a == b
104
112
  a
105
113
  else
106
- raise "Duplicated key on merge!: #{key}, #{a}, #{b}"
114
+ if overwrite
115
+ b
116
+ else
117
+ raise "Duplicated key on merge!: #{key}, #{a}, #{b} (#{self})"
118
+ end
107
119
  end
108
120
  end
109
121
 
@@ -234,7 +234,7 @@ module Steep
234
234
  when AST::Types::Name::Instance
235
235
  type_name = subtyping.factory.type_name_1(type.name)
236
236
  subtyping.factory.definition_builder.build_instance(type_name)
237
- when AST::Types::Name::Class, AST::Types::Name::Module
237
+ when AST::Types::Name::Singleton
238
238
  type_name = subtyping.factory.type_name_1(type.name)
239
239
  subtyping.factory.definition_builder.build_singleton(type_name)
240
240
  when AST::Types::Name::Interface
@@ -92,7 +92,7 @@ module Steep
92
92
  method_definition
93
93
  ]
94
94
  end
95
- when AST::Types::Name::Class
95
+ when AST::Types::Name::Singleton
96
96
  method_definition = method_definition_for(factory, receiver_type.name, singleton_method: method_name)
97
97
  if method_definition&.defined_in
98
98
  owner_name = factory.type_name(method_definition.defined_in)
@@ -40,6 +40,7 @@ module Steep
40
40
  case request[:method]
41
41
  when "shutdown"
42
42
  @shutdown = true
43
+ writer.write(id: request[:id], result: nil)
43
44
  when "exit"
44
45
  break
45
46
  else
@@ -139,6 +139,8 @@ module Steep
139
139
  end
140
140
 
141
141
  def handle_job(job)
142
+ sleep 0.1
143
+
142
144
  path, version, target = job
143
145
  if !version || target_files[path] == version
144
146
  typecheck_file(path, target)
@@ -23,7 +23,7 @@ module Steep
23
23
  @signature_worker = signature_worker
24
24
  @code_workers = code_workers
25
25
  @worker_to_paths = {}
26
- @shutdown = false
26
+ @shutdown_request_id = nil
27
27
  end
28
28
 
29
29
  def start
@@ -60,7 +60,14 @@ module Steep
60
60
  end
61
61
 
62
62
  while job = queue.pop
63
- writer.write(job) unless @shutdown
63
+ if @shutdown_request_id
64
+ if job[:id] == @shutdown_request_id
65
+ writer.write(job)
66
+ break
67
+ end
68
+ else
69
+ writer.write(job)
70
+ end
64
71
  end
65
72
 
66
73
  writer.io.close
@@ -155,7 +162,7 @@ module Steep
155
162
 
156
163
  when "shutdown"
157
164
  queue << { id: id, result: nil }
158
- @shutdown = true
165
+ @shutdown_request_id = id
159
166
 
160
167
  when "exit"
161
168
  queue << nil
@@ -38,7 +38,7 @@ module Steep
38
38
  end
39
39
 
40
40
  def self.parser
41
- ::Parser::Ruby25.new(Builder.new).tap do |parser|
41
+ ::Parser::Ruby27.new(Builder.new).tap do |parser|
42
42
  parser.diagnostics.all_errors_are_fatal = true
43
43
  parser.diagnostics.ignore_warnings = true
44
44
  end
@@ -60,7 +60,7 @@ module Steep
60
60
  _, comments, _ = yield_self do
61
61
  buffer = ::Parser::Source::Buffer.new(path.to_s)
62
62
  buffer.source = source_code
63
- parser = ::Parser::Ruby25.new
63
+ parser = ::Parser::Ruby27.new
64
64
 
65
65
  parser.tokenize(buffer)
66
66
  end
@@ -42,9 +42,8 @@ module Steep
42
42
  )
43
43
  end
44
44
  when RBS::Definition::Ancestor::Singleton
45
- AST::Types::Name::Class.new(
45
+ AST::Types::Name::Singleton.new(
46
46
  name: name,
47
- constructor: nil,
48
47
  location: nil
49
48
  )
50
49
  end
@@ -78,9 +77,8 @@ module Steep
78
77
  )
79
78
  end
80
79
  when RBS::Definition::Ancestor::Singleton
81
- AST::Types::Name::Class.new(
80
+ AST::Types::Name::Singleton.new(
82
81
  name: name,
83
- constructor: nil,
84
82
  location: nil
85
83
  )
86
84
  end
@@ -180,6 +178,14 @@ module Steep
180
178
  constraints: constraints
181
179
  )
182
180
 
181
+ when relation.super_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.super_type.name)
182
+ constraints.add(relation.super_type.name, sub_type: relation.sub_type)
183
+ success(constraints: constraints)
184
+
185
+ when relation.sub_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.sub_type.name)
186
+ constraints.add(relation.sub_type.name, super_type: relation.super_type)
187
+ success(constraints: constraints)
188
+
183
189
  when relation.sub_type.is_a?(AST::Types::Union)
184
190
  results = relation.sub_type.types.map do |sub_type|
185
191
  check(Relation.new(sub_type: sub_type, super_type: relation.super_type),
@@ -232,14 +238,6 @@ module Steep
232
238
  results.find(&:failure?)
233
239
  end
234
240
 
235
- when relation.super_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.super_type.name)
236
- constraints.add(relation.super_type.name, sub_type: relation.sub_type)
237
- success(constraints: constraints)
238
-
239
- when relation.sub_type.is_a?(AST::Types::Var) && constraints.unknown?(relation.sub_type.name)
240
- constraints.add(relation.sub_type.name, super_type: relation.super_type)
241
- success(constraints: constraints)
242
-
243
241
  when relation.super_type.is_a?(AST::Types::Var) || relation.sub_type.is_a?(AST::Types::Var)
244
242
  failure(error: Result::Failure::UnknownPairError.new(relation: relation),
245
243
  trace: trace)
@@ -266,7 +264,7 @@ module Steep
266
264
  possible_sub_types = case relation.sub_type
267
265
  when AST::Types::Name::Instance
268
266
  instance_super_types(relation.sub_type.name, args: relation.sub_type.args)
269
- when AST::Types::Name::Class
267
+ when AST::Types::Name::Singleton
270
268
  singleton_super_types(relation.sub_type.name)
271
269
  else
272
270
  []
@@ -399,7 +397,7 @@ module Steep
399
397
  case type
400
398
  when AST::Types::Name::Instance
401
399
  factory.definition_builder.build_instance(type_name)
402
- when AST::Types::Name::Class
400
+ when AST::Types::Name::Singleton
403
401
  factory.definition_builder.build_singleton(type_name)
404
402
  when AST::Types::Name::Interface
405
403
  factory.definition_builder.build_interface(type_name)
@@ -484,11 +482,7 @@ module Steep
484
482
  if sub_type.name == super_type.name && sub_type.args.size == super_type.args.size
485
483
  sub_type.args.zip(super_type.args)
486
484
  end
487
- when sub_type.is_a?(AST::Types::Name::Class) && super_type.is_a?(AST::Types::Name::Class)
488
- if sub_type.name == super_type.name
489
- []
490
- end
491
- when sub_type.is_a?(AST::Types::Name::Module) && super_type.is_a?(AST::Types::Name::Module)
485
+ when sub_type.is_a?(AST::Types::Name::Singleton) && super_type.is_a?(AST::Types::Name::Singleton)
492
486
  if sub_type.name == super_type.name
493
487
  []
494
488
  end
@@ -535,29 +529,24 @@ module Steep
535
529
 
536
530
  def check_method(name, sub_method, super_method, self_type:, assumption:, trace:, constraints:)
537
531
  trace.method name, sub_method, super_method do
538
- case
539
- when sub_method.overload? && super_method.overload?
540
- super_method.types.map do |super_type|
541
- sub_method.types.map do |sub_type|
542
- check_generic_method_type name,
543
- sub_type,
544
- super_type,
545
- self_type: self_type,
546
- assumption: assumption,
547
- trace: trace,
548
- constraints: constraints
549
- end.yield_self do |results|
550
- results.find(&:success?) || results[0]
551
- end
532
+ super_method.method_types.map do |super_type|
533
+ sub_method.method_types.map do |sub_type|
534
+ check_generic_method_type name,
535
+ sub_type,
536
+ super_type,
537
+ self_type: self_type,
538
+ assumption: assumption,
539
+ trace: trace,
540
+ constraints: constraints
552
541
  end.yield_self do |results|
553
- if results.all?(&:success?) || sub_method.incompatible?
554
- success constraints: constraints
555
- else
556
- results.select(&:failure?).last
557
- end
542
+ results.find(&:success?) || results[0]
543
+ end
544
+ end.yield_self do |results|
545
+ if results.all?(&:success?)
546
+ success constraints: constraints
547
+ else
548
+ results.select(&:failure?).last
558
549
  end
559
- else
560
- raise "aaaaaaaaaaaaaa"
561
550
  end
562
551
  end
563
552
  end
@@ -113,6 +113,7 @@ module Steep
113
113
  end
114
114
 
115
115
  def check_relation(sub_type:, super_type:, constraints: Subtyping::Constraints.empty)
116
+ Steep.logger.debug { "check_relation: self:#{self_type} |- #{sub_type} <: #{super_type}" }
116
117
  checker.check(Subtyping::Relation.new(sub_type: sub_type, super_type: super_type), self_type: self_type, constraints: constraints)
117
118
  end
118
119
 
@@ -286,7 +287,6 @@ module Steep
286
287
 
287
288
  instance_type = AST::Types::Intersection.build(
288
289
  types: [
289
- AST::Types::Name::Instance.new(name: module_name, args: module_args),
290
290
  AST::Builtin::Object.instance_type,
291
291
  *module_entry.self_types.map {|module_self|
292
292
  type = case
@@ -304,11 +304,12 @@ module Steep
304
304
  )
305
305
  end
306
306
  checker.factory.type(type)
307
- }
307
+ },
308
+ AST::Types::Name::Instance.new(name: module_name, args: module_args)
308
309
  ].compact
309
310
  )
310
311
 
311
- module_type = AST::Types::Name::Class.new(name: module_name, constructor: nil)
312
+ module_type = AST::Types::Name::Singleton.new(name: module_name)
312
313
  end
313
314
 
314
315
  if annots.instance_type
@@ -379,7 +380,7 @@ module Steep
379
380
  module_def = checker.factory.definition_builder.build_singleton(type_name_)
380
381
 
381
382
  instance_type = AST::Types::Name::Instance.new(name: class_name, args: class_args)
382
- module_type = AST::Types::Name::Class.new(name: class_name, constructor: nil)
383
+ module_type = AST::Types::Name::Singleton.new(name: class_name)
383
384
  end
384
385
 
385
386
  if annots.instance_type
@@ -443,18 +444,26 @@ module Steep
443
444
  end
444
445
 
445
446
  module_type = case instance_type
446
- when AST::Types::Name::Class
447
- AST::Builtin::Class.instance_type
448
- when AST::Types::Name::Module
449
- AST::Builtin::Module.instance_type
447
+ when AST::Types::Name::Singleton
448
+ type_name = checker.factory.type_name_1(instance_type.name)
449
+
450
+ case checker.factory.env.class_decls[type_name]
451
+ when RBS::Environment::ModuleEntry
452
+ AST::Builtin::Module.instance_type
453
+ when RBS::Environment::ClassEntry
454
+ AST::Builtin::Class.instance_type
455
+ else
456
+ raise
457
+ end
458
+
450
459
  when AST::Types::Name::Instance
451
- instance_type.to_class(constructor: nil)
460
+ instance_type.to_module
452
461
  else
453
- raise "Unexpected type for sclass node: #{type}"
462
+ return
454
463
  end
455
464
 
456
465
  instance_definition = case instance_type
457
- when AST::Types::Name::Class, AST::Types::Name::Module
466
+ when AST::Types::Name::Singleton
458
467
  type_name = checker.factory.type_name_1(instance_type.name)
459
468
  checker.factory.definition_builder.build_singleton(type_name)
460
469
  when AST::Types::Name::Instance
@@ -463,7 +472,7 @@ module Steep
463
472
  end
464
473
 
465
474
  module_definition = case module_type
466
- when AST::Types::Name::Class, AST::Types::Name::Module
475
+ when AST::Types::Name::Singleton
467
476
  type_name = checker.factory.type_name_1(instance_type.name)
468
477
  checker.factory.definition_builder.build_singleton(type_name)
469
478
  else
@@ -638,7 +647,10 @@ module Steep
638
647
  when :__skip__
639
648
  add_typing(node, type: AST::Builtin.any_type)
640
649
  else
641
- hint ||= context.lvar_env.declared_types[name]&.type
650
+ if !hint || hint.is_a?(AST::Types::Void)
651
+ hint = context.lvar_env.declared_types[name]&.type
652
+ end
653
+
642
654
  rhs_result = synthesize(rhs, hint: hint)
643
655
 
644
656
  constr = rhs_result.constr.update_lvar_env do |lvar_env|
@@ -683,8 +695,8 @@ module Steep
683
695
  yield_self do
684
696
  if self_class?(node)
685
697
  module_type = expand_alias(module_context.module_type)
686
- type = if module_type.is_a?(AST::Types::Name::Class)
687
- AST::Types::Name::Class.new(name: module_type.name, constructor: method_context.constructor)
698
+ type = if module_type.is_a?(AST::Types::Name::Singleton)
699
+ AST::Types::Name::Singleton.new(name: module_type.name)
688
700
  else
689
701
  module_type
690
702
  end
@@ -699,8 +711,8 @@ module Steep
699
711
  yield_self do
700
712
  pair = if self_class?(node)
701
713
  module_type = expand_alias(module_context.module_type)
702
- type = if module_type.is_a?(AST::Types::Name::Class)
703
- AST::Types::Name::Class.new(name: module_type.name, constructor: method_context.constructor)
714
+ type = if module_type.is_a?(AST::Types::Name::Singleton)
715
+ AST::Types::Name::Singleton.new(name: module_type.name)
704
716
  else
705
717
  module_type
706
718
  end
@@ -777,11 +789,10 @@ module Steep
777
789
  synthesize(child)
778
790
  end
779
791
 
780
- super_method = Interface::Interface::Combination.overload(
781
- method_context.super_method.method_types.map {|method_type|
792
+ super_method = Interface::Interface::Entry.new(
793
+ method_types: method_context.super_method.method_types.map {|method_type|
782
794
  checker.factory.method_type(method_type, self_type: self_type)
783
- },
784
- incompatible: false
795
+ }
785
796
  )
786
797
  args = TypeInference::SendArgs.from_nodes(node.children.dup)
787
798
 
@@ -879,7 +890,7 @@ module Steep
879
890
  when AST::Types::Name::Instance
880
891
  name = checker.factory.type_name_1(self_type.name)
881
892
  checker.factory.definition_builder.build_singleton(name)
882
- when AST::Types::Name::Module, AST::Types::Name::Class
893
+ when AST::Types::Name::Singleton
883
894
  name = checker.factory.type_name_1(self_type.name)
884
895
  checker.factory.definition_builder.build_singleton(name)
885
896
  end
@@ -1034,12 +1045,13 @@ module Steep
1034
1045
  var = node.children[0]
1035
1046
  rhs = node.children[1]
1036
1047
 
1037
- type = context.lvar_env[var.name]
1048
+ var_type = context.lvar_env[var.name]
1049
+ node_type, constr = synthesize(rhs, hint: var_type)
1038
1050
 
1039
- node_type, constr = synthesize(rhs, hint: type)
1051
+ type = AST::Types::Union.build(types: [var_type, node_type])
1040
1052
 
1041
1053
  constr_ = constr.update_lvar_env do |env|
1042
- env.assign(var.name, node: node, type: node_type) do |declared_type, type, result|
1054
+ env.assign(var.name, node: node, type: type) do |declared_type, type, result|
1043
1055
  typing.add_error(
1044
1056
  Errors::IncompatibleAssignment.new(node: node,
1045
1057
  lhs_type: declared_type,
@@ -1049,7 +1061,7 @@ module Steep
1049
1061
  end
1050
1062
  end
1051
1063
 
1052
- add_typing(node, type: constr_.context.lvar_env[var.name], constr: constr_)
1064
+ add_typing(node, type: type, constr: constr_)
1053
1065
  end
1054
1066
 
1055
1067
  when :restarg
@@ -1229,6 +1241,17 @@ module Steep
1229
1241
  type, constr = synthesize(node.children[0])
1230
1242
  constructor = constr.for_sclass(node, type)
1231
1243
 
1244
+ unless constructor
1245
+ typing.add_error(
1246
+ Errors::UnsupportedSyntax.new(
1247
+ node: node,
1248
+ message: "sclass receiver must be instance type or singleton type, but type given `#{type}`"
1249
+ )
1250
+ )
1251
+ constr.add_typing(node, type: AST::Builtin.nil_type)
1252
+ return
1253
+ end
1254
+
1232
1255
  constructor.typing.add_context_for_node(node, context: constructor.context)
1233
1256
  constructor.typing.add_context_for_body(node, context: constructor.context)
1234
1257
 
@@ -1240,7 +1263,7 @@ module Steep
1240
1263
  end
1241
1264
  end
1242
1265
 
1243
- add_typing(node, type: AST::Builtin.nil_type)
1266
+ constr.add_typing(node, type: AST::Builtin.nil_type)
1244
1267
  end
1245
1268
 
1246
1269
  when :self
@@ -1509,38 +1532,53 @@ module Steep
1509
1532
  test_types << expand_alias(type)
1510
1533
  end
1511
1534
 
1512
- if body
1513
- if var_names && var_types && test_types.all? {|ty| ty.is_a?(AST::Types::Name::Class) }
1514
- var_types_in_body = test_types.flat_map do |test_type|
1515
- filtered_types = var_types.select do |var_type|
1516
- var_type.is_a?(AST::Types::Name::Base) && var_type.name == test_type.name
1517
- end
1518
- if filtered_types.empty?
1519
- to_instance_type(test_type)
1520
- else
1521
- filtered_types
1522
- end
1535
+ if var_names && var_types && test_types.all? {|ty| ty.is_a?(AST::Types::Name::Singleton) }
1536
+ var_types_in_body = test_types.flat_map do |test_type|
1537
+ filtered_types = var_types.select do |var_type|
1538
+ var_type.is_a?(AST::Types::Name::Base) && var_type.name == test_type.name
1523
1539
  end
1524
-
1525
- var_types.reject! do |type|
1526
- var_types_in_body.any? do |test_type|
1527
- type.is_a?(AST::Types::Name::Base) && test_type.name == type.name
1528
- end
1540
+ if filtered_types.empty?
1541
+ to_instance_type(test_type)
1542
+ else
1543
+ filtered_types
1529
1544
  end
1545
+ end
1530
1546
 
1531
- var_type_in_body = union_type(*var_types_in_body)
1532
- type_case_override = var_names.each.with_object({}) do |var_name, hash|
1533
- hash[var_name] = var_type_in_body
1547
+ var_types.reject! do |type|
1548
+ var_types_in_body.any? do |test_type|
1549
+ type.is_a?(AST::Types::Name::Base) && test_type.name == type.name
1534
1550
  end
1551
+ end
1535
1552
 
1553
+ var_type_in_body = union_type(*var_types_in_body)
1554
+ type_case_override = var_names.each.with_object({}) do |var_name, hash|
1555
+ hash[var_name] = var_type_in_body
1556
+ end
1557
+
1558
+ if body
1536
1559
  branch_pairs << clause_constr
1537
1560
  .for_branch(body, type_case_override: type_case_override)
1538
1561
  .synthesize(body, hint: hint)
1539
1562
  else
1540
- branch_pairs << clause_constr.synthesize(body, hint: hint)
1563
+ branch_pairs << Pair.new(type: AST::Builtin.nil_type, constr: clause_constr)
1541
1564
  end
1542
1565
  else
1543
- branch_pairs << Pair.new(type: AST::Builtin.nil_type, constr: clause_constr)
1566
+ logic = TypeInference::Logic.new(subtyping: checker)
1567
+
1568
+ truthys, falseys = logic.nodes(node: ::AST::Node.new(:begin, tests))
1569
+ truthy_env, _ = logic.environments(truthy_vars: truthys.vars,
1570
+ falsey_vars: falseys.vars,
1571
+ lvar_env: clause_constr.context.lvar_env)
1572
+
1573
+ if body
1574
+ branch_pairs << constr
1575
+ .update_lvar_env { truthy_env }
1576
+ .for_branch(body)
1577
+ .tap {|constr| typing.add_context_for_node(body, context: constr.context) }
1578
+ .synthesize(body, hint: hint)
1579
+ else
1580
+ branch_pairs << Pair.new(type: AST::Builtin.nil_type, constr: clause_constr)
1581
+ end
1544
1582
  end
1545
1583
  end
1546
1584
 
@@ -1620,7 +1658,7 @@ module Steep
1620
1658
  instance_types = exn_types.map do |type|
1621
1659
  type = expand_alias(type)
1622
1660
  case
1623
- when type.is_a?(AST::Types::Name::Class)
1661
+ when type.is_a?(AST::Types::Name::Singleton)
1624
1662
  to_instance_type(type)
1625
1663
  else
1626
1664
  AST::Builtin.any_type
@@ -1687,7 +1725,7 @@ module Steep
1687
1725
  AST::Types::Any.new
1688
1726
  else
1689
1727
  each = checker.factory.interface(collection_type, private: true).methods[:each]
1690
- method_type = (each&.types || []).find {|type| type.block && type.block.type.params.first_param }
1728
+ method_type = (each&.method_types || []).find {|type| type.block && type.block.type.params.first_param }
1691
1729
  method_type&.yield_self do |method_type|
1692
1730
  method_type.block.type.params.first_param&.type
1693
1731
  end
@@ -1779,9 +1817,22 @@ module Steep
1779
1817
  end
1780
1818
 
1781
1819
  when :irange, :erange
1782
- types = node.children.map {|n| synthesize(n).type }
1783
- type = AST::Builtin::Range.instance_type(union_type(*types))
1784
- add_typing(node, type: type)
1820
+ begin_node, end_node = node.children
1821
+
1822
+ constr = self
1823
+ begin_type, constr = if begin_node
1824
+ constr.synthesize(begin_node)
1825
+ else
1826
+ [AST::Builtin.nil_type, constr]
1827
+ end
1828
+ end_type, constr = if end_node
1829
+ constr.synthesize(end_node)
1830
+ else
1831
+ [AST::Builtin.nil_type, constr]
1832
+ end
1833
+
1834
+ type = AST::Builtin::Range.instance_type(union_type(begin_type, end_type))
1835
+ add_typing(node, type: type, constr: constr)
1785
1836
 
1786
1837
  when :regexp
1787
1838
  each_child_node(node) do |child|
@@ -1875,8 +1926,8 @@ module Steep
1875
1926
  param_type = hint.params.required[0]
1876
1927
  interface = checker.factory.interface(param_type, private: true)
1877
1928
  method = interface.methods[value.children[0]]
1878
- if method&.overload?
1879
- return_types = method.types.select {|method_type|
1929
+ if method
1930
+ return_types = method.method_types.select {|method_type|
1880
1931
  method_type.params.each_type.count == 0
1881
1932
  }.map(&:return_type)
1882
1933
 
@@ -2384,139 +2435,68 @@ module Steep
2384
2435
  def type_method_call(node, method_name:, receiver_type:, method:, args:, block_params:, block_body:, topdown_hint:)
2385
2436
  node_range = node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }
2386
2437
 
2387
- case
2388
- when method.union?
2389
- yield_self do
2390
- results = method.types.map do |method|
2438
+ results = method.method_types.flat_map do |method_type|
2439
+ Steep.logger.tagged method_type.to_s do
2440
+ zips = args.zips(method_type.params, method_type.block&.type)
2441
+
2442
+ zips.map do |arg_pairs|
2391
2443
  typing.new_child(node_range) do |child_typing|
2392
- with_new_typing(child_typing).type_method_call(node,
2393
- method_name: method_name,
2394
- receiver_type: receiver_type,
2395
- method: method,
2396
- args: args,
2397
- block_params: block_params,
2398
- block_body: block_body,
2399
- topdown_hint: false)
2400
- end
2401
- end
2444
+ ret = self.with_new_typing(child_typing).try_method_type(
2445
+ node,
2446
+ receiver_type: receiver_type,
2447
+ method_type: method_type,
2448
+ args: args,
2449
+ arg_pairs: arg_pairs,
2450
+ block_params: block_params,
2451
+ block_body: block_body,
2452
+ child_typing: child_typing,
2453
+ topdown_hint: topdown_hint
2454
+ )
2402
2455
 
2403
- if (type, constr, error = results.find {|_, _, error| error })
2404
- constr.typing.save!
2405
- [type,
2406
- update_lvar_env { constr.context.lvar_env },
2407
- error]
2408
- else
2409
- types = results.map(&:first)
2456
+ raise unless ret.is_a?(Array) && ret[1].is_a?(TypeConstruction)
2410
2457
 
2411
- _, constr, _ = results.first
2412
- constr.typing.save!
2458
+ result, constr = ret
2413
2459
 
2414
- [union_type(*types),
2415
- update_lvar_env { constr.context.lvar_env },
2416
- nil]
2460
+ [result, constr, method_type]
2461
+ end
2417
2462
  end
2418
2463
  end
2464
+ end
2419
2465
 
2420
- when method.intersection?
2421
- yield_self do
2422
- results = method.types.map do |method|
2423
- typing.new_child(node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }) do |child_typing|
2424
- with_new_typing(child_typing).type_method_call(node,
2466
+ unless results.empty?
2467
+ result, constr, method_type = results.find {|result, _, _| !result.is_a?(Errors::Base) } || results.last
2468
+ else
2469
+ method_type = method.method_types.last
2470
+ constr = self.with_new_typing(typing.new_child(node_range))
2471
+ result = Errors::IncompatibleArguments.new(node: node, receiver_type: receiver_type, method_type: method_type)
2472
+ end
2473
+ constr.typing.save!
2474
+
2475
+ case result
2476
+ when Errors::Base
2477
+ if method.method_types.size == 1
2478
+ typing.add_error result
2479
+ type = case method_type.return_type
2480
+ when AST::Types::Var
2481
+ AST::Builtin.any_type
2482
+ else
2483
+ method_type.return_type
2484
+ end
2485
+ else
2486
+ typing.add_error Errors::UnresolvedOverloading.new(node: node,
2487
+ receiver_type: expand_self(receiver_type),
2425
2488
  method_name: method_name,
2426
- receiver_type: receiver_type,
2427
- method: method,
2428
- args: args,
2429
- block_params: block_params,
2430
- block_body: block_body,
2431
- topdown_hint: false)
2432
- end
2433
- end
2434
-
2435
- successes = results.reject {|_, _, error| error }
2436
- unless successes.empty?
2437
- types = successes.map(&:first)
2438
- constr = successes[0][1]
2439
- constr.typing.save!
2440
-
2441
- [AST::Types::Intersection.build(types: types),
2442
- update_lvar_env { constr.context.lvar_env },
2443
- nil]
2444
- else
2445
- type, constr, error = results.first
2446
- constr.typing.save!
2447
-
2448
- [type,
2449
- update_lvar_env { constr.context.lvar_env },
2450
- error]
2451
- end
2489
+ method_types: method.method_types)
2490
+ type = AST::Builtin.any_type
2452
2491
  end
2453
2492
 
2454
- when method.overload?
2455
- yield_self do
2456
- results = method.types.flat_map do |method_type|
2457
- Steep.logger.tagged method_type.to_s do
2458
- zips = args.zips(method_type.params, method_type.block&.type)
2459
-
2460
- zips.map do |arg_pairs|
2461
- typing.new_child(node_range) do |child_typing|
2462
- ret = self.with_new_typing(child_typing).try_method_type(
2463
- node,
2464
- receiver_type: receiver_type,
2465
- method_type: method_type,
2466
- args: args,
2467
- arg_pairs: arg_pairs,
2468
- block_params: block_params,
2469
- block_body: block_body,
2470
- child_typing: child_typing,
2471
- topdown_hint: topdown_hint
2472
- )
2473
-
2474
- raise unless ret.is_a?(Array) && ret[1].is_a?(TypeConstruction)
2475
-
2476
- result, constr = ret
2477
-
2478
- [result, constr, method_type]
2479
- end
2480
- end
2481
- end
2482
- end
2483
-
2484
- unless results.empty?
2485
- result, constr, method_type = results.find {|result, _, _| !result.is_a?(Errors::Base) } || results.last
2486
- else
2487
- method_type = method.types.last
2488
- constr = self.with_new_typing(typing.new_child(node_range))
2489
- result = Errors::IncompatibleArguments.new(node: node, receiver_type: receiver_type, method_type: method_type)
2490
- end
2491
- constr.typing.save!
2492
-
2493
- case result
2494
- when Errors::Base
2495
- if method.types.size == 1
2496
- typing.add_error result
2497
- type = case method_type.return_type
2498
- when AST::Types::Var
2499
- AST::Builtin.any_type
2500
- else
2501
- method_type.return_type
2502
- end
2503
- else
2504
- typing.add_error Errors::UnresolvedOverloading.new(node: node,
2505
- receiver_type: expand_self(receiver_type),
2506
- method_name: method_name,
2507
- method_types: method.types)
2508
- type = AST::Builtin.any_type
2509
- end
2510
-
2511
- [type,
2512
- update_lvar_env { constr.context.lvar_env },
2513
- result]
2514
- else # Type
2515
- [result,
2516
- update_lvar_env { constr.context.lvar_env },
2517
- nil]
2518
- end
2519
- end
2493
+ [type,
2494
+ update_lvar_env { constr.context.lvar_env },
2495
+ result]
2496
+ else # Type
2497
+ [result,
2498
+ update_lvar_env { constr.context.lvar_env },
2499
+ nil]
2520
2500
  end
2521
2501
  end
2522
2502
 
@@ -2703,16 +2683,40 @@ module Steep
2703
2683
  if block_params && method_type.block
2704
2684
  block_annotations = source.annotations(block: node, factory: checker.factory, current_module: current_namespace)
2705
2685
  block_params_ = TypeInference::BlockParams.from_node(block_params, annotations: block_annotations)
2706
- block_param_hint = block_params_.params_type(
2707
- hint: topdown_hint ? method_type.block.type.params : nil
2708
- )
2709
2686
 
2710
- check_relation(sub_type: AST::Types::Proc.new(params: block_param_hint, return_type: AST::Types::Any.new),
2711
- super_type: method_type.block.type,
2712
- constraints: constraints).else do |result|
2713
- return [Errors::IncompatibleBlockParameters.new(node: node,
2714
- method_type: method_type),
2715
- constr]
2687
+ unless block_params_
2688
+ return [
2689
+ Errors::UnsupportedSyntax.new(
2690
+ node: block_params,
2691
+ message: "Unsupported block params pattern, probably masgn?"
2692
+ ),
2693
+ constr
2694
+ ]
2695
+ end
2696
+
2697
+ pairs = block_params_.zip(method_type.block.type.params)
2698
+
2699
+ unless pairs
2700
+ return [
2701
+ Errors::IncompatibleBlockParameters.new(node: node, method_type: method_type),
2702
+ constr
2703
+ ]
2704
+ end
2705
+
2706
+ pairs.each do |param, type|
2707
+ if param.type
2708
+ check_relation(sub_type: type, super_type: param.type, constraints: constraints).else do |result|
2709
+ return [
2710
+ Errors::IncompatibleAssignment.new(
2711
+ node: param.node,
2712
+ lhs_type: param.type,
2713
+ rhs_type: type,
2714
+ result: result
2715
+ ),
2716
+ constr
2717
+ ]
2718
+ end
2719
+ end
2716
2720
  end
2717
2721
  end
2718
2722
 
@@ -3272,7 +3276,7 @@ module Steep
3272
3276
 
3273
3277
  def to_instance_type(type, args: nil)
3274
3278
  args = args || case type
3275
- when AST::Types::Name::Class, AST::Types::Name::Module
3279
+ when AST::Types::Name::Singleton
3276
3280
  checker.factory.env.class_decls[checker.factory.type_name_1(type.name)].type_params.each.map { AST::Builtin.any_type }
3277
3281
  else
3278
3282
  raise "unexpected type to to_instance_type: #{type}"