steep 1.7.0.dev.2 → 1.7.0.dev.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +17 -19
- data/doc/narrowing.md +1 -1
- data/doc/shape.md +176 -0
- data/gemfile_steep/Gemfile.lock +10 -12
- data/lib/steep/ast/types/factory.rb +27 -18
- data/lib/steep/ast/types/helper.rb +4 -0
- data/lib/steep/ast/types/intersection.rb +7 -0
- data/lib/steep/ast/types/proc.rb +14 -9
- data/lib/steep/ast/types/record.rb +7 -0
- data/lib/steep/ast/types/tuple.rb +7 -0
- data/lib/steep/ast/types/union.rb +7 -0
- data/lib/steep/drivers/stats.rb +2 -2
- data/lib/steep/drivers/validate.rb +4 -2
- data/lib/steep/expectations.rb +2 -2
- data/lib/steep/interface/block.rb +1 -1
- data/lib/steep/interface/builder.rb +337 -360
- data/lib/steep/interface/function.rb +82 -11
- data/lib/steep/interface/method_type.rb +18 -10
- data/lib/steep/interface/shape.rb +69 -18
- data/lib/steep/interface/substitution.rb +4 -0
- data/lib/steep/node_helper.rb +18 -1
- data/lib/steep/project/pattern.rb +1 -2
- data/lib/steep/server/interaction_worker.rb +6 -0
- data/lib/steep/server/lsp_formatter.rb +2 -0
- data/lib/steep/services/completion_provider.rb +20 -18
- data/lib/steep/services/file_loader.rb +15 -20
- data/lib/steep/services/signature_help_provider.rb +17 -18
- data/lib/steep/signature/validator.rb +1 -1
- data/lib/steep/subtyping/check.rb +19 -22
- data/lib/steep/subtyping/variable_variance.rb +3 -3
- data/lib/steep/test.rb +9 -0
- data/lib/steep/type_construction.rb +198 -158
- data/lib/steep/type_inference/block_params.rb +12 -4
- data/lib/steep/type_inference/context.rb +1 -1
- data/lib/steep/type_inference/logic_type_interpreter.rb +3 -2
- data/lib/steep/type_inference/method_params.rb +16 -0
- data/lib/steep/type_inference/send_args.rb +5 -2
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +11 -7
- data/sig/steep/ast/types/factory.rbs +2 -2
- data/sig/steep/ast/types/helper.rbs +2 -0
- data/sig/steep/ast/types/intersection.rbs +2 -0
- data/sig/steep/ast/types/name.rbs +4 -0
- data/sig/steep/ast/types/record.rbs +2 -0
- data/sig/steep/ast/types/tuple.rbs +2 -0
- data/sig/steep/ast/types/union.rbs +2 -0
- data/sig/steep/expectations.rbs +1 -1
- data/sig/steep/interface/block.rbs +2 -2
- data/sig/steep/interface/builder.rbs +54 -109
- data/sig/steep/interface/function.rbs +38 -32
- data/sig/steep/interface/shape.rbs +23 -4
- data/sig/steep/interface/substitution.rbs +2 -0
- data/sig/steep/node_helper.rbs +11 -0
- data/sig/steep/services/signature_help_provider.rbs +3 -1
- data/sig/steep/subtyping/constraints.rbs +2 -2
- data/sig/steep/subtyping/variable_variance.rbs +1 -1
- data/sig/steep/type_construction.rbs +1 -1
- data/sig/steep/type_inference/block_params.rbs +3 -3
- data/sig/steep/type_inference/context.rbs +2 -0
- data/sig/steep/type_inference/method_params.rbs +3 -3
- data/sig/steep.rbs +1 -1
- data/steep.gemspec +1 -1
- metadata +6 -4
@@ -163,71 +163,93 @@ module Steep
|
|
163
163
|
|
164
164
|
case
|
165
165
|
when x.is_a?(Required) && y.is_a?(Required)
|
166
|
+
xs or raise
|
167
|
+
ys or raise
|
166
168
|
required(
|
167
169
|
union(x.type, y.type),
|
168
170
|
merge_for_overload(xs.tail, ys.tail)
|
169
171
|
)
|
170
172
|
when x.is_a?(Required) && y.is_a?(Optional)
|
173
|
+
xs or raise
|
174
|
+
ys or raise
|
171
175
|
optional(
|
172
176
|
union(x.type, y.type, null: true),
|
173
177
|
merge_for_overload(xs.tail, ys.tail)
|
174
178
|
)
|
175
179
|
when x.is_a?(Required) && y.is_a?(Rest)
|
180
|
+
xs or raise
|
181
|
+
ys or raise
|
176
182
|
optional(
|
177
183
|
union(x.type, y.type, null: true),
|
178
184
|
merge_for_overload(xs.tail, ys)
|
179
185
|
)
|
180
186
|
when x.is_a?(Required) && !y
|
187
|
+
xs or raise
|
181
188
|
optional(
|
182
189
|
union(x.type, null: true),
|
183
190
|
merge_for_overload(xs.tail, nil)
|
184
191
|
)
|
185
192
|
when x.is_a?(Optional) && y.is_a?(Required)
|
193
|
+
xs or raise
|
194
|
+
ys or raise
|
186
195
|
optional(
|
187
196
|
union(x.type, y.type, null: true),
|
188
197
|
merge_for_overload(xs.tail, ys.tail)
|
189
198
|
)
|
190
199
|
when x.is_a?(Optional) && y.is_a?(Optional)
|
200
|
+
xs or raise
|
201
|
+
ys or raise
|
191
202
|
optional(
|
192
203
|
union(x.type, y.type),
|
193
204
|
merge_for_overload(xs.tail, ys.tail)
|
194
205
|
)
|
195
206
|
when x.is_a?(Optional) && y.is_a?(Rest)
|
207
|
+
xs or raise
|
208
|
+
ys or raise
|
196
209
|
optional(
|
197
210
|
union(x.type, y.type),
|
198
211
|
merge_for_overload(xs.tail, ys)
|
199
212
|
)
|
200
213
|
when x.is_a?(Optional) && !y
|
214
|
+
xs or raise
|
201
215
|
optional(
|
202
216
|
x.type,
|
203
217
|
merge_for_overload(xs.tail, nil)
|
204
218
|
) # == xs
|
205
219
|
when x.is_a?(Rest) && y.is_a?(Required)
|
220
|
+
xs or raise
|
221
|
+
ys or raise
|
206
222
|
optional(
|
207
223
|
union(x.type, y.type, null: true),
|
208
224
|
merge_for_overload(xs, ys.tail)
|
209
225
|
)
|
210
226
|
when x.is_a?(Rest) && y.is_a?(Optional)
|
227
|
+
xs or raise
|
228
|
+
ys or raise
|
211
229
|
optional(
|
212
230
|
union(x.type, y.type),
|
213
231
|
merge_for_overload(xs, ys.tail)
|
214
232
|
)
|
215
233
|
when x.is_a?(Rest) && y.is_a?(Rest)
|
234
|
+
xs or raise
|
235
|
+
ys or raise
|
216
236
|
rest(union(x.type, y.type))
|
217
237
|
when x.is_a?(Rest) && !y
|
218
|
-
xs
|
238
|
+
xs or raise
|
219
239
|
when !x && y.is_a?(Required)
|
240
|
+
ys or raise
|
220
241
|
optional(
|
221
242
|
union(y.type, null: true),
|
222
243
|
merge_for_overload(nil, ys.tail)
|
223
244
|
)
|
224
245
|
when !x && y.is_a?(Optional)
|
246
|
+
ys or raise
|
225
247
|
optional(
|
226
248
|
y.type,
|
227
249
|
merge_for_overload(nil, ys.tail)
|
228
250
|
) # == ys
|
229
251
|
when !x && y.is_a?(Rest)
|
230
|
-
ys
|
252
|
+
ys or raise
|
231
253
|
when !x && !y
|
232
254
|
nil
|
233
255
|
end
|
@@ -240,26 +262,34 @@ module Steep
|
|
240
262
|
|
241
263
|
case
|
242
264
|
when x.is_a?(Required) && y.is_a?(Required)
|
265
|
+
xs or raise
|
266
|
+
ys or raise
|
243
267
|
required(
|
244
268
|
union(x.type, y.type),
|
245
269
|
merge_for_union(xs.tail, ys.tail)
|
246
270
|
)
|
247
271
|
when x.is_a?(Required) && !y
|
272
|
+
xs or raise
|
248
273
|
optional(
|
249
274
|
x.type,
|
250
275
|
merge_for_union(xs.tail, nil)
|
251
276
|
)
|
252
277
|
when x.is_a?(Required) && y.is_a?(Optional)
|
278
|
+
xs or raise
|
279
|
+
ys or raise
|
253
280
|
optional(
|
254
281
|
union(x.type, y.type),
|
255
282
|
merge_for_union(xs.tail, ys.tail)
|
256
283
|
)
|
257
284
|
when x.is_a?(Required) && y.is_a?(Rest)
|
285
|
+
xs or raise
|
286
|
+
ys or raise
|
258
287
|
optional(
|
259
288
|
union(x.type, y.type),
|
260
289
|
merge_for_union(xs.tail, ys)
|
261
290
|
)
|
262
291
|
when !x && y.is_a?(Required)
|
292
|
+
ys or raise
|
263
293
|
optional(
|
264
294
|
y.type,
|
265
295
|
merge_for_union(nil, ys.tail)
|
@@ -267,39 +297,53 @@ module Steep
|
|
267
297
|
when !x && !y
|
268
298
|
nil
|
269
299
|
when !x && y.is_a?(Optional)
|
300
|
+
ys or raise
|
270
301
|
PositionalParams.new(head: y, tail: merge_for_union(nil, ys.tail))
|
271
302
|
when !x && y.is_a?(Rest)
|
272
|
-
ys
|
303
|
+
ys or raise
|
273
304
|
when x.is_a?(Optional) && y.is_a?(Required)
|
305
|
+
xs or raise
|
306
|
+
ys or raise
|
274
307
|
optional(
|
275
308
|
union(x.type, y.type),
|
276
309
|
merge_for_union(xs.tail, ys.tail)
|
277
310
|
)
|
278
311
|
when x.is_a?(Optional) && !y
|
312
|
+
xs or raise
|
279
313
|
PositionalParams.new(head: x, tail: merge_for_union(xs.tail, nil)) # == xs
|
280
314
|
when x.is_a?(Optional) && y.is_a?(Optional)
|
315
|
+
xs or raise
|
316
|
+
ys or raise
|
281
317
|
optional(
|
282
318
|
union(x.type, y.type),
|
283
319
|
merge_for_union(xs.tail, ys.tail)
|
284
320
|
)
|
285
321
|
when x.is_a?(Optional) && y.is_a?(Rest)
|
322
|
+
xs or raise
|
323
|
+
ys or raise
|
286
324
|
optional(
|
287
325
|
union(x.type, y.type),
|
288
326
|
merge_for_union(xs.tail, ys.tail)
|
289
327
|
)
|
290
328
|
when x.is_a?(Rest) && y.is_a?(Required)
|
329
|
+
xs or raise
|
330
|
+
ys or raise
|
291
331
|
optional(
|
292
332
|
union(x.type, y.type),
|
293
333
|
merge_for_union(xs, ys.tail)
|
294
334
|
)
|
295
335
|
when x.is_a?(Rest) && !y
|
296
|
-
xs
|
336
|
+
xs or raise
|
297
337
|
when x.is_a?(Rest) && y.is_a?(Optional)
|
338
|
+
xs or raise
|
339
|
+
ys or raise
|
298
340
|
optional(
|
299
341
|
union(x.type, y.type),
|
300
342
|
merge_for_union(xs, ys.tail)
|
301
343
|
)
|
302
344
|
when x.is_a?(Rest) && y.is_a?(Rest)
|
345
|
+
xs or raise
|
346
|
+
ys or raise
|
303
347
|
rest(
|
304
348
|
union(x.type, y.type)
|
305
349
|
)
|
@@ -315,6 +359,8 @@ module Steep
|
|
315
359
|
|
316
360
|
case
|
317
361
|
when x.is_a?(Required) && y.is_a?(Required)
|
362
|
+
xs or raise
|
363
|
+
ys or raise
|
318
364
|
required(
|
319
365
|
intersection(x.type, y.type),
|
320
366
|
merge_for_intersection(xs.tail, ys.tail)
|
@@ -322,11 +368,15 @@ module Steep
|
|
322
368
|
when x.is_a?(Required) && !y
|
323
369
|
raise
|
324
370
|
when x.is_a?(Required) && y.is_a?(Optional)
|
371
|
+
xs or raise
|
372
|
+
ys or raise
|
325
373
|
required(
|
326
374
|
intersection(x.type, y.type),
|
327
375
|
merge_for_intersection(xs.tail, ys.tail)
|
328
376
|
)
|
329
377
|
when x.is_a?(Required) && y.is_a?(Rest)
|
378
|
+
xs or raise
|
379
|
+
ys or raise
|
330
380
|
required(
|
331
381
|
intersection(x.type, y.type),
|
332
382
|
merge_for_intersection(xs.tail, ys)
|
@@ -340,6 +390,8 @@ module Steep
|
|
340
390
|
when !x && y.is_a?(Rest)
|
341
391
|
nil
|
342
392
|
when x.is_a?(Optional) && y.is_a?(Required)
|
393
|
+
xs or raise
|
394
|
+
ys or raise
|
343
395
|
required(
|
344
396
|
intersection(x.type, y.type),
|
345
397
|
merge_for_intersection(xs.tail, ys.tail)
|
@@ -347,16 +399,22 @@ module Steep
|
|
347
399
|
when x.is_a?(Optional) && !y
|
348
400
|
nil
|
349
401
|
when x.is_a?(Optional) && y.is_a?(Optional)
|
402
|
+
xs or raise
|
403
|
+
ys or raise
|
350
404
|
optional(
|
351
405
|
intersection(x.type, y.type),
|
352
406
|
merge_for_intersection(xs.tail, ys.tail)
|
353
407
|
)
|
354
408
|
when x.is_a?(Optional) && y.is_a?(Rest)
|
409
|
+
xs or raise
|
410
|
+
ys or raise
|
355
411
|
optional(
|
356
412
|
intersection(x.type, y.type),
|
357
413
|
merge_for_intersection(xs.tail, ys)
|
358
414
|
)
|
359
415
|
when x.is_a?(Rest) && y.is_a?(Required)
|
416
|
+
xs or raise
|
417
|
+
ys or raise
|
360
418
|
required(
|
361
419
|
intersection(x.type, y.type),
|
362
420
|
merge_for_intersection(xs, ys.tail)
|
@@ -364,6 +422,8 @@ module Steep
|
|
364
422
|
when x.is_a?(Rest) && !y
|
365
423
|
nil
|
366
424
|
when x.is_a?(Rest) && y.is_a?(Optional)
|
425
|
+
xs or raise
|
426
|
+
ys or raise
|
367
427
|
optional(
|
368
428
|
intersection(x.type, y.type),
|
369
429
|
merge_for_intersection(xs, ys.tail)
|
@@ -705,6 +765,8 @@ module Steep
|
|
705
765
|
return param.type
|
706
766
|
end
|
707
767
|
end
|
768
|
+
|
769
|
+
nil
|
708
770
|
end
|
709
771
|
|
710
772
|
attr_reader :positional_params
|
@@ -836,7 +898,7 @@ module Steep
|
|
836
898
|
end
|
837
899
|
|
838
900
|
def closed?
|
839
|
-
each_type.all?
|
901
|
+
each_type.all? { _1.free_variables.empty? }
|
840
902
|
end
|
841
903
|
|
842
904
|
def subst(s)
|
@@ -945,7 +1007,8 @@ module Steep
|
|
945
1007
|
|
946
1008
|
def free_variables
|
947
1009
|
@fvs ||= Set[].tap do |fvs|
|
948
|
-
fvs
|
1010
|
+
# @type var fvs: Set[AST::Types::variable]
|
1011
|
+
fvs.merge(params.free_variables) if params
|
949
1012
|
fvs.merge(return_type.free_variables)
|
950
1013
|
end
|
951
1014
|
end
|
@@ -953,7 +1016,7 @@ module Steep
|
|
953
1016
|
def subst(s)
|
954
1017
|
return self if s.empty?
|
955
1018
|
|
956
|
-
ps = params.subst(s)
|
1019
|
+
ps = params.subst(s) if params
|
957
1020
|
ret = return_type.subst(s)
|
958
1021
|
|
959
1022
|
if ps == params && ret == return_type
|
@@ -969,7 +1032,7 @@ module Steep
|
|
969
1032
|
|
970
1033
|
def each_type(&block)
|
971
1034
|
if block
|
972
|
-
params
|
1035
|
+
params&.each_type(&block)
|
973
1036
|
yield return_type
|
974
1037
|
else
|
975
1038
|
enum_for :each_type
|
@@ -980,7 +1043,7 @@ module Steep
|
|
980
1043
|
|
981
1044
|
def map_type(&block)
|
982
1045
|
Function.new(
|
983
|
-
params: params
|
1046
|
+
params: params&.map_type(&block),
|
984
1047
|
return_type: yield(return_type),
|
985
1048
|
location: location
|
986
1049
|
)
|
@@ -995,11 +1058,19 @@ module Steep
|
|
995
1058
|
end
|
996
1059
|
|
997
1060
|
def to_s
|
998
|
-
|
1061
|
+
if params
|
1062
|
+
"#{params} -> #{return_type}"
|
1063
|
+
else
|
1064
|
+
"(?) -> #{return_type}"
|
1065
|
+
end
|
999
1066
|
end
|
1000
1067
|
|
1001
1068
|
def closed?
|
1002
|
-
params
|
1069
|
+
if params
|
1070
|
+
params.closed? && return_type.free_variables.empty?
|
1071
|
+
else
|
1072
|
+
return_type.free_variables.empty?
|
1073
|
+
end
|
1003
1074
|
end
|
1004
1075
|
end
|
1005
1076
|
end
|
@@ -61,7 +61,7 @@ module Steep
|
|
61
61
|
type.each_type(&block)
|
62
62
|
if block()
|
63
63
|
yield(block().self_type) if block().self_type
|
64
|
-
block().type.params
|
64
|
+
block().type.params&.each_type(&block)
|
65
65
|
yield(block().type.return_type)
|
66
66
|
end
|
67
67
|
else
|
@@ -119,7 +119,7 @@ module Steep
|
|
119
119
|
self.class.new(
|
120
120
|
type_params: type_params,
|
121
121
|
type: Function.new(
|
122
|
-
params: type.params.subst(s1) + other.type.params.subst(s2),
|
122
|
+
params: type.params && other.type.params ? type.params.subst(s1) + other.type.params.subst(s2) : nil,
|
123
123
|
return_type: AST::Types::Union.build(
|
124
124
|
types: [type.return_type.subst(s1), other.type.return_type.subst(s2)]
|
125
125
|
),
|
@@ -192,10 +192,10 @@ module Steep
|
|
192
192
|
type2_ = type2.instantiate(s2)
|
193
193
|
if mt = generate[type1_, type2_]
|
194
194
|
check.push_variable_bounds(params1 + params2) do
|
195
|
-
|
196
|
-
|
195
|
+
variables = type1.type_params.map(&:name) + type2.type_params.map(&:name)
|
196
|
+
constraints = Subtyping::Constraints.new(unknowns: variables)
|
197
197
|
|
198
|
-
|
198
|
+
check.with_context(self_type: AST::Builtin.any_type, instance_type: AST::Builtin.any_type, class_type: AST::Builtin.any_type, constraints: constraints) do
|
199
199
|
result1 = check.check_method_type(:__method_on_type1, relation[type1.with(type_params: []), mt])
|
200
200
|
result2 = check.check_method_type(:__method_on_type2, relation[type2.with(type_params: []), mt])
|
201
201
|
|
@@ -250,10 +250,13 @@ module Steep
|
|
250
250
|
nil
|
251
251
|
end
|
252
252
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
253
|
+
if b.type.params && ob.type.params
|
254
|
+
# Return when the two block parameters are imcompatible.
|
255
|
+
return unless b.type.params & ob.type.params
|
256
|
+
block_params = b.type.params | ob.type.params or return
|
257
|
+
else
|
258
|
+
block_params = b.type.params || ob.type.params
|
259
|
+
end
|
257
260
|
|
258
261
|
block_return_type = AST::Types::Intersection.build(types: [b.type.return_type, ob.type.return_type])
|
259
262
|
block_type = Function.new(params: block_params, return_type: block_return_type, location: nil)
|
@@ -285,7 +288,12 @@ module Steep
|
|
285
288
|
def &(other)
|
286
289
|
return self if self == other
|
287
290
|
|
288
|
-
|
291
|
+
if self.type.params && other.type.params
|
292
|
+
params = self.type.params | other.type.params or return
|
293
|
+
else
|
294
|
+
params = self.type.params || other.type.params
|
295
|
+
end
|
296
|
+
|
289
297
|
block =
|
290
298
|
case
|
291
299
|
when (b = self.block) && (ob = other.block)
|
@@ -2,14 +2,43 @@ module Steep
|
|
2
2
|
module Interface
|
3
3
|
class Shape
|
4
4
|
class Entry
|
5
|
-
|
6
|
-
|
7
|
-
def initialize(method_types:)
|
5
|
+
def initialize(method_types: nil, private_method:, &block)
|
8
6
|
@method_types = method_types
|
7
|
+
@generator = block
|
8
|
+
@private_method = private_method
|
9
|
+
end
|
10
|
+
|
11
|
+
def force
|
12
|
+
unless @method_types
|
13
|
+
@method_types = @generator&.call
|
14
|
+
@generator = nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_types
|
19
|
+
force
|
20
|
+
@method_types or raise
|
21
|
+
end
|
22
|
+
|
23
|
+
def has_method_type?
|
24
|
+
force
|
25
|
+
@method_types ? true : false
|
9
26
|
end
|
10
27
|
|
11
28
|
def to_s
|
12
|
-
|
29
|
+
if @generator
|
30
|
+
"<< Lazy entry >>"
|
31
|
+
else
|
32
|
+
"{ #{method_types.join(" || ")} }"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def private_method?
|
37
|
+
@private_method
|
38
|
+
end
|
39
|
+
|
40
|
+
def public_method?
|
41
|
+
!private_method?
|
13
42
|
end
|
14
43
|
end
|
15
44
|
|
@@ -25,7 +54,11 @@ module Steep
|
|
25
54
|
end
|
26
55
|
|
27
56
|
def key?(name)
|
28
|
-
methods.
|
57
|
+
if entry = methods.fetch(name, nil)
|
58
|
+
entry.has_method_type?
|
59
|
+
else
|
60
|
+
false
|
61
|
+
end
|
29
62
|
end
|
30
63
|
|
31
64
|
def []=(name, entry)
|
@@ -37,10 +70,12 @@ module Steep
|
|
37
70
|
return nil unless key?(name)
|
38
71
|
|
39
72
|
resolved_methods[name] ||= begin
|
73
|
+
entry = methods[name]
|
40
74
|
Entry.new(
|
41
|
-
method_types:
|
75
|
+
method_types: entry.method_types.map do |method_type|
|
42
76
|
method_type.subst(subst)
|
43
|
-
end
|
77
|
+
end,
|
78
|
+
private_method: entry.private_method?
|
44
79
|
)
|
45
80
|
end
|
46
81
|
end
|
@@ -48,7 +83,7 @@ module Steep
|
|
48
83
|
def each(&block)
|
49
84
|
if block
|
50
85
|
methods.each_key do |name|
|
51
|
-
entry = self[name] or
|
86
|
+
entry = self[name] or next
|
52
87
|
yield [name, entry]
|
53
88
|
end
|
54
89
|
else
|
@@ -58,7 +93,9 @@ module Steep
|
|
58
93
|
|
59
94
|
def each_name(&block)
|
60
95
|
if block
|
61
|
-
|
96
|
+
each do |name, _|
|
97
|
+
yield name
|
98
|
+
end
|
62
99
|
else
|
63
100
|
enum_for :each_name
|
64
101
|
end
|
@@ -76,19 +113,21 @@ module Steep
|
|
76
113
|
Methods.new(substs: [*substs, subst], methods: methods)
|
77
114
|
end
|
78
115
|
|
79
|
-
def merge!(other)
|
116
|
+
def merge!(other, &block)
|
80
117
|
other.each do |name, entry|
|
81
|
-
methods[name]
|
118
|
+
if block && (old_entry = methods[name])
|
119
|
+
methods[name] = yield(name, old_entry, entry)
|
120
|
+
else
|
121
|
+
methods[name] = entry
|
122
|
+
end
|
82
123
|
end
|
83
124
|
end
|
84
125
|
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
methods
|
126
|
+
def public_methods
|
127
|
+
Methods.new(
|
128
|
+
substs: substs,
|
129
|
+
methods: methods.reject {|_, entry| entry.private_method? }
|
130
|
+
)
|
92
131
|
end
|
93
132
|
end
|
94
133
|
|
@@ -127,6 +166,18 @@ module Steep
|
|
127
166
|
def public?
|
128
167
|
!private?
|
129
168
|
end
|
169
|
+
|
170
|
+
def public_shape
|
171
|
+
if public?
|
172
|
+
self
|
173
|
+
else
|
174
|
+
@public_shape ||= Shape.new(
|
175
|
+
type: type,
|
176
|
+
private: false,
|
177
|
+
methods: methods.public_methods
|
178
|
+
)
|
179
|
+
end
|
180
|
+
end
|
130
181
|
end
|
131
182
|
end
|
132
183
|
end
|
@@ -138,6 +138,10 @@ module Steep
|
|
138
138
|
self
|
139
139
|
end
|
140
140
|
|
141
|
+
def update(self_type: self_type(), instance_type: instance_type(), module_type: module_type())
|
142
|
+
Substitution.new(dictionary: dictionary.dup, instance_type: instance_type, self_type: self_type, module_type: module_type)
|
143
|
+
end
|
144
|
+
|
141
145
|
def merge(s)
|
142
146
|
Substitution.new(dictionary: dictionary.dup,
|
143
147
|
instance_type: instance_type,
|
data/lib/steep/node_helper.rb
CHANGED
@@ -207,7 +207,7 @@ module Steep
|
|
207
207
|
end
|
208
208
|
|
209
209
|
def deconstruct_send_node!(node)
|
210
|
-
deconstruct_send_node(node) or raise
|
210
|
+
deconstruct_send_node(node) or raise(node.inspect)
|
211
211
|
end
|
212
212
|
|
213
213
|
def test_send_node(node)
|
@@ -218,6 +218,23 @@ module Steep
|
|
218
218
|
end
|
219
219
|
end
|
220
220
|
|
221
|
+
def private_send?(node)
|
222
|
+
case node.type
|
223
|
+
when :block, :numblock
|
224
|
+
private_send?(node.children[0])
|
225
|
+
when :send, :csend
|
226
|
+
receiver, = deconstruct_send_node!(node)
|
227
|
+
|
228
|
+
if receiver && receiver.type != :self
|
229
|
+
return false
|
230
|
+
end
|
231
|
+
|
232
|
+
true
|
233
|
+
else
|
234
|
+
raise "Unexpected node is given: #{node.inspect}"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
221
238
|
def deconstruct_sendish_and_block_nodes(*nodes)
|
222
239
|
send_node, block_node = nodes.take(2)
|
223
240
|
|
@@ -46,10 +46,9 @@ module Steep
|
|
46
46
|
|
47
47
|
def test_string(path, patterns, prefixes)
|
48
48
|
string = path.to_s
|
49
|
-
extension = path.extname
|
50
49
|
|
51
50
|
patterns.any? {|pat| File.fnmatch(pat, string, File::FNM_PATHNAME) } ||
|
52
|
-
prefixes.any? {|prefix|
|
51
|
+
prefixes.any? {|prefix| File.fnmatch("#{prefix}**/*#{ext}", string, File::FNM_PATHNAME) }
|
53
52
|
end
|
54
53
|
end
|
55
54
|
end
|
@@ -90,6 +90,12 @@ module Steep
|
|
90
90
|
collect_changes(request)
|
91
91
|
queue_job ApplyChangeJob.new
|
92
92
|
|
93
|
+
when "$/file/reset"
|
94
|
+
uri = request[:params][:uri]
|
95
|
+
text = request[:params][:content]
|
96
|
+
reset_change(uri: uri, text: text)
|
97
|
+
queue_job ApplyChangeJob.new
|
98
|
+
|
93
99
|
when "textDocument/hover"
|
94
100
|
id = request[:id]
|
95
101
|
|
@@ -611,18 +611,21 @@ module Steep
|
|
611
611
|
range = range_for(position, prefix: prefix)
|
612
612
|
context = typing.context_at(line: position.line, column: position.column)
|
613
613
|
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
614
|
+
config =
|
615
|
+
if (module_type = context.module_context&.module_type) && (instance_type = context.module_context&.instance_type)
|
616
|
+
Interface::Builder::Config.new(
|
617
|
+
self_type: context.self_type,
|
618
|
+
class_type: module_type,
|
619
|
+
instance_type: instance_type,
|
620
|
+
variable_bounds: context.variable_context.upper_bounds
|
621
|
+
)
|
622
|
+
else
|
623
|
+
Interface::Builder::Config.new(self_type: context.self_type, variable_bounds: context.variable_context.upper_bounds)
|
624
|
+
end
|
625
|
+
|
626
|
+
if shape = subtyping.builder.shape(type, config)
|
627
|
+
shape = shape.public_shape unless include_private
|
624
628
|
|
625
|
-
if shape
|
626
629
|
shape.methods.each do |name, method_entry|
|
627
630
|
next if disallowed_method?(name)
|
628
631
|
|
@@ -728,17 +731,16 @@ module Steep
|
|
728
731
|
|
729
732
|
case call
|
730
733
|
when TypeInference::MethodCall::Typed, TypeInference::MethodCall::Error
|
734
|
+
context = typing.context_at(line: position.line, column: position.column)
|
731
735
|
type = call.receiver_type
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
)
|
737
|
-
if shape
|
736
|
+
|
737
|
+
config = Interface::Builder::Config.new(self_type: type, variable_bounds: context.variable_context.upper_bounds)
|
738
|
+
if shape = subtyping.builder.shape(type, config)
|
739
|
+
shape = shape.public_shape if private_send?(call_node)
|
738
740
|
if method = shape.methods[call.method_name]
|
739
741
|
method.method_types.each.with_index do |method_type, i|
|
740
742
|
defn = method_type.method_decls.to_a[0]&.method_def
|
741
|
-
if defn
|
743
|
+
if defn && defn.type.type
|
742
744
|
range = range_for(position, prefix: prefix)
|
743
745
|
kwargs = argument_nodes.find { |arg| arg.type == :kwargs }&.children || []
|
744
746
|
used_kwargs = kwargs.filter_map { |arg| arg.type == :pair && arg.children.first.children.first }
|