steep 1.8.0.dev.1 → 1.8.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +3 -2
- data/bin/mem_graph.rb +67 -0
- data/bin/mem_prof.rb +102 -0
- data/bin/stackprof_test.rb +19 -0
- data/bin/steep-check.rb +251 -0
- data/guides/src/gem-rbs-collection/gem-rbs-collection.md +1 -1
- data/lib/steep/annotation_parser.rb +1 -1
- data/lib/steep/ast/builtin.rb +5 -5
- data/lib/steep/ast/node/type_application.rb +7 -6
- data/lib/steep/ast/types/any.rb +1 -9
- data/lib/steep/ast/types/boolean.rb +8 -16
- data/lib/steep/ast/types/bot.rb +2 -10
- data/lib/steep/ast/types/class.rb +1 -13
- data/lib/steep/ast/types/factory.rb +101 -85
- data/lib/steep/ast/types/instance.rb +1 -13
- data/lib/steep/ast/types/intersection.rb +8 -15
- data/lib/steep/ast/types/literal.rb +2 -8
- data/lib/steep/ast/types/logic.rb +3 -24
- data/lib/steep/ast/types/name.rb +5 -16
- data/lib/steep/ast/types/nil.rb +3 -12
- data/lib/steep/ast/types/proc.rb +4 -13
- data/lib/steep/ast/types/record.rb +21 -12
- data/lib/steep/ast/types/self.rb +1 -13
- data/lib/steep/ast/types/shared_instance.rb +11 -0
- data/lib/steep/ast/types/top.rb +1 -9
- data/lib/steep/ast/types/tuple.rb +4 -10
- data/lib/steep/ast/types/union.rb +10 -15
- data/lib/steep/ast/types/var.rb +4 -13
- data/lib/steep/ast/types/void.rb +2 -10
- data/lib/steep/diagnostic/ruby.rb +10 -10
- data/lib/steep/drivers/check.rb +11 -14
- data/lib/steep/drivers/checkfile.rb +8 -10
- data/lib/steep/drivers/stats.rb +17 -13
- data/lib/steep/drivers/utils/driver_helper.rb +24 -3
- data/lib/steep/drivers/watch.rb +3 -3
- data/lib/steep/interface/builder.rb +162 -138
- data/lib/steep/interface/method_type.rb +12 -20
- data/lib/steep/interface/shape.rb +66 -10
- data/lib/steep/interface/substitution.rb +2 -0
- data/lib/steep/interface/type_param.rb +20 -7
- data/lib/steep/located_value.rb +20 -0
- data/lib/steep/server/change_buffer.rb +5 -7
- data/lib/steep/server/custom_methods.rb +61 -0
- data/lib/steep/server/delay_queue.rb +8 -1
- data/lib/steep/server/interaction_worker.rb +13 -6
- data/lib/steep/server/lsp_formatter.rb +8 -6
- data/lib/steep/server/master.rb +195 -142
- data/lib/steep/server/type_check_worker.rb +25 -22
- data/lib/steep/server/work_done_progress.rb +64 -0
- data/lib/steep/server/worker_process.rb +1 -1
- data/lib/steep/services/completion_provider.rb +32 -24
- data/lib/steep/services/goto_service.rb +3 -2
- data/lib/steep/services/hover_provider/ruby.rb +30 -17
- data/lib/steep/services/signature_help_provider.rb +9 -7
- data/lib/steep/services/signature_service.rb +1 -1
- data/lib/steep/services/type_check_service.rb +19 -9
- data/lib/steep/signature/validator.rb +17 -20
- data/lib/steep/source.rb +47 -1
- data/lib/steep/subtyping/check.rb +105 -55
- data/lib/steep/subtyping/constraints.rb +13 -17
- data/lib/steep/type_construction.rb +106 -100
- data/lib/steep/type_inference/block_params.rb +8 -5
- data/lib/steep/type_inference/logic_type_interpreter.rb +11 -7
- data/lib/steep/type_inference/method_call.rb +3 -3
- data/lib/steep/type_inference/method_params.rb +1 -1
- data/lib/steep/type_inference/send_args.rb +1 -1
- data/lib/steep/typing.rb +164 -106
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +29 -4
- data/steep.gemspec +2 -2
- metadata +16 -9
- data/lib/steep/type_inference/context_array.rb +0 -112
@@ -79,8 +79,8 @@ module Steep
|
|
79
79
|
type_params.zip(type_args).each do |param, arg|
|
80
80
|
arg or raise
|
81
81
|
|
82
|
-
if param.
|
83
|
-
upper_bound_type = factory.type(param.
|
82
|
+
if param.upper_bound_type
|
83
|
+
upper_bound_type = factory.type(param.upper_bound_type).subst(subst)
|
84
84
|
arg_type = factory.type(arg)
|
85
85
|
|
86
86
|
constraints = Subtyping::Constraints.empty
|
@@ -101,7 +101,8 @@ module Steep
|
|
101
101
|
name: param.name,
|
102
102
|
upper_bound: upper_bound_type,
|
103
103
|
variance: param.variance,
|
104
|
-
unchecked: param.unchecked
|
104
|
+
unchecked: param.unchecked?,
|
105
|
+
default_type: factory.type_opt(param.default_type)
|
105
106
|
),
|
106
107
|
location: location
|
107
108
|
)
|
@@ -162,9 +163,9 @@ module Steep
|
|
162
163
|
|
163
164
|
case
|
164
165
|
when ancestor.name.interface?
|
165
|
-
AST::Types::Name::Interface.new(name: ancestor.name, args: args
|
166
|
+
AST::Types::Name::Interface.new(name: ancestor.name, args: args)
|
166
167
|
when ancestor.name.class?
|
167
|
-
AST::Types::Name::Instance.new(name: ancestor.name, args: args
|
168
|
+
AST::Types::Name::Instance.new(name: ancestor.name, args: args)
|
168
169
|
else
|
169
170
|
raise "#{ancestor.name}"
|
170
171
|
end
|
@@ -181,7 +182,7 @@ module Steep
|
|
181
182
|
if immediate_self_types && !immediate_self_types.empty?
|
182
183
|
# @type var sts: Array[AST::Types::t]
|
183
184
|
sts = immediate_self_types.map {|st| ancestor_to_type(st) }
|
184
|
-
self_type = AST::Types::Intersection.build(types: sts.push(self_type)
|
185
|
+
self_type = AST::Types::Intersection.build(types: sts.push(self_type))
|
185
186
|
end
|
186
187
|
|
187
188
|
mixin_ancestors.each do |ancestor|
|
@@ -236,7 +237,7 @@ module Steep
|
|
236
237
|
def validate_definition_type(definition)
|
237
238
|
each_method_type(definition) do |method_type|
|
238
239
|
upper_bounds = method_type.type_params.each.with_object({}) do |param, hash|
|
239
|
-
hash[param.name] = factory.type_opt(param.
|
240
|
+
hash[param.name] = factory.type_opt(param.upper_bound_type)
|
240
241
|
end
|
241
242
|
|
242
243
|
checker.push_variable_bounds(upper_bounds) do
|
@@ -255,23 +256,21 @@ module Steep
|
|
255
256
|
rescue_validation_errors(name) do
|
256
257
|
Steep.logger.debug { "Validating class definition `#{name}`..." }
|
257
258
|
|
258
|
-
class_type = AST::Types::Name::Singleton.new(name: name
|
259
|
+
class_type = AST::Types::Name::Singleton.new(name: name)
|
259
260
|
instance_type = AST::Types::Name::Instance.new(
|
260
261
|
name: name,
|
261
|
-
args: entry.type_params.map { AST::Types::Any.
|
262
|
-
location: nil
|
262
|
+
args: entry.type_params.map { AST::Types::Any.instance() }
|
263
263
|
)
|
264
264
|
|
265
265
|
Steep.logger.tagged "#{name}" do
|
266
266
|
builder.build_instance(name).tap do |definition|
|
267
267
|
upper_bounds = definition.type_params_decl.each.with_object({}) do |param, bounds|
|
268
|
-
bounds[param.name] = factory.type_opt(param.
|
268
|
+
bounds[param.name] = factory.type_opt(param.upper_bound_type)
|
269
269
|
end
|
270
270
|
|
271
271
|
self_type = AST::Types::Name::Instance.new(
|
272
272
|
name: name,
|
273
|
-
args: entry.type_params.map { AST::Types::Var.new(name: _1.name) }
|
274
|
-
location: nil
|
273
|
+
args: entry.type_params.map { AST::Types::Var.new(name: _1.name) }
|
275
274
|
)
|
276
275
|
|
277
276
|
push_context(self_type: self_type, class_type: class_type, instance_type: instance_type) do
|
@@ -482,13 +481,12 @@ module Steep
|
|
482
481
|
definition = builder.build_interface(name)
|
483
482
|
|
484
483
|
upper_bounds = definition.type_params_decl.each.with_object({}) do |param, bounds|
|
485
|
-
bounds[param.name] = factory.type_opt(param.
|
484
|
+
bounds[param.name] = factory.type_opt(param.upper_bound_type)
|
486
485
|
end
|
487
486
|
|
488
487
|
self_type = AST::Types::Name::Interface.new(
|
489
488
|
name: name,
|
490
|
-
args: definition.type_params.map { AST::Types::Var.new(name: _1) }
|
491
|
-
location: nil
|
489
|
+
args: definition.type_params.map { AST::Types::Var.new(name: _1) }
|
492
490
|
)
|
493
491
|
|
494
492
|
push_context(self_type: self_type, class_type: nil, instance_type: nil) do
|
@@ -561,11 +559,10 @@ module Steep
|
|
561
559
|
def validate_one_alias(name, entry = env.type_alias_decls[name])
|
562
560
|
*, inner_most_outer_module = entry.outer
|
563
561
|
if inner_most_outer_module
|
564
|
-
class_type = AST::Types::Name::Singleton.new(name: inner_most_outer_module.name
|
562
|
+
class_type = AST::Types::Name::Singleton.new(name: inner_most_outer_module.name)
|
565
563
|
instance_type = AST::Types::Name::Instance.new(
|
566
564
|
name: inner_most_outer_module.name,
|
567
|
-
args: inner_most_outer_module.type_params.map { AST::Types::Any.
|
568
|
-
location: nil
|
565
|
+
args: inner_most_outer_module.type_params.map { AST::Types::Any.instance() },
|
569
566
|
)
|
570
567
|
end
|
571
568
|
|
@@ -579,7 +576,7 @@ module Steep
|
|
579
576
|
end
|
580
577
|
|
581
578
|
upper_bounds = entry.decl.type_params.each.with_object({}) do |param, bounds|
|
582
|
-
bounds[param.name] = factory.type_opt(param.
|
579
|
+
bounds[param.name] = factory.type_opt(param.upper_bound_type)
|
583
580
|
end
|
584
581
|
|
585
582
|
validator.validate_type_alias(entry: entry) do |type|
|
data/lib/steep/source.rb
CHANGED
@@ -8,6 +8,7 @@ module Steep
|
|
8
8
|
attr_reader :ignores
|
9
9
|
|
10
10
|
extend NodeHelper
|
11
|
+
extend ModuleHelper
|
11
12
|
|
12
13
|
def initialize(buffer:, path:, node:, mapping:, comments:, ignores:)
|
13
14
|
@buffer = buffer
|
@@ -295,8 +296,14 @@ module Steep
|
|
295
296
|
end
|
296
297
|
|
297
298
|
def annotations(block:, factory:, context:)
|
299
|
+
annotations =
|
300
|
+
if block
|
301
|
+
mapping.fetch(block, [])
|
302
|
+
else
|
303
|
+
[]
|
304
|
+
end #: Array[AST::Annotation::t]
|
298
305
|
AST::Annotation::Collection.new(
|
299
|
-
annotations:
|
306
|
+
annotations: annotations,
|
300
307
|
factory: factory,
|
301
308
|
context: context
|
302
309
|
)
|
@@ -444,6 +451,32 @@ module Steep
|
|
444
451
|
end
|
445
452
|
end
|
446
453
|
|
454
|
+
def self.skip_arg_assertions(node)
|
455
|
+
send_node, _ = deconstruct_sendish_and_block_nodes(node)
|
456
|
+
return false unless send_node
|
457
|
+
|
458
|
+
if send_node.type == :send
|
459
|
+
receiver, method, args = deconstruct_send_node!(send_node)
|
460
|
+
|
461
|
+
return false unless receiver
|
462
|
+
|
463
|
+
if receiver.type == :const
|
464
|
+
if type_name = module_name_from_node(receiver.children[0], receiver.children[1])
|
465
|
+
if type_name.namespace.empty?
|
466
|
+
if type_name.name == :Data && method == :define
|
467
|
+
return true
|
468
|
+
end
|
469
|
+
if type_name.name == :Struct && method == :new
|
470
|
+
return true
|
471
|
+
end
|
472
|
+
end
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
false
|
478
|
+
end
|
479
|
+
|
447
480
|
def self.insert_type_node(node, comments)
|
448
481
|
if node.location.expression
|
449
482
|
first_line = node.location.expression.first_line
|
@@ -567,6 +600,19 @@ module Steep
|
|
567
600
|
body = insert_type_node(body, comments) if body
|
568
601
|
return adjust_location(node.updated(nil, [object, name, args, body]))
|
569
602
|
else
|
603
|
+
if skip_arg_assertions(node)
|
604
|
+
# Data.define, Struct.new, ...??
|
605
|
+
if node.location.expression
|
606
|
+
first_line = node.location.expression.first_line
|
607
|
+
last_line = node.location.expression.last_line
|
608
|
+
|
609
|
+
child_assertions = comments.delete_if {|line, _ | first_line < line && line < last_line }
|
610
|
+
node = map_child_node(node) {|child| insert_type_node(child, child_assertions) }
|
611
|
+
|
612
|
+
return adjust_location(node)
|
613
|
+
end
|
614
|
+
end
|
615
|
+
|
570
616
|
adjust_location(
|
571
617
|
map_child_node(node, nil) {|child| insert_type_node(child, comments) }
|
572
618
|
)
|
@@ -59,7 +59,7 @@ module Steep
|
|
59
59
|
def variable_upper_bound(name)
|
60
60
|
@bounds.reverse_each do |hash|
|
61
61
|
if hash.key?(name)
|
62
|
-
return hash
|
62
|
+
return hash.fetch(name)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -129,20 +129,17 @@ module Steep
|
|
129
129
|
if ancestor.name.class?
|
130
130
|
AST::Types::Name::Instance.new(
|
131
131
|
name: name,
|
132
|
-
args: args
|
133
|
-
location: nil
|
132
|
+
args: args
|
134
133
|
)
|
135
134
|
else
|
136
135
|
AST::Types::Name::Interface.new(
|
137
136
|
name: name,
|
138
|
-
args: args
|
139
|
-
location: nil
|
137
|
+
args: args
|
140
138
|
)
|
141
139
|
end
|
142
140
|
when RBS::Definition::Ancestor::Singleton
|
143
141
|
AST::Types::Name::Singleton.new(
|
144
|
-
name: name
|
145
|
-
location: nil
|
142
|
+
name: name
|
146
143
|
)
|
147
144
|
end
|
148
145
|
end
|
@@ -163,20 +160,17 @@ module Steep
|
|
163
160
|
if ancestor.name.class?
|
164
161
|
AST::Types::Name::Instance.new(
|
165
162
|
name: name,
|
166
|
-
args: args
|
167
|
-
location: nil
|
163
|
+
args: args
|
168
164
|
)
|
169
165
|
else
|
170
166
|
AST::Types::Name::Interface.new(
|
171
167
|
name: name,
|
172
|
-
args: args
|
173
|
-
location: nil
|
168
|
+
args: args
|
174
169
|
)
|
175
170
|
end
|
176
171
|
when RBS::Definition::Ancestor::Singleton
|
177
172
|
AST::Types::Name::Singleton.new(
|
178
|
-
name: name
|
179
|
-
location: nil
|
173
|
+
name: name
|
180
174
|
)
|
181
175
|
end
|
182
176
|
end
|
@@ -271,9 +265,6 @@ module Steep
|
|
271
265
|
when relation.sub_type.is_a?(AST::Types::Bot)
|
272
266
|
success(relation)
|
273
267
|
|
274
|
-
when relation.sub_type.is_a?(AST::Types::Logic::Base) && (true_type?(relation.super_type) || false_type?(relation.super_type))
|
275
|
-
success(relation)
|
276
|
-
|
277
268
|
when relation.super_type.is_a?(AST::Types::Boolean)
|
278
269
|
Expand(relation) do
|
279
270
|
check_type(
|
@@ -284,7 +275,7 @@ module Steep
|
|
284
275
|
)
|
285
276
|
end
|
286
277
|
|
287
|
-
when relation.sub_type.is_a?(AST::Types::Boolean)
|
278
|
+
when relation.sub_type.is_a?(AST::Types::Boolean) || relation.sub_type.is_a?(AST::Types::Logic::Base)
|
288
279
|
Expand(relation) do
|
289
280
|
check_type(
|
290
281
|
Relation.new(
|
@@ -357,20 +348,51 @@ module Steep
|
|
357
348
|
constraints.add(relation.sub_type.name, super_type: relation.super_type)
|
358
349
|
Success(relation)
|
359
350
|
|
360
|
-
when relation.sub_type.is_a?(AST::Types::
|
351
|
+
when relation.sub_type.is_a?(AST::Types::Var) && ub = variable_upper_bound(relation.sub_type.name)
|
352
|
+
Expand(relation) do
|
353
|
+
check_type(Relation.new(sub_type: ub, super_type: relation.super_type))
|
354
|
+
end
|
355
|
+
|
356
|
+
when relation.sub_type.is_a?(AST::Types::Intersection) && relation.super_type.is_a?(AST::Types::Union)
|
357
|
+
Any(relation) do |base_result|
|
358
|
+
# Expand the super_type first
|
359
|
+
base_result.add(relation) do
|
360
|
+
Any(relation) do |result|
|
361
|
+
relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type|
|
362
|
+
rel = Relation.new(sub_type: relation.sub_type, super_type: super_type)
|
363
|
+
result.add(rel) do
|
364
|
+
check_type(rel)
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# Expand the sub_type if it fails
|
371
|
+
base_result.add(relation) do
|
372
|
+
Any(relation) do |result|
|
373
|
+
relation.sub_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |sub_type|
|
374
|
+
rel = Relation.new(sub_type: sub_type, super_type: relation.super_type)
|
375
|
+
result.add(rel) do
|
376
|
+
check_type(rel)
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
when relation.super_type.is_a?(AST::Types::Intersection)
|
361
384
|
All(relation) do |result|
|
362
|
-
relation.
|
363
|
-
|
364
|
-
result.add(rel) do
|
385
|
+
relation.super_type.types.each do |super_type|
|
386
|
+
result.add(Relation.new(sub_type: relation.sub_type, super_type: super_type)) do |rel|
|
365
387
|
check_type(rel)
|
366
388
|
end
|
367
389
|
end
|
368
390
|
end
|
369
391
|
|
370
|
-
when relation.
|
371
|
-
|
372
|
-
relation.
|
373
|
-
rel = Relation.new(sub_type:
|
392
|
+
when relation.sub_type.is_a?(AST::Types::Union)
|
393
|
+
All(relation) do |result|
|
394
|
+
relation.sub_type.types.each do |sub_type|
|
395
|
+
rel = Relation.new(sub_type: sub_type, super_type: relation.super_type)
|
374
396
|
result.add(rel) do
|
375
397
|
check_type(rel)
|
376
398
|
end
|
@@ -387,23 +409,16 @@ module Steep
|
|
387
409
|
end
|
388
410
|
end
|
389
411
|
|
390
|
-
when relation.super_type.is_a?(AST::Types::
|
391
|
-
|
392
|
-
relation.super_type.types.each do |super_type|
|
393
|
-
|
412
|
+
when relation.super_type.is_a?(AST::Types::Union)
|
413
|
+
Any(relation) do |result|
|
414
|
+
relation.super_type.types.sort_by {|ty| (path = hole_path(ty)) ? -path.size : -Float::INFINITY }.each do |super_type|
|
415
|
+
rel = Relation.new(sub_type: relation.sub_type, super_type: super_type)
|
416
|
+
result.add(rel) do
|
394
417
|
check_type(rel)
|
395
418
|
end
|
396
419
|
end
|
397
420
|
end
|
398
421
|
|
399
|
-
when relation.sub_type.is_a?(AST::Types::Var) && ub = variable_upper_bound(relation.sub_type.name)
|
400
|
-
Expand(relation) do
|
401
|
-
check_type(Relation.new(sub_type: ub, super_type: relation.super_type))
|
402
|
-
end
|
403
|
-
|
404
|
-
when relation.super_type.is_a?(AST::Types::Var) || relation.sub_type.is_a?(AST::Types::Var)
|
405
|
-
Failure(relation, Result::Failure::UnknownPairError.new(relation: relation))
|
406
|
-
|
407
422
|
when relation.super_type.is_a?(AST::Types::Name::Interface)
|
408
423
|
Expand(relation) do
|
409
424
|
check_interface(
|
@@ -497,37 +512,72 @@ module Steep
|
|
497
512
|
Expand(relation) do
|
498
513
|
tuple_element_type =
|
499
514
|
AST::Types::Union.build(
|
500
|
-
types: relation.sub_type.types
|
501
|
-
location: relation.sub_type.location
|
515
|
+
types: relation.sub_type.types
|
502
516
|
)
|
503
517
|
|
504
518
|
check_type(Relation.new(sub_type: tuple_element_type, super_type: super_type.args[0]))
|
505
519
|
end
|
506
520
|
|
521
|
+
when relation.sub_type.is_a?(AST::Types::Tuple)
|
522
|
+
Any(relation) do |result|
|
523
|
+
# Check by converting the tuple to array
|
524
|
+
tuple_element_type = AST::Types::Union.build(types: relation.sub_type.types)
|
525
|
+
array_type = AST::Builtin::Array.instance_type(tuple_element_type)
|
526
|
+
result.add(Relation.new(sub_type: array_type, super_type: relation.super_type)) do
|
527
|
+
check_type(_1)
|
528
|
+
end
|
529
|
+
|
530
|
+
# Check by shapes
|
531
|
+
shape_relation = relation.map {|type|
|
532
|
+
# @type break: nil
|
533
|
+
builder.shape(
|
534
|
+
type, Interface::Builder::Config.new(self_type: type, variable_bounds: variable_upper_bounds)
|
535
|
+
)&.public_shape or break
|
536
|
+
}
|
537
|
+
if shape_relation
|
538
|
+
result.add(shape_relation) { check_interface(_1) }
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
507
542
|
when relation.sub_type.is_a?(AST::Types::Record) && relation.super_type.is_a?(AST::Types::Record)
|
508
543
|
All(relation) do |result|
|
509
544
|
relation.super_type.elements.each_key do |key|
|
510
|
-
|
511
|
-
sub_type: relation.sub_type.elements[key] || AST::Builtin.nil_type,
|
512
|
-
super_type: relation.super_type.elements[key]
|
513
|
-
)
|
545
|
+
super_element_type = relation.super_type.elements[key]
|
514
546
|
|
515
|
-
|
516
|
-
|
547
|
+
if relation.sub_type.elements.key?(key)
|
548
|
+
sub_element_type = relation.sub_type.elements[key]
|
549
|
+
else
|
550
|
+
if relation.super_type.required?(key)
|
551
|
+
sub_element_type = AST::Builtin.nil_type
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
if sub_element_type
|
556
|
+
rel = Relation.new(sub_type: sub_element_type, super_type: super_element_type)
|
557
|
+
result.add(rel) { check_type(rel) }
|
517
558
|
end
|
518
559
|
end
|
519
560
|
end
|
520
561
|
|
521
|
-
when relation.sub_type.is_a?(AST::Types::Record)
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
562
|
+
when relation.sub_type.is_a?(AST::Types::Record)
|
563
|
+
Any(relation) do |result|
|
564
|
+
# Check by converting the record to hash
|
565
|
+
key_type = AST::Types::Union.build(types: relation.sub_type.elements.each_key.map {|key| AST::Types::Literal.new(value: key) })
|
566
|
+
value_type = AST::Types::Union.build(types: relation.sub_type.elements.each_value.map {|key| key })
|
567
|
+
hash_type = AST::Builtin::Hash.instance_type(key_type, value_type)
|
568
|
+
result.add(Relation.new(sub_type: hash_type, super_type: relation.super_type)) { check_type(_1) }
|
569
|
+
|
570
|
+
# Check by the shapes
|
571
|
+
shape_relation = relation.map do |type|
|
572
|
+
# @type break: nil
|
573
|
+
builder.shape(
|
574
|
+
type,
|
575
|
+
Interface::Builder::Config.new(self_type: type, variable_bounds: variable_upper_bounds)
|
576
|
+
)&.public_shape or break
|
577
|
+
end
|
578
|
+
if shape_relation
|
579
|
+
result.add(shape_relation) { check_interface(_1) }
|
580
|
+
end
|
531
581
|
end
|
532
582
|
|
533
583
|
when relation.sub_type.is_a?(AST::Types::Proc) && AST::Builtin::Proc.instance_type?(relation.super_type)
|
@@ -28,7 +28,7 @@ module Steep
|
|
28
28
|
attr_reader :lower_bound
|
29
29
|
attr_reader :upper_bound
|
30
30
|
|
31
|
-
def initialize(var
|
31
|
+
def initialize(var:, lower_bound:, upper_bound:)
|
32
32
|
@var = var
|
33
33
|
@lower_bound = lower_bound
|
34
34
|
@upper_bound = upper_bound
|
@@ -96,7 +96,7 @@ module Steep
|
|
96
96
|
unless Set.new(vars).disjoint?(unknowns)
|
97
97
|
raise UnsatisfiedInvariantError.new(
|
98
98
|
reason: UnsatisfiedInvariantError::VariablesUnknownsNotDisjoint.new(vars: vars),
|
99
|
-
constraints:
|
99
|
+
constraints: self
|
100
100
|
)
|
101
101
|
end
|
102
102
|
end
|
@@ -113,13 +113,13 @@ module Steep
|
|
113
113
|
end
|
114
114
|
|
115
115
|
if super_type && !super_type.is_a?(AST::Types::Top)
|
116
|
-
type = eliminate_variable(super_type, to: AST::Types::Top.
|
116
|
+
type = eliminate_variable(super_type, to: AST::Types::Top.instance)
|
117
117
|
supers << type
|
118
118
|
skips << type if skip
|
119
119
|
end
|
120
120
|
|
121
121
|
if sub_type && !sub_type.is_a?(AST::Types::Bot)
|
122
|
-
type = eliminate_variable(sub_type, to: AST::Types::Bot.
|
122
|
+
type = eliminate_variable(sub_type, to: AST::Types::Bot.instance)
|
123
123
|
subs << type
|
124
124
|
skips << type if skip
|
125
125
|
end
|
@@ -147,19 +147,19 @@ module Steep
|
|
147
147
|
case type
|
148
148
|
when AST::Types::Name::Instance, AST::Types::Name::Alias, AST::Types::Name::Interface
|
149
149
|
type.args.map do |ty|
|
150
|
-
eliminate_variable(ty, to: AST::Types::Any.
|
150
|
+
eliminate_variable(ty, to: AST::Types::Any.instance)
|
151
151
|
end.yield_self do |args|
|
152
|
-
type.class.new(name: type.name, args: args
|
152
|
+
type.class.new(name: type.name, args: args)
|
153
153
|
end
|
154
154
|
when AST::Types::Union
|
155
155
|
type.types.map do |ty|
|
156
|
-
eliminate_variable(ty, to: AST::Types::Any.
|
156
|
+
eliminate_variable(ty, to: AST::Types::Any.instance)
|
157
157
|
end.yield_self do |types|
|
158
158
|
AST::Types::Union.build(types: types)
|
159
159
|
end
|
160
160
|
when AST::Types::Intersection
|
161
161
|
type.types.map do |ty|
|
162
|
-
eliminate_variable(ty, to: AST::Types::Any.
|
162
|
+
eliminate_variable(ty, to: AST::Types::Any.instance)
|
163
163
|
end.yield_self do |types|
|
164
164
|
AST::Types::Intersection.build(types: types)
|
165
165
|
end
|
@@ -171,14 +171,10 @@ module Steep
|
|
171
171
|
end
|
172
172
|
when AST::Types::Tuple
|
173
173
|
AST::Types::Tuple.new(
|
174
|
-
types: type.types.map {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) }
|
175
|
-
location: type.location
|
174
|
+
types: type.types.map {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) }
|
176
175
|
)
|
177
176
|
when AST::Types::Record
|
178
|
-
AST::
|
179
|
-
elements: type.elements.transform_values {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) },
|
180
|
-
location: type.location
|
181
|
-
)
|
177
|
+
type.map_type { eliminate_variable(_1, to: AST::Builtin.any_type) }
|
182
178
|
when AST::Types::Proc
|
183
179
|
type.map_type {|ty| eliminate_variable(ty, to: AST::Builtin.any_type) }
|
184
180
|
else
|
@@ -213,7 +209,7 @@ module Steep
|
|
213
209
|
|
214
210
|
case upper_bound.size
|
215
211
|
when 0
|
216
|
-
AST::Types::Top.
|
212
|
+
AST::Types::Top.instance
|
217
213
|
when 1
|
218
214
|
upper_bound.first || raise
|
219
215
|
else
|
@@ -226,7 +222,7 @@ module Steep
|
|
226
222
|
|
227
223
|
case lower_bound.size
|
228
224
|
when 0
|
229
|
-
AST::Types::Bot.
|
225
|
+
AST::Types::Bot.instance
|
230
226
|
when 1
|
231
227
|
lower_bound.first || raise
|
232
228
|
else
|
@@ -293,7 +289,7 @@ module Steep
|
|
293
289
|
end
|
294
290
|
else
|
295
291
|
vars << var
|
296
|
-
types << AST::Types::Any.
|
292
|
+
types << AST::Types::Any.instance
|
297
293
|
end
|
298
294
|
end
|
299
295
|
end
|