steep 0.40.0 → 0.44.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +38 -0
- data/Gemfile +1 -0
- data/bin/output_rebaseline.rb +15 -30
- data/bin/output_test.rb +23 -57
- data/lib/steep.rb +89 -15
- data/lib/steep/annotation_parser.rb +10 -2
- data/lib/steep/ast/types/class.rb +4 -0
- data/lib/steep/cli.rb +31 -6
- data/lib/steep/diagnostic/ruby.rb +13 -8
- data/lib/steep/diagnostic/signature.rb +152 -2
- data/lib/steep/drivers/annotations.rb +18 -36
- data/lib/steep/drivers/check.rb +140 -31
- data/lib/steep/drivers/diagnostic_printer.rb +20 -11
- data/lib/steep/drivers/langserver.rb +4 -8
- data/lib/steep/drivers/print_project.rb +10 -9
- data/lib/steep/drivers/stats.rb +135 -119
- data/lib/steep/drivers/utils/driver_helper.rb +35 -0
- data/lib/steep/drivers/utils/jobs_count.rb +9 -0
- data/lib/steep/drivers/validate.rb +29 -18
- data/lib/steep/drivers/watch.rb +55 -49
- data/lib/steep/drivers/worker.rb +11 -8
- data/lib/steep/expectations.rb +159 -0
- data/lib/steep/index/signature_symbol_provider.rb +23 -1
- data/lib/steep/index/source_index.rb +55 -5
- data/lib/steep/interface/block.rb +4 -0
- data/lib/steep/project.rb +0 -30
- data/lib/steep/project/dsl.rb +5 -3
- data/lib/steep/project/pattern.rb +56 -0
- data/lib/steep/project/target.rb +11 -227
- data/lib/steep/server/base_worker.rb +1 -3
- data/lib/steep/server/change_buffer.rb +63 -0
- data/lib/steep/server/interaction_worker.rb +72 -57
- data/lib/steep/server/master.rb +652 -234
- data/lib/steep/server/type_check_worker.rb +304 -0
- data/lib/steep/server/worker_process.rb +16 -11
- data/lib/steep/{project → services}/completion_provider.rb +5 -5
- data/lib/steep/services/content_change.rb +61 -0
- data/lib/steep/services/file_loader.rb +48 -0
- data/lib/steep/services/goto_service.rb +321 -0
- data/lib/steep/{project → services}/hover_content.rb +19 -20
- data/lib/steep/services/path_assignment.rb +27 -0
- data/lib/steep/services/signature_service.rb +403 -0
- data/lib/steep/services/stats_calculator.rb +69 -0
- data/lib/steep/services/type_check_service.rb +413 -0
- data/lib/steep/signature/validator.rb +187 -85
- data/lib/steep/source.rb +21 -18
- data/lib/steep/subtyping/check.rb +246 -45
- data/lib/steep/subtyping/constraints.rb +4 -4
- data/lib/steep/type_construction.rb +428 -193
- data/lib/steep/type_inference/block_params.rb +1 -1
- data/lib/steep/type_inference/context.rb +22 -0
- data/lib/steep/type_inference/local_variable_type_env.rb +26 -12
- data/lib/steep/type_inference/logic.rb +1 -1
- data/lib/steep/type_inference/logic_type_interpreter.rb +4 -4
- data/lib/steep/type_inference/type_env.rb +43 -17
- data/lib/steep/version.rb +1 -1
- data/smoke/alias/test_expectations.yml +96 -0
- data/smoke/and/test_expectations.yml +31 -0
- data/smoke/array/test_expectations.yml +103 -0
- data/smoke/block/test_expectations.yml +125 -0
- data/smoke/case/test_expectations.yml +47 -0
- data/smoke/class/test_expectations.yml +120 -0
- data/smoke/const/test_expectations.yml +129 -0
- data/smoke/diagnostics-rbs-duplicated/test_expectations.yml +13 -0
- data/smoke/diagnostics-rbs/Steepfile +7 -4
- data/smoke/diagnostics-rbs/test_expectations.yml +231 -0
- data/smoke/diagnostics-rbs/unknown-type-name-2.rbs +5 -0
- data/smoke/{broken → diagnostics-ruby-unsat}/Steepfile +0 -0
- data/smoke/diagnostics-ruby-unsat/a.rbs +3 -0
- data/smoke/diagnostics-ruby-unsat/test_expectations.yml +27 -0
- data/smoke/{diagnostics → diagnostics-ruby-unsat}/unsatisfiable_constraint.rb +0 -1
- data/smoke/diagnostics/a.rbs +0 -4
- data/smoke/diagnostics/test_expectations.yml +451 -0
- data/smoke/dstr/test_expectations.yml +13 -0
- data/smoke/ensure/test_expectations.yml +62 -0
- data/smoke/enumerator/test_expectations.yml +135 -0
- data/smoke/extension/f.rb +2 -0
- data/smoke/extension/f.rbs +3 -0
- data/smoke/extension/test_expectations.yml +73 -0
- data/smoke/hash/test_expectations.yml +81 -0
- data/smoke/hello/test_expectations.yml +25 -0
- data/smoke/if/test_expectations.yml +34 -0
- data/smoke/implements/b.rb +13 -0
- data/smoke/implements/b.rbs +12 -0
- data/smoke/implements/test_expectations.yml +23 -0
- data/smoke/initialize/test_expectations.yml +1 -0
- data/smoke/integer/test_expectations.yml +101 -0
- data/smoke/interface/test_expectations.yml +23 -0
- data/smoke/kwbegin/test_expectations.yml +17 -0
- data/smoke/lambda/test_expectations.yml +39 -0
- data/smoke/literal/test_expectations.yml +106 -0
- data/smoke/map/test_expectations.yml +1 -0
- data/smoke/method/test_expectations.yml +90 -0
- data/smoke/module/test_expectations.yml +75 -0
- data/smoke/regexp/test_expectations.yml +615 -0
- data/smoke/regression/issue_328.rb +1 -0
- data/smoke/regression/issue_328.rbs +0 -0
- data/smoke/regression/issue_332.rb +11 -0
- data/smoke/regression/issue_332.rbs +19 -0
- data/smoke/regression/issue_372.rb +8 -0
- data/smoke/regression/issue_372.rbs +4 -0
- data/smoke/regression/masgn.rb +4 -0
- data/smoke/regression/test_expectations.yml +60 -0
- data/smoke/regression/thread.rb +7 -0
- data/smoke/rescue/test_expectations.yml +79 -0
- data/smoke/self/test_expectations.yml +23 -0
- data/smoke/skip/test_expectations.yml +23 -0
- data/smoke/stdout/test_expectations.yml +1 -0
- data/smoke/super/test_expectations.yml +69 -0
- data/smoke/toplevel/test_expectations.yml +15 -0
- data/smoke/tsort/Steepfile +2 -0
- data/smoke/tsort/test_expectations.yml +63 -0
- data/smoke/type_case/test_expectations.yml +48 -0
- data/smoke/unexpected/Steepfile +5 -0
- data/smoke/unexpected/test_expectations.yml +25 -0
- data/smoke/unexpected/unexpected.rb +1 -0
- data/smoke/unexpected/unexpected.rbs +3 -0
- data/smoke/yield/test_expectations.yml +68 -0
- data/steep.gemspec +4 -3
- metadata +127 -80
- data/lib/steep/project/file_loader.rb +0 -68
- data/lib/steep/project/signature_file.rb +0 -39
- data/lib/steep/project/source_file.rb +0 -129
- data/lib/steep/project/stats_calculator.rb +0 -80
- data/lib/steep/server/code_worker.rb +0 -150
- data/lib/steep/server/signature_worker.rb +0 -157
- data/lib/steep/server/utils.rb +0 -69
- data/smoke/alias/test.yaml +0 -73
- data/smoke/and/test.yaml +0 -24
- data/smoke/array/test.yaml +0 -80
- data/smoke/block/test.yaml +0 -96
- data/smoke/broken/broken.rb +0 -0
- data/smoke/broken/broken.rbs +0 -0
- data/smoke/broken/test.yaml +0 -6
- data/smoke/case/test.yaml +0 -36
- data/smoke/class/test.yaml +0 -89
- data/smoke/const/test.yaml +0 -96
- data/smoke/diagnostics-rbs-duplicated/test.yaml +0 -10
- data/smoke/diagnostics-rbs/test.yaml +0 -142
- data/smoke/diagnostics/test.yaml +0 -333
- data/smoke/dstr/test.yaml +0 -10
- data/smoke/ensure/test.yaml +0 -47
- data/smoke/enumerator/test.yaml +0 -100
- data/smoke/extension/test.yaml +0 -50
- data/smoke/hash/test.yaml +0 -62
- data/smoke/hello/test.yaml +0 -18
- data/smoke/if/test.yaml +0 -27
- data/smoke/implements/test.yaml +0 -16
- data/smoke/initialize/test.yaml +0 -4
- data/smoke/integer/test.yaml +0 -66
- data/smoke/interface/test.yaml +0 -16
- data/smoke/kwbegin/test.yaml +0 -14
- data/smoke/lambda/test.yaml +0 -28
- data/smoke/literal/test.yaml +0 -79
- data/smoke/map/test.yaml +0 -4
- data/smoke/method/test.yaml +0 -71
- data/smoke/module/test.yaml +0 -51
- data/smoke/regexp/test.yaml +0 -372
- data/smoke/regression/test.yaml +0 -38
- data/smoke/rescue/test.yaml +0 -60
- data/smoke/self/test.yaml +0 -16
- data/smoke/skip/test.yaml +0 -16
- data/smoke/stdout/test.yaml +0 -4
- data/smoke/super/test.yaml +0 -52
- data/smoke/toplevel/test.yaml +0 -12
- data/smoke/tsort/test.yaml +0 -32
- data/smoke/type_case/test.yaml +0 -33
- data/smoke/yield/test.yaml +0 -49
data/lib/steep/source.rb
CHANGED
|
@@ -44,16 +44,10 @@ module Steep
|
|
|
44
44
|
end
|
|
45
45
|
end
|
|
46
46
|
|
|
47
|
-
def self.parse(source_code, path:, factory
|
|
47
|
+
def self.parse(source_code, path:, factory:)
|
|
48
48
|
buffer = ::Parser::Source::Buffer.new(path.to_s, 1)
|
|
49
49
|
buffer.source = source_code
|
|
50
|
-
node = parser.parse(buffer)
|
|
51
|
-
if n
|
|
52
|
-
labeling.translate(n, {})
|
|
53
|
-
else
|
|
54
|
-
return new(path: path, node: nil, mapping: {})
|
|
55
|
-
end
|
|
56
|
-
end
|
|
50
|
+
node = parser.parse(buffer)
|
|
57
51
|
|
|
58
52
|
annotations = []
|
|
59
53
|
|
|
@@ -78,13 +72,13 @@ module Steep
|
|
|
78
72
|
end
|
|
79
73
|
end
|
|
80
74
|
|
|
81
|
-
mapping = {}
|
|
75
|
+
mapping = {}.compare_by_identity
|
|
82
76
|
|
|
83
77
|
construct_mapping(node: node, annotations: annotations, mapping: mapping)
|
|
84
78
|
|
|
85
79
|
annotations.each do |annot|
|
|
86
|
-
mapping[node
|
|
87
|
-
mapping[node
|
|
80
|
+
mapping[node] ||= []
|
|
81
|
+
mapping[node] << annot
|
|
88
82
|
end
|
|
89
83
|
|
|
90
84
|
new(path: path, node: node, mapping: mapping)
|
|
@@ -262,8 +256,8 @@ module Steep
|
|
|
262
256
|
end
|
|
263
257
|
|
|
264
258
|
associated_annotations.each do |annot|
|
|
265
|
-
mapping[node
|
|
266
|
-
mapping[node
|
|
259
|
+
mapping[node] ||= []
|
|
260
|
+
mapping[node] << annot
|
|
267
261
|
annotations.delete annot
|
|
268
262
|
end
|
|
269
263
|
end
|
|
@@ -290,17 +284,16 @@ module Steep
|
|
|
290
284
|
|
|
291
285
|
def annotations(block:, factory:, current_module:)
|
|
292
286
|
AST::Annotation::Collection.new(
|
|
293
|
-
annotations: mapping[block
|
|
287
|
+
annotations: (mapping[block] || []).map(&:annotation),
|
|
294
288
|
factory: factory,
|
|
295
289
|
current_module: current_module
|
|
296
290
|
)
|
|
297
291
|
end
|
|
298
292
|
|
|
299
|
-
def each_annotation
|
|
293
|
+
def each_annotation(&block)
|
|
300
294
|
if block_given?
|
|
301
|
-
mapping.
|
|
302
|
-
node
|
|
303
|
-
yield node, mapping[id]
|
|
295
|
+
mapping.each do |node, annots|
|
|
296
|
+
yield node, annots.map(&:annotation)
|
|
304
297
|
end
|
|
305
298
|
else
|
|
306
299
|
enum_for :each_annotation
|
|
@@ -356,6 +349,16 @@ module Steep
|
|
|
356
349
|
|
|
357
350
|
node_ = Source.delete_defs(node, defs)
|
|
358
351
|
|
|
352
|
+
mapping = {}.compare_by_identity
|
|
353
|
+
|
|
354
|
+
annotations = self.mapping.values.flatten
|
|
355
|
+
Source.construct_mapping(node: node_, annotations: annotations, mapping: mapping)
|
|
356
|
+
|
|
357
|
+
annotations.each do |annot|
|
|
358
|
+
mapping[node] ||= []
|
|
359
|
+
mapping[node] << annot
|
|
360
|
+
end
|
|
361
|
+
|
|
359
362
|
Source.new(path: path, node: node_, mapping: mapping)
|
|
360
363
|
end
|
|
361
364
|
|
|
@@ -9,6 +9,21 @@ module Steep
|
|
|
9
9
|
@cache = {}
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
def each_ancestor(ancestors, &block)
|
|
13
|
+
if block_given?
|
|
14
|
+
if ancestors.super_class
|
|
15
|
+
yield ancestors.super_class
|
|
16
|
+
end
|
|
17
|
+
ancestors.each_included_module(&block)
|
|
18
|
+
ancestors.each_included_interface(&block)
|
|
19
|
+
ancestors.each_prepended_module(&block)
|
|
20
|
+
ancestors.each_extended_module(&block)
|
|
21
|
+
ancestors.each_extended_interface(&block)
|
|
22
|
+
else
|
|
23
|
+
enum_for :each_ancestor, ancestors
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
12
27
|
def instance_super_types(type_name, args:)
|
|
13
28
|
ancestors = factory.definition_builder.ancestor_builder.one_instance_ancestors(type_name)
|
|
14
29
|
|
|
@@ -17,7 +32,7 @@ module Steep
|
|
|
17
32
|
RBS::Substitution.build(ancestors.params, args_)
|
|
18
33
|
end
|
|
19
34
|
|
|
20
|
-
ancestors.
|
|
35
|
+
each_ancestor(ancestors).map do |ancestor|
|
|
21
36
|
name = ancestor.name
|
|
22
37
|
|
|
23
38
|
case ancestor
|
|
@@ -83,10 +98,10 @@ module Steep
|
|
|
83
98
|
end
|
|
84
99
|
end
|
|
85
100
|
|
|
86
|
-
def check(relation, constraints:, self_type:, assumption: Set.new, trace: Trace.new)
|
|
101
|
+
def check(relation, constraints:, self_type:, instance_type:, class_type:, assumption: Set.new, trace: Trace.new)
|
|
87
102
|
Steep.logger.tagged "#{relation.sub_type} <: #{relation.super_type}" do
|
|
88
103
|
prefix = trace.size
|
|
89
|
-
cached = cache[[relation, self_type]]
|
|
104
|
+
cached = cache[[relation, self_type, instance_type, class_type]]
|
|
90
105
|
if cached && constraints.empty?
|
|
91
106
|
if cached.success?
|
|
92
107
|
cached
|
|
@@ -98,7 +113,15 @@ module Steep
|
|
|
98
113
|
success(constraints: constraints)
|
|
99
114
|
else
|
|
100
115
|
assumption = assumption + Set[relation]
|
|
101
|
-
check0(
|
|
116
|
+
check0(
|
|
117
|
+
relation,
|
|
118
|
+
self_type: self_type,
|
|
119
|
+
instance_type: instance_type,
|
|
120
|
+
class_type: class_type,
|
|
121
|
+
assumption: assumption,
|
|
122
|
+
trace: trace,
|
|
123
|
+
constraints: constraints
|
|
124
|
+
).tap do |result|
|
|
102
125
|
result = result.else do |failure|
|
|
103
126
|
failure.drop(prefix)
|
|
104
127
|
end
|
|
@@ -145,7 +168,7 @@ module Steep
|
|
|
145
168
|
end
|
|
146
169
|
end
|
|
147
170
|
|
|
148
|
-
def check0(relation, self_type:, assumption:, trace:, constraints:)
|
|
171
|
+
def check0(relation, self_type:, class_type:, instance_type:, assumption:, trace:, constraints:)
|
|
149
172
|
# puts relation
|
|
150
173
|
trace.type(relation.sub_type, relation.super_type) do
|
|
151
174
|
case
|
|
@@ -171,6 +194,8 @@ module Steep
|
|
|
171
194
|
check(
|
|
172
195
|
Relation.new(sub_type: relation.sub_type, super_type: AST::Types::Union.build(types: [AST::Builtin.true_type, AST::Builtin.false_type])),
|
|
173
196
|
self_type: self_type,
|
|
197
|
+
instance_type: instance_type,
|
|
198
|
+
class_type: class_type,
|
|
174
199
|
assumption: assumption,
|
|
175
200
|
trace: trace,
|
|
176
201
|
constraints: constraints
|
|
@@ -181,6 +206,8 @@ module Steep
|
|
|
181
206
|
Relation.new(sub_type: AST::Types::Union.build(types: [AST::Builtin.true_type, AST::Builtin.false_type]),
|
|
182
207
|
super_type: relation.super_type),
|
|
183
208
|
self_type: self_type,
|
|
209
|
+
instance_type: instance_type,
|
|
210
|
+
class_type: class_type,
|
|
184
211
|
assumption: assumption,
|
|
185
212
|
trace: trace,
|
|
186
213
|
constraints: constraints
|
|
@@ -190,15 +217,77 @@ module Steep
|
|
|
190
217
|
check(
|
|
191
218
|
Relation.new(sub_type: self_type, super_type: relation.super_type),
|
|
192
219
|
self_type: self_type,
|
|
220
|
+
instance_type: instance_type,
|
|
221
|
+
class_type: class_type,
|
|
222
|
+
assumption: assumption,
|
|
223
|
+
trace: trace,
|
|
224
|
+
constraints: constraints
|
|
225
|
+
)
|
|
226
|
+
|
|
227
|
+
when relation.sub_type.is_a?(AST::Types::Instance) && !instance_type.is_a?(AST::Types::Instance)
|
|
228
|
+
check(
|
|
229
|
+
Relation.new(sub_type: instance_type, super_type: relation.super_type),
|
|
230
|
+
self_type: self_type,
|
|
231
|
+
instance_type: instance_type,
|
|
232
|
+
class_type: class_type,
|
|
193
233
|
assumption: assumption,
|
|
194
234
|
trace: trace,
|
|
195
235
|
constraints: constraints
|
|
196
236
|
)
|
|
197
237
|
|
|
238
|
+
when relation.super_type.is_a?(AST::Types::Instance) && !instance_type.is_a?(AST::Types::Instance)
|
|
239
|
+
rel = Relation.new(sub_type: relation.sub_type, super_type: instance_type)
|
|
240
|
+
|
|
241
|
+
success_all?([rel, rel.flip]) do |r|
|
|
242
|
+
check(
|
|
243
|
+
r,
|
|
244
|
+
self_type: self_type,
|
|
245
|
+
instance_type: instance_type,
|
|
246
|
+
class_type: class_type,
|
|
247
|
+
assumption: assumption,
|
|
248
|
+
trace: trace,
|
|
249
|
+
constraints: constraints
|
|
250
|
+
)
|
|
251
|
+
end.then do |result|
|
|
252
|
+
Steep.logger.error { "`T <: instance` doesn't hold generally, but testing it with `#{relation} && #{relation.flip}` for compatibility"}
|
|
253
|
+
result
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
when relation.sub_type.is_a?(AST::Types::Class) && !instance_type.is_a?(AST::Types::Class)
|
|
257
|
+
check(
|
|
258
|
+
Relation.new(sub_type: class_type, super_type: relation.super_type),
|
|
259
|
+
self_type: self_type,
|
|
260
|
+
instance_type: instance_type,
|
|
261
|
+
class_type: class_type,
|
|
262
|
+
assumption: assumption,
|
|
263
|
+
trace: trace,
|
|
264
|
+
constraints: constraints
|
|
265
|
+
)
|
|
266
|
+
|
|
267
|
+
when relation.super_type.is_a?(AST::Types::Class) && !instance_type.is_a?(AST::Types::Class)
|
|
268
|
+
rel = Relation.new(sub_type: relation.sub_type, super_type: class_type)
|
|
269
|
+
|
|
270
|
+
success_all?([rel, rel.flip]) do |r|
|
|
271
|
+
check(
|
|
272
|
+
r,
|
|
273
|
+
self_type: self_type,
|
|
274
|
+
instance_type: instance_type,
|
|
275
|
+
class_type: class_type,
|
|
276
|
+
assumption: assumption,
|
|
277
|
+
trace: trace,
|
|
278
|
+
constraints: constraints
|
|
279
|
+
)
|
|
280
|
+
end.then do |result|
|
|
281
|
+
Steep.logger.error { "`T <: class` doesn't hold generally, but testing with `#{relation} && |- #{relation.flip}` for compatibility"}
|
|
282
|
+
result
|
|
283
|
+
end
|
|
284
|
+
|
|
198
285
|
when alias?(relation.sub_type)
|
|
199
286
|
check(
|
|
200
287
|
Relation.new(sub_type: expand_alias(relation.sub_type), super_type: relation.super_type),
|
|
201
288
|
self_type: self_type,
|
|
289
|
+
instance_type: instance_type,
|
|
290
|
+
class_type: class_type,
|
|
202
291
|
assumption: assumption,
|
|
203
292
|
trace: trace,
|
|
204
293
|
constraints: constraints
|
|
@@ -208,6 +297,8 @@ module Steep
|
|
|
208
297
|
check(
|
|
209
298
|
Relation.new(super_type: expand_alias(relation.super_type), sub_type: relation.sub_type),
|
|
210
299
|
self_type: self_type,
|
|
300
|
+
instance_type: instance_type,
|
|
301
|
+
class_type: class_type,
|
|
211
302
|
assumption: assumption,
|
|
212
303
|
trace: trace,
|
|
213
304
|
constraints: constraints
|
|
@@ -224,10 +315,12 @@ module Steep
|
|
|
224
315
|
when relation.sub_type.is_a?(AST::Types::Union)
|
|
225
316
|
results = relation.sub_type.types.map do |sub_type|
|
|
226
317
|
check(Relation.new(sub_type: sub_type, super_type: relation.super_type),
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
318
|
+
self_type: self_type,
|
|
319
|
+
instance_type: instance_type,
|
|
320
|
+
class_type: class_type,
|
|
321
|
+
assumption: assumption,
|
|
322
|
+
trace: trace,
|
|
323
|
+
constraints: constraints)
|
|
231
324
|
end
|
|
232
325
|
|
|
233
326
|
if results.all?(&:success?)
|
|
@@ -239,10 +332,12 @@ module Steep
|
|
|
239
332
|
when relation.super_type.is_a?(AST::Types::Union)
|
|
240
333
|
results = relation.super_type.types.map do |super_type|
|
|
241
334
|
check(Relation.new(sub_type: relation.sub_type, super_type: super_type),
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
335
|
+
self_type: self_type,
|
|
336
|
+
instance_type: instance_type,
|
|
337
|
+
class_type: class_type,
|
|
338
|
+
assumption: assumption,
|
|
339
|
+
trace: trace,
|
|
340
|
+
constraints: constraints)
|
|
246
341
|
end
|
|
247
342
|
|
|
248
343
|
results.find(&:success?) || results.first
|
|
@@ -250,10 +345,12 @@ module Steep
|
|
|
250
345
|
when relation.sub_type.is_a?(AST::Types::Intersection)
|
|
251
346
|
results = relation.sub_type.types.map do |sub_type|
|
|
252
347
|
check(Relation.new(sub_type: sub_type, super_type: relation.super_type),
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
348
|
+
self_type: self_type,
|
|
349
|
+
instance_type: instance_type,
|
|
350
|
+
class_type: class_type,
|
|
351
|
+
assumption: assumption,
|
|
352
|
+
trace: trace,
|
|
353
|
+
constraints: constraints)
|
|
257
354
|
end
|
|
258
355
|
|
|
259
356
|
results.find(&:success?) || results.first
|
|
@@ -261,10 +358,12 @@ module Steep
|
|
|
261
358
|
when relation.super_type.is_a?(AST::Types::Intersection)
|
|
262
359
|
results = relation.super_type.types.map do |super_type|
|
|
263
360
|
check(Relation.new(sub_type: relation.sub_type, super_type: super_type),
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
361
|
+
self_type: self_type,
|
|
362
|
+
instance_type: instance_type,
|
|
363
|
+
class_type: class_type,
|
|
364
|
+
assumption: assumption,
|
|
365
|
+
trace: trace,
|
|
366
|
+
constraints: constraints)
|
|
268
367
|
end
|
|
269
368
|
|
|
270
369
|
if results.all?(&:success?)
|
|
@@ -284,6 +383,8 @@ module Steep
|
|
|
284
383
|
check_interface(sub_interface,
|
|
285
384
|
super_interface,
|
|
286
385
|
self_type: self_type,
|
|
386
|
+
instance_type: instance_type,
|
|
387
|
+
class_type: class_type,
|
|
287
388
|
assumption: assumption,
|
|
288
389
|
trace: trace,
|
|
289
390
|
constraints: constraints)
|
|
@@ -291,7 +392,15 @@ module Steep
|
|
|
291
392
|
when relation.sub_type.is_a?(AST::Types::Name::Base) && relation.super_type.is_a?(AST::Types::Name::Base)
|
|
292
393
|
if relation.sub_type.name == relation.super_type.name && relation.sub_type.class == relation.super_type.class
|
|
293
394
|
if arg_type?(relation.sub_type) && arg_type?(relation.super_type)
|
|
294
|
-
check_type_arg(
|
|
395
|
+
check_type_arg(
|
|
396
|
+
relation,
|
|
397
|
+
self_type: self_type,
|
|
398
|
+
instance_type: instance_type,
|
|
399
|
+
class_type: class_type,
|
|
400
|
+
assumption: assumption,
|
|
401
|
+
trace: trace,
|
|
402
|
+
constraints: constraints
|
|
403
|
+
)
|
|
295
404
|
else
|
|
296
405
|
success(constraints: constraints)
|
|
297
406
|
end
|
|
@@ -309,6 +418,8 @@ module Steep
|
|
|
309
418
|
success_any?(possible_sub_types) do |sub_type|
|
|
310
419
|
check(Relation.new(sub_type: sub_type, super_type: relation.super_type),
|
|
311
420
|
self_type: self_type,
|
|
421
|
+
instance_type: instance_type,
|
|
422
|
+
class_type: class_type,
|
|
312
423
|
assumption: assumption,
|
|
313
424
|
trace: trace,
|
|
314
425
|
constraints: constraints)
|
|
@@ -324,12 +435,20 @@ module Steep
|
|
|
324
435
|
sub_type = relation.sub_type
|
|
325
436
|
super_type = relation.super_type
|
|
326
437
|
|
|
327
|
-
check_method_params(name, sub_type.type.params, super_type.type.params, self_type: self_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
438
|
+
check_method_params(name, sub_type.type.params, super_type.type.params, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
328
439
|
check_block_given(name, sub_type.block, super_type.block, trace: trace, constraints: constraints).then do
|
|
329
|
-
check_block_params(name, sub_type.block, super_type.block, self_type: self_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
330
|
-
check_block_return(sub_type.block, super_type.block, self_type: self_type, assumption: assumption, trace: trace, constraints:constraints).then do
|
|
440
|
+
check_block_params(name, sub_type.block, super_type.block, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
441
|
+
check_block_return(sub_type.block, super_type.block, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints:constraints).then do
|
|
331
442
|
relation = Relation.new(super_type: super_type.type.return_type, sub_type: sub_type.type.return_type)
|
|
332
|
-
check(
|
|
443
|
+
check(
|
|
444
|
+
relation,
|
|
445
|
+
self_type: self_type,
|
|
446
|
+
instance_type: instance_type,
|
|
447
|
+
class_type: class_type,
|
|
448
|
+
assumption: assumption,
|
|
449
|
+
trace: trace,
|
|
450
|
+
constraints: constraints
|
|
451
|
+
)
|
|
333
452
|
end
|
|
334
453
|
end
|
|
335
454
|
end
|
|
@@ -340,7 +459,15 @@ module Steep
|
|
|
340
459
|
pairs = relation.sub_type.types.take(relation.super_type.types.size).zip(relation.super_type.types)
|
|
341
460
|
results = pairs.map do |t1, t2|
|
|
342
461
|
relation = Relation.new(sub_type: t1, super_type: t2)
|
|
343
|
-
check(
|
|
462
|
+
check(
|
|
463
|
+
relation,
|
|
464
|
+
self_type: self_type,
|
|
465
|
+
instance_type: instance_type,
|
|
466
|
+
class_type: class_type,
|
|
467
|
+
assumption: assumption,
|
|
468
|
+
trace: trace,
|
|
469
|
+
constraints: constraints
|
|
470
|
+
)
|
|
344
471
|
end
|
|
345
472
|
|
|
346
473
|
if results.all?(&:success?)
|
|
@@ -361,6 +488,8 @@ module Steep
|
|
|
361
488
|
|
|
362
489
|
check(Relation.new(sub_type: tuple_element_type, super_type: relation.super_type.args[0]),
|
|
363
490
|
self_type: self_type,
|
|
491
|
+
instance_type: instance_type,
|
|
492
|
+
class_type: class_type,
|
|
364
493
|
assumption: assumption,
|
|
365
494
|
trace: trace,
|
|
366
495
|
constraints: constraints)
|
|
@@ -374,7 +503,15 @@ module Steep
|
|
|
374
503
|
)
|
|
375
504
|
}
|
|
376
505
|
results = relations.map do |relation|
|
|
377
|
-
check(
|
|
506
|
+
check(
|
|
507
|
+
relation,
|
|
508
|
+
self_type: self_type,
|
|
509
|
+
instance_type: instance_type,
|
|
510
|
+
class_type: class_type,
|
|
511
|
+
assumption: assumption,
|
|
512
|
+
trace: trace,
|
|
513
|
+
constraints: constraints
|
|
514
|
+
)
|
|
378
515
|
end
|
|
379
516
|
|
|
380
517
|
if results.all?(&:success?)
|
|
@@ -390,6 +527,8 @@ module Steep
|
|
|
390
527
|
check_interface(record_interface,
|
|
391
528
|
type_interface,
|
|
392
529
|
self_type: self_type,
|
|
530
|
+
instance_type: instance_type,
|
|
531
|
+
class_type: class_type,
|
|
393
532
|
assumption: assumption,
|
|
394
533
|
trace: trace,
|
|
395
534
|
constraints: constraints)
|
|
@@ -415,6 +554,8 @@ module Steep
|
|
|
415
554
|
check(
|
|
416
555
|
Relation.new(sub_type: relation.sub_type.back_type, super_type: relation.super_type),
|
|
417
556
|
self_type: self_type,
|
|
557
|
+
instance_type: instance_type,
|
|
558
|
+
class_type: class_type,
|
|
418
559
|
assumption: assumption,
|
|
419
560
|
trace: trace,
|
|
420
561
|
constraints: constraints
|
|
@@ -451,7 +592,7 @@ module Steep
|
|
|
451
592
|
end
|
|
452
593
|
end
|
|
453
594
|
|
|
454
|
-
def check_type_arg(relation, self_type:, assumption:, trace:, constraints:)
|
|
595
|
+
def check_type_arg(relation, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
455
596
|
sub_args = relation.sub_type.args
|
|
456
597
|
sup_args = relation.super_type.args
|
|
457
598
|
|
|
@@ -461,13 +602,37 @@ module Steep
|
|
|
461
602
|
success_all?(sub_args.zip(sup_args, sup_params.each)) do |sub_arg, sup_arg, sup_param|
|
|
462
603
|
case sup_param.variance
|
|
463
604
|
when :covariant
|
|
464
|
-
check(
|
|
605
|
+
check(
|
|
606
|
+
Relation.new(sub_type: sub_arg, super_type: sup_arg),
|
|
607
|
+
self_type: self_type,
|
|
608
|
+
instance_type: instance_type,
|
|
609
|
+
class_type: class_type,
|
|
610
|
+
assumption: assumption,
|
|
611
|
+
trace: trace,
|
|
612
|
+
constraints: constraints
|
|
613
|
+
)
|
|
465
614
|
when :contravariant
|
|
466
|
-
check(
|
|
615
|
+
check(
|
|
616
|
+
Relation.new(sub_type: sup_arg, super_type: sub_arg),
|
|
617
|
+
self_type: self_type,
|
|
618
|
+
instance_type: instance_type,
|
|
619
|
+
class_type: class_type,
|
|
620
|
+
assumption: assumption,
|
|
621
|
+
trace: trace,
|
|
622
|
+
constraints: constraints
|
|
623
|
+
)
|
|
467
624
|
when :invariant
|
|
468
625
|
rel = Relation.new(sub_type: sub_arg, super_type: sup_arg)
|
|
469
626
|
success_all?([rel, rel.flip]) do |r|
|
|
470
|
-
check(
|
|
627
|
+
check(
|
|
628
|
+
r,
|
|
629
|
+
self_type: self_type,
|
|
630
|
+
instance_type: instance_type,
|
|
631
|
+
class_type: class_type,
|
|
632
|
+
assumption: assumption,
|
|
633
|
+
trace: trace,
|
|
634
|
+
constraints: constraints
|
|
635
|
+
)
|
|
471
636
|
end
|
|
472
637
|
end
|
|
473
638
|
end
|
|
@@ -533,7 +698,7 @@ module Steep
|
|
|
533
698
|
relation.sub_type == relation.super_type
|
|
534
699
|
end
|
|
535
700
|
|
|
536
|
-
def check_interface(sub_interface, super_interface, self_type:, assumption:, trace:, constraints:)
|
|
701
|
+
def check_interface(sub_interface, super_interface, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
537
702
|
trace.interface sub_interface, super_interface do
|
|
538
703
|
method_triples = []
|
|
539
704
|
|
|
@@ -553,6 +718,8 @@ module Steep
|
|
|
553
718
|
sub_method,
|
|
554
719
|
sup_method,
|
|
555
720
|
self_type: self_type,
|
|
721
|
+
instance_type: instance_type,
|
|
722
|
+
class_type: class_type,
|
|
556
723
|
assumption: assumption,
|
|
557
724
|
trace: trace,
|
|
558
725
|
constraints: constraints)
|
|
@@ -563,7 +730,7 @@ module Steep
|
|
|
563
730
|
end
|
|
564
731
|
end
|
|
565
732
|
|
|
566
|
-
def check_method(name, sub_method, super_method, self_type:, assumption:, trace:, constraints:)
|
|
733
|
+
def check_method(name, sub_method, super_method, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
567
734
|
trace.method name, sub_method, super_method do
|
|
568
735
|
super_method.method_types.map do |super_type|
|
|
569
736
|
sub_method.method_types.map do |sub_type|
|
|
@@ -571,6 +738,8 @@ module Steep
|
|
|
571
738
|
sub_type,
|
|
572
739
|
super_type,
|
|
573
740
|
self_type: self_type,
|
|
741
|
+
instance_type: instance_type,
|
|
742
|
+
class_type: class_type,
|
|
574
743
|
assumption: assumption,
|
|
575
744
|
trace: trace,
|
|
576
745
|
constraints: constraints
|
|
@@ -587,7 +756,7 @@ module Steep
|
|
|
587
756
|
end
|
|
588
757
|
end
|
|
589
758
|
|
|
590
|
-
def check_generic_method_type(name, sub_type, super_type, self_type:, assumption:, trace:, constraints:)
|
|
759
|
+
def check_generic_method_type(name, sub_type, super_type, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
591
760
|
trace.method_type name, sub_type, super_type do
|
|
592
761
|
case
|
|
593
762
|
when sub_type.type_params.empty? && super_type.type_params.empty?
|
|
@@ -595,6 +764,8 @@ module Steep
|
|
|
595
764
|
sub_type,
|
|
596
765
|
super_type,
|
|
597
766
|
self_type: self_type,
|
|
767
|
+
instance_type: instance_type,
|
|
768
|
+
class_type: class_type,
|
|
598
769
|
assumption: assumption,
|
|
599
770
|
trace: trace,
|
|
600
771
|
constraints: constraints
|
|
@@ -633,6 +804,8 @@ module Steep
|
|
|
633
804
|
sub_type.subst(subst),
|
|
634
805
|
super_type,
|
|
635
806
|
self_type: self_type,
|
|
807
|
+
instance_type: instance_type,
|
|
808
|
+
class_type: class_type,
|
|
636
809
|
assumption: assumption,
|
|
637
810
|
trace: trace,
|
|
638
811
|
constraints: constraints)
|
|
@@ -657,6 +830,8 @@ module Steep
|
|
|
657
830
|
sub_type,
|
|
658
831
|
super_type,
|
|
659
832
|
self_type: self_type,
|
|
833
|
+
instance_type: instance_type,
|
|
834
|
+
class_type: class_type,
|
|
660
835
|
assumption: assumption,
|
|
661
836
|
trace: trace,
|
|
662
837
|
constraints: constraints)
|
|
@@ -688,6 +863,8 @@ module Steep
|
|
|
688
863
|
sub_type_,
|
|
689
864
|
super_type_,
|
|
690
865
|
self_type: self_type,
|
|
866
|
+
instance_type: instance_type,
|
|
867
|
+
class_type: class_type,
|
|
691
868
|
assumption: assumption,
|
|
692
869
|
trace: trace,
|
|
693
870
|
constraints: constraints)
|
|
@@ -701,15 +878,23 @@ module Steep
|
|
|
701
878
|
end
|
|
702
879
|
end
|
|
703
880
|
|
|
704
|
-
def check_method_type(name, sub_type, super_type, self_type:, assumption:, trace:, constraints:)
|
|
881
|
+
def check_method_type(name, sub_type, super_type, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
705
882
|
Steep.logger.tagged("#{name}: #{sub_type} <: #{super_type}") do
|
|
706
|
-
check_method_params(name, sub_type.type.params, super_type.type.params, self_type: self_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
883
|
+
check_method_params(name, sub_type.type.params, super_type.type.params, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
707
884
|
check_block_given(name, sub_type.block, super_type.block, trace: trace, constraints: constraints).then do
|
|
708
|
-
check_block_params(name, sub_type.block, super_type.block, self_type: self_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
709
|
-
check_block_return(sub_type.block, super_type.block, self_type: self_type, assumption: assumption, trace: trace, constraints:constraints).then do
|
|
885
|
+
check_block_params(name, sub_type.block, super_type.block, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints: constraints).then do
|
|
886
|
+
check_block_return(sub_type.block, super_type.block, self_type: self_type, instance_type: instance_type, class_type: class_type, assumption: assumption, trace: trace, constraints:constraints).then do
|
|
710
887
|
relation = Relation.new(super_type: super_type.type.return_type,
|
|
711
888
|
sub_type: sub_type.type.return_type)
|
|
712
|
-
check(
|
|
889
|
+
check(
|
|
890
|
+
relation,
|
|
891
|
+
self_type: self_type,
|
|
892
|
+
instance_type: instance_type,
|
|
893
|
+
class_type: class_type,
|
|
894
|
+
assumption: assumption,
|
|
895
|
+
trace: trace,
|
|
896
|
+
constraints: constraints
|
|
897
|
+
)
|
|
713
898
|
end
|
|
714
899
|
end
|
|
715
900
|
end
|
|
@@ -733,14 +918,20 @@ module Steep
|
|
|
733
918
|
end
|
|
734
919
|
end
|
|
735
920
|
|
|
736
|
-
def check_method_params(name, sub_params, super_params, self_type:, assumption:, trace:, constraints:)
|
|
921
|
+
def check_method_params(name, sub_params, super_params, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
737
922
|
match_params(name, sub_params, super_params, trace: trace).yield_self do |pairs|
|
|
738
923
|
case pairs
|
|
739
924
|
when Array
|
|
740
925
|
pairs.each do |(sub_type, super_type)|
|
|
741
926
|
relation = Relation.new(super_type: sub_type, sub_type: super_type)
|
|
742
927
|
|
|
743
|
-
result = check(relation,
|
|
928
|
+
result = check(relation,
|
|
929
|
+
self_type: self_type,
|
|
930
|
+
instance_type: instance_type,
|
|
931
|
+
class_type: class_type,
|
|
932
|
+
assumption: assumption,
|
|
933
|
+
trace: trace,
|
|
934
|
+
constraints: constraints)
|
|
744
935
|
return result if result.failure?
|
|
745
936
|
end
|
|
746
937
|
|
|
@@ -869,12 +1060,14 @@ module Steep
|
|
|
869
1060
|
pairs
|
|
870
1061
|
end
|
|
871
1062
|
|
|
872
|
-
def check_block_params(name, sub_block, super_block, self_type:, assumption:, trace:, constraints:)
|
|
1063
|
+
def check_block_params(name, sub_block, super_block, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
873
1064
|
if sub_block && super_block
|
|
874
1065
|
check_method_params(name,
|
|
875
1066
|
super_block.type.params,
|
|
876
1067
|
sub_block.type.params,
|
|
877
1068
|
self_type: self_type,
|
|
1069
|
+
instance_type: instance_type,
|
|
1070
|
+
class_type: class_type,
|
|
878
1071
|
assumption: assumption,
|
|
879
1072
|
trace: trace,
|
|
880
1073
|
constraints: constraints)
|
|
@@ -883,11 +1076,19 @@ module Steep
|
|
|
883
1076
|
end
|
|
884
1077
|
end
|
|
885
1078
|
|
|
886
|
-
def check_block_return(sub_block, super_block, self_type:, assumption:, trace:, constraints:)
|
|
1079
|
+
def check_block_return(sub_block, super_block, self_type:, instance_type:, class_type:, assumption:, trace:, constraints:)
|
|
887
1080
|
if sub_block && super_block
|
|
888
1081
|
relation = Relation.new(sub_type: super_block.type.return_type,
|
|
889
1082
|
super_type: sub_block.type.return_type)
|
|
890
|
-
check(
|
|
1083
|
+
check(
|
|
1084
|
+
relation,
|
|
1085
|
+
self_type: self_type,
|
|
1086
|
+
instance_type: instance_type,
|
|
1087
|
+
class_type: class_type,
|
|
1088
|
+
assumption: assumption,
|
|
1089
|
+
trace: trace,
|
|
1090
|
+
constraints: constraints
|
|
1091
|
+
)
|
|
891
1092
|
else
|
|
892
1093
|
success(constraints: constraints)
|
|
893
1094
|
end
|