sorbet-runtime 0.5.11144 → 0.5.11663
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sorbet-runtime.rb +1 -4
- data/lib/types/compatibility_patches.rb +1 -1
- data/lib/types/configuration.rb +3 -2
- data/lib/types/enum.rb +63 -39
- data/lib/types/non_forcing_constants.rb +4 -14
- data/lib/types/private/abstract/declare.rb +4 -5
- data/lib/types/private/caller_utils.rb +27 -0
- data/lib/types/private/class_utils.rb +1 -1
- data/lib/types/private/methods/_methods.rb +35 -30
- data/lib/types/private/methods/call_validation.rb +48 -16
- data/lib/types/private/methods/call_validation_2_6.rb +518 -0
- data/lib/types/private/methods/call_validation_2_7.rb +518 -0
- data/lib/types/private/methods/decl_builder.rb +4 -4
- data/lib/types/private/methods/signature.rb +10 -2
- data/lib/types/private/methods/signature_validation.rb +13 -7
- data/lib/types/private/runtime_levels.rb +0 -3
- data/lib/types/private/sealed.rb +8 -8
- data/lib/types/private/types/not_typed.rb +4 -0
- data/lib/types/private/types/string_holder.rb +4 -0
- data/lib/types/private/types/type_alias.rb +4 -0
- data/lib/types/private/types/void.rb +4 -0
- data/lib/types/props/_props.rb +3 -3
- data/lib/types/props/decorator.rb +9 -8
- data/lib/types/props/has_lazily_specialized_methods.rb +5 -1
- data/lib/types/props/pretty_printable.rb +7 -7
- data/lib/types/props/private/deserializer_generator.rb +4 -1
- data/lib/types/props/private/setter_factory.rb +129 -69
- data/lib/types/props/serializable.rb +24 -3
- data/lib/types/struct.rb +1 -1
- data/lib/types/types/anything.rb +4 -0
- data/lib/types/types/attached_class.rb +4 -0
- data/lib/types/types/base.rb +8 -2
- data/lib/types/types/class_of.rb +6 -2
- data/lib/types/types/enum.rb +5 -1
- data/lib/types/types/fixed_array.rb +19 -12
- data/lib/types/types/fixed_hash.rb +16 -9
- data/lib/types/types/intersection.rb +13 -6
- data/lib/types/types/noreturn.rb +4 -0
- data/lib/types/types/proc.rb +19 -9
- data/lib/types/types/self_type.rb +4 -0
- data/lib/types/types/simple.rb +9 -0
- data/lib/types/types/t_enum.rb +4 -0
- data/lib/types/types/type_parameter.rb +4 -0
- data/lib/types/types/type_variable.rb +4 -0
- data/lib/types/types/typed_array.rb +7 -2
- data/lib/types/types/typed_class.rb +22 -5
- data/lib/types/types/typed_enumerable.rb +22 -16
- data/lib/types/types/typed_enumerator.rb +2 -4
- data/lib/types/types/typed_enumerator_chain.rb +2 -4
- data/lib/types/types/typed_enumerator_lazy.rb +2 -4
- data/lib/types/types/typed_hash.rb +17 -7
- data/lib/types/types/typed_range.rb +2 -4
- data/lib/types/types/typed_set.rb +3 -5
- data/lib/types/types/union.rb +12 -5
- data/lib/types/types/untyped.rb +4 -0
- data/lib/types/utils.rb +7 -5
- metadata +23 -24
- data/lib/types/interface_wrapper.rb +0 -162
- data/lib/types/private/compiler.rb +0 -24
@@ -343,6 +343,265 @@ module T::Private::Methods::CallValidation
|
|
343
343
|
end
|
344
344
|
end
|
345
345
|
|
346
|
+
def self.create_validator_method_skip_return_fast(mod, original_method, method_sig, original_visibility)
|
347
|
+
# trampoline to reduce stack frame size
|
348
|
+
arg_types = method_sig.arg_types
|
349
|
+
case arg_types.length
|
350
|
+
when 0
|
351
|
+
create_validator_method_skip_return_fast0(mod, original_method, method_sig, original_visibility)
|
352
|
+
when 1
|
353
|
+
create_validator_method_skip_return_fast1(mod, original_method, method_sig, original_visibility,
|
354
|
+
arg_types[0][1].raw_type)
|
355
|
+
when 2
|
356
|
+
create_validator_method_skip_return_fast2(mod, original_method, method_sig, original_visibility,
|
357
|
+
arg_types[0][1].raw_type,
|
358
|
+
arg_types[1][1].raw_type)
|
359
|
+
when 3
|
360
|
+
create_validator_method_skip_return_fast3(mod, original_method, method_sig, original_visibility,
|
361
|
+
arg_types[0][1].raw_type,
|
362
|
+
arg_types[1][1].raw_type,
|
363
|
+
arg_types[2][1].raw_type)
|
364
|
+
when 4
|
365
|
+
create_validator_method_skip_return_fast4(mod, original_method, method_sig, original_visibility,
|
366
|
+
arg_types[0][1].raw_type,
|
367
|
+
arg_types[1][1].raw_type,
|
368
|
+
arg_types[2][1].raw_type,
|
369
|
+
arg_types[3][1].raw_type)
|
370
|
+
else
|
371
|
+
raise 'should not happen'
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def self.create_validator_method_skip_return_fast0(mod, original_method, method_sig, original_visibility)
|
376
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |&blk|
|
377
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
378
|
+
# The following line breaks are intentional to show nice pry message
|
379
|
+
|
380
|
+
|
381
|
+
|
382
|
+
|
383
|
+
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
# PRY note:
|
390
|
+
# this code is sig validation code.
|
391
|
+
# Please issue `finish` to step out of it
|
392
|
+
|
393
|
+
original_method.bind_call(self, &blk)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def self.create_validator_method_skip_return_fast1(mod, original_method, method_sig, original_visibility, arg0_type)
|
398
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, &blk|
|
399
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
400
|
+
unless arg0.is_a?(arg0_type)
|
401
|
+
CallValidation.report_error(
|
402
|
+
method_sig,
|
403
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
404
|
+
'Parameter',
|
405
|
+
method_sig.arg_types[0][0],
|
406
|
+
arg0_type,
|
407
|
+
arg0,
|
408
|
+
caller_offset: -1
|
409
|
+
)
|
410
|
+
end
|
411
|
+
|
412
|
+
# The following line breaks are intentional to show nice pry message
|
413
|
+
|
414
|
+
|
415
|
+
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
# PRY note:
|
424
|
+
# this code is sig validation code.
|
425
|
+
# Please issue `finish` to step out of it
|
426
|
+
|
427
|
+
original_method.bind_call(self, arg0, &blk)
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
def self.create_validator_method_skip_return_fast2(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type)
|
432
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, &blk|
|
433
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
434
|
+
unless arg0.is_a?(arg0_type)
|
435
|
+
CallValidation.report_error(
|
436
|
+
method_sig,
|
437
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
438
|
+
'Parameter',
|
439
|
+
method_sig.arg_types[0][0],
|
440
|
+
arg0_type,
|
441
|
+
arg0,
|
442
|
+
caller_offset: -1
|
443
|
+
)
|
444
|
+
end
|
445
|
+
|
446
|
+
unless arg1.is_a?(arg1_type)
|
447
|
+
CallValidation.report_error(
|
448
|
+
method_sig,
|
449
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
450
|
+
'Parameter',
|
451
|
+
method_sig.arg_types[1][0],
|
452
|
+
arg1_type,
|
453
|
+
arg1,
|
454
|
+
caller_offset: -1
|
455
|
+
)
|
456
|
+
end
|
457
|
+
|
458
|
+
# The following line breaks are intentional to show nice pry message
|
459
|
+
|
460
|
+
|
461
|
+
|
462
|
+
|
463
|
+
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
|
468
|
+
|
469
|
+
# PRY note:
|
470
|
+
# this code is sig validation code.
|
471
|
+
# Please issue `finish` to step out of it
|
472
|
+
|
473
|
+
original_method.bind_call(self, arg0, arg1, &blk)
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
def self.create_validator_method_skip_return_fast3(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type, arg2_type)
|
478
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, arg2, &blk|
|
479
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
480
|
+
unless arg0.is_a?(arg0_type)
|
481
|
+
CallValidation.report_error(
|
482
|
+
method_sig,
|
483
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
484
|
+
'Parameter',
|
485
|
+
method_sig.arg_types[0][0],
|
486
|
+
arg0_type,
|
487
|
+
arg0,
|
488
|
+
caller_offset: -1
|
489
|
+
)
|
490
|
+
end
|
491
|
+
|
492
|
+
unless arg1.is_a?(arg1_type)
|
493
|
+
CallValidation.report_error(
|
494
|
+
method_sig,
|
495
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
496
|
+
'Parameter',
|
497
|
+
method_sig.arg_types[1][0],
|
498
|
+
arg1_type,
|
499
|
+
arg1,
|
500
|
+
caller_offset: -1
|
501
|
+
)
|
502
|
+
end
|
503
|
+
|
504
|
+
unless arg2.is_a?(arg2_type)
|
505
|
+
CallValidation.report_error(
|
506
|
+
method_sig,
|
507
|
+
method_sig.arg_types[2][1].error_message_for_obj(arg2),
|
508
|
+
'Parameter',
|
509
|
+
method_sig.arg_types[2][0],
|
510
|
+
arg2_type,
|
511
|
+
arg2,
|
512
|
+
caller_offset: -1
|
513
|
+
)
|
514
|
+
end
|
515
|
+
|
516
|
+
# The following line breaks are intentional to show nice pry message
|
517
|
+
|
518
|
+
|
519
|
+
|
520
|
+
|
521
|
+
|
522
|
+
|
523
|
+
|
524
|
+
|
525
|
+
|
526
|
+
|
527
|
+
# PRY note:
|
528
|
+
# this code is sig validation code.
|
529
|
+
# Please issue `finish` to step out of it
|
530
|
+
|
531
|
+
original_method.bind_call(self, arg0, arg1, arg2, &blk)
|
532
|
+
end
|
533
|
+
end
|
534
|
+
|
535
|
+
def self.create_validator_method_skip_return_fast4(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type, arg2_type, arg3_type)
|
536
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, arg2, arg3, &blk|
|
537
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
538
|
+
unless arg0.is_a?(arg0_type)
|
539
|
+
CallValidation.report_error(
|
540
|
+
method_sig,
|
541
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
542
|
+
'Parameter',
|
543
|
+
method_sig.arg_types[0][0],
|
544
|
+
arg0_type,
|
545
|
+
arg0,
|
546
|
+
caller_offset: -1
|
547
|
+
)
|
548
|
+
end
|
549
|
+
|
550
|
+
unless arg1.is_a?(arg1_type)
|
551
|
+
CallValidation.report_error(
|
552
|
+
method_sig,
|
553
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
554
|
+
'Parameter',
|
555
|
+
method_sig.arg_types[1][0],
|
556
|
+
arg1_type,
|
557
|
+
arg1,
|
558
|
+
caller_offset: -1
|
559
|
+
)
|
560
|
+
end
|
561
|
+
|
562
|
+
unless arg2.is_a?(arg2_type)
|
563
|
+
CallValidation.report_error(
|
564
|
+
method_sig,
|
565
|
+
method_sig.arg_types[2][1].error_message_for_obj(arg2),
|
566
|
+
'Parameter',
|
567
|
+
method_sig.arg_types[2][0],
|
568
|
+
arg2_type,
|
569
|
+
arg2,
|
570
|
+
caller_offset: -1
|
571
|
+
)
|
572
|
+
end
|
573
|
+
|
574
|
+
unless arg3.is_a?(arg3_type)
|
575
|
+
CallValidation.report_error(
|
576
|
+
method_sig,
|
577
|
+
method_sig.arg_types[3][1].error_message_for_obj(arg3),
|
578
|
+
'Parameter',
|
579
|
+
method_sig.arg_types[3][0],
|
580
|
+
arg3_type,
|
581
|
+
arg3,
|
582
|
+
caller_offset: -1
|
583
|
+
)
|
584
|
+
end
|
585
|
+
|
586
|
+
# The following line breaks are intentional to show nice pry message
|
587
|
+
|
588
|
+
|
589
|
+
|
590
|
+
|
591
|
+
|
592
|
+
|
593
|
+
|
594
|
+
|
595
|
+
|
596
|
+
|
597
|
+
# PRY note:
|
598
|
+
# this code is sig validation code.
|
599
|
+
# Please issue `finish` to step out of it
|
600
|
+
|
601
|
+
original_method.bind_call(self, arg0, arg1, arg2, arg3, &blk)
|
602
|
+
end
|
603
|
+
end
|
604
|
+
|
346
605
|
def self.create_validator_procedure_fast(mod, original_method, method_sig, original_visibility)
|
347
606
|
# trampoline to reduce stack frame size
|
348
607
|
arg_types = method_sig.arg_types
|
@@ -944,6 +1203,265 @@ module T::Private::Methods::CallValidation
|
|
944
1203
|
end
|
945
1204
|
end
|
946
1205
|
|
1206
|
+
def self.create_validator_method_skip_return_medium(mod, original_method, method_sig, original_visibility)
|
1207
|
+
# trampoline to reduce stack frame size
|
1208
|
+
arg_types = method_sig.arg_types
|
1209
|
+
case arg_types.length
|
1210
|
+
when 0
|
1211
|
+
create_validator_method_skip_return_medium0(mod, original_method, method_sig, original_visibility)
|
1212
|
+
when 1
|
1213
|
+
create_validator_method_skip_return_medium1(mod, original_method, method_sig, original_visibility,
|
1214
|
+
arg_types[0][1])
|
1215
|
+
when 2
|
1216
|
+
create_validator_method_skip_return_medium2(mod, original_method, method_sig, original_visibility,
|
1217
|
+
arg_types[0][1],
|
1218
|
+
arg_types[1][1])
|
1219
|
+
when 3
|
1220
|
+
create_validator_method_skip_return_medium3(mod, original_method, method_sig, original_visibility,
|
1221
|
+
arg_types[0][1],
|
1222
|
+
arg_types[1][1],
|
1223
|
+
arg_types[2][1])
|
1224
|
+
when 4
|
1225
|
+
create_validator_method_skip_return_medium4(mod, original_method, method_sig, original_visibility,
|
1226
|
+
arg_types[0][1],
|
1227
|
+
arg_types[1][1],
|
1228
|
+
arg_types[2][1],
|
1229
|
+
arg_types[3][1])
|
1230
|
+
else
|
1231
|
+
raise 'should not happen'
|
1232
|
+
end
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
def self.create_validator_method_skip_return_medium0(mod, original_method, method_sig, original_visibility)
|
1236
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |&blk|
|
1237
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
1238
|
+
# The following line breaks are intentional to show nice pry message
|
1239
|
+
|
1240
|
+
|
1241
|
+
|
1242
|
+
|
1243
|
+
|
1244
|
+
|
1245
|
+
|
1246
|
+
|
1247
|
+
|
1248
|
+
|
1249
|
+
# PRY note:
|
1250
|
+
# this code is sig validation code.
|
1251
|
+
# Please issue `finish` to step out of it
|
1252
|
+
|
1253
|
+
original_method.bind_call(self, &blk)
|
1254
|
+
end
|
1255
|
+
end
|
1256
|
+
|
1257
|
+
def self.create_validator_method_skip_return_medium1(mod, original_method, method_sig, original_visibility, arg0_type)
|
1258
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, &blk|
|
1259
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
1260
|
+
unless arg0_type.valid?(arg0)
|
1261
|
+
CallValidation.report_error(
|
1262
|
+
method_sig,
|
1263
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
1264
|
+
'Parameter',
|
1265
|
+
method_sig.arg_types[0][0],
|
1266
|
+
arg0_type,
|
1267
|
+
arg0,
|
1268
|
+
caller_offset: -1
|
1269
|
+
)
|
1270
|
+
end
|
1271
|
+
|
1272
|
+
# The following line breaks are intentional to show nice pry message
|
1273
|
+
|
1274
|
+
|
1275
|
+
|
1276
|
+
|
1277
|
+
|
1278
|
+
|
1279
|
+
|
1280
|
+
|
1281
|
+
|
1282
|
+
|
1283
|
+
# PRY note:
|
1284
|
+
# this code is sig validation code.
|
1285
|
+
# Please issue `finish` to step out of it
|
1286
|
+
|
1287
|
+
original_method.bind_call(self, arg0, &blk)
|
1288
|
+
end
|
1289
|
+
end
|
1290
|
+
|
1291
|
+
def self.create_validator_method_skip_return_medium2(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type)
|
1292
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, &blk|
|
1293
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
1294
|
+
unless arg0_type.valid?(arg0)
|
1295
|
+
CallValidation.report_error(
|
1296
|
+
method_sig,
|
1297
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
1298
|
+
'Parameter',
|
1299
|
+
method_sig.arg_types[0][0],
|
1300
|
+
arg0_type,
|
1301
|
+
arg0,
|
1302
|
+
caller_offset: -1
|
1303
|
+
)
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
unless arg1_type.valid?(arg1)
|
1307
|
+
CallValidation.report_error(
|
1308
|
+
method_sig,
|
1309
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
1310
|
+
'Parameter',
|
1311
|
+
method_sig.arg_types[1][0],
|
1312
|
+
arg1_type,
|
1313
|
+
arg1,
|
1314
|
+
caller_offset: -1
|
1315
|
+
)
|
1316
|
+
end
|
1317
|
+
|
1318
|
+
# The following line breaks are intentional to show nice pry message
|
1319
|
+
|
1320
|
+
|
1321
|
+
|
1322
|
+
|
1323
|
+
|
1324
|
+
|
1325
|
+
|
1326
|
+
|
1327
|
+
|
1328
|
+
|
1329
|
+
# PRY note:
|
1330
|
+
# this code is sig validation code.
|
1331
|
+
# Please issue `finish` to step out of it
|
1332
|
+
|
1333
|
+
original_method.bind_call(self, arg0, arg1, &blk)
|
1334
|
+
end
|
1335
|
+
end
|
1336
|
+
|
1337
|
+
def self.create_validator_method_skip_return_medium3(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type, arg2_type)
|
1338
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, arg2, &blk|
|
1339
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
1340
|
+
unless arg0_type.valid?(arg0)
|
1341
|
+
CallValidation.report_error(
|
1342
|
+
method_sig,
|
1343
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
1344
|
+
'Parameter',
|
1345
|
+
method_sig.arg_types[0][0],
|
1346
|
+
arg0_type,
|
1347
|
+
arg0,
|
1348
|
+
caller_offset: -1
|
1349
|
+
)
|
1350
|
+
end
|
1351
|
+
|
1352
|
+
unless arg1_type.valid?(arg1)
|
1353
|
+
CallValidation.report_error(
|
1354
|
+
method_sig,
|
1355
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
1356
|
+
'Parameter',
|
1357
|
+
method_sig.arg_types[1][0],
|
1358
|
+
arg1_type,
|
1359
|
+
arg1,
|
1360
|
+
caller_offset: -1
|
1361
|
+
)
|
1362
|
+
end
|
1363
|
+
|
1364
|
+
unless arg2_type.valid?(arg2)
|
1365
|
+
CallValidation.report_error(
|
1366
|
+
method_sig,
|
1367
|
+
method_sig.arg_types[2][1].error_message_for_obj(arg2),
|
1368
|
+
'Parameter',
|
1369
|
+
method_sig.arg_types[2][0],
|
1370
|
+
arg2_type,
|
1371
|
+
arg2,
|
1372
|
+
caller_offset: -1
|
1373
|
+
)
|
1374
|
+
end
|
1375
|
+
|
1376
|
+
# The following line breaks are intentional to show nice pry message
|
1377
|
+
|
1378
|
+
|
1379
|
+
|
1380
|
+
|
1381
|
+
|
1382
|
+
|
1383
|
+
|
1384
|
+
|
1385
|
+
|
1386
|
+
|
1387
|
+
# PRY note:
|
1388
|
+
# this code is sig validation code.
|
1389
|
+
# Please issue `finish` to step out of it
|
1390
|
+
|
1391
|
+
original_method.bind_call(self, arg0, arg1, arg2, &blk)
|
1392
|
+
end
|
1393
|
+
end
|
1394
|
+
|
1395
|
+
def self.create_validator_method_skip_return_medium4(mod, original_method, method_sig, original_visibility, arg0_type, arg1_type, arg2_type, arg3_type)
|
1396
|
+
T::Private::ClassUtils.def_with_visibility(mod, method_sig.method_name, original_visibility) do |arg0, arg1, arg2, arg3, &blk|
|
1397
|
+
# This method is a manually sped-up version of more general code in `validate_call`
|
1398
|
+
unless arg0_type.valid?(arg0)
|
1399
|
+
CallValidation.report_error(
|
1400
|
+
method_sig,
|
1401
|
+
method_sig.arg_types[0][1].error_message_for_obj(arg0),
|
1402
|
+
'Parameter',
|
1403
|
+
method_sig.arg_types[0][0],
|
1404
|
+
arg0_type,
|
1405
|
+
arg0,
|
1406
|
+
caller_offset: -1
|
1407
|
+
)
|
1408
|
+
end
|
1409
|
+
|
1410
|
+
unless arg1_type.valid?(arg1)
|
1411
|
+
CallValidation.report_error(
|
1412
|
+
method_sig,
|
1413
|
+
method_sig.arg_types[1][1].error_message_for_obj(arg1),
|
1414
|
+
'Parameter',
|
1415
|
+
method_sig.arg_types[1][0],
|
1416
|
+
arg1_type,
|
1417
|
+
arg1,
|
1418
|
+
caller_offset: -1
|
1419
|
+
)
|
1420
|
+
end
|
1421
|
+
|
1422
|
+
unless arg2_type.valid?(arg2)
|
1423
|
+
CallValidation.report_error(
|
1424
|
+
method_sig,
|
1425
|
+
method_sig.arg_types[2][1].error_message_for_obj(arg2),
|
1426
|
+
'Parameter',
|
1427
|
+
method_sig.arg_types[2][0],
|
1428
|
+
arg2_type,
|
1429
|
+
arg2,
|
1430
|
+
caller_offset: -1
|
1431
|
+
)
|
1432
|
+
end
|
1433
|
+
|
1434
|
+
unless arg3_type.valid?(arg3)
|
1435
|
+
CallValidation.report_error(
|
1436
|
+
method_sig,
|
1437
|
+
method_sig.arg_types[3][1].error_message_for_obj(arg3),
|
1438
|
+
'Parameter',
|
1439
|
+
method_sig.arg_types[3][0],
|
1440
|
+
arg3_type,
|
1441
|
+
arg3,
|
1442
|
+
caller_offset: -1
|
1443
|
+
)
|
1444
|
+
end
|
1445
|
+
|
1446
|
+
# The following line breaks are intentional to show nice pry message
|
1447
|
+
|
1448
|
+
|
1449
|
+
|
1450
|
+
|
1451
|
+
|
1452
|
+
|
1453
|
+
|
1454
|
+
|
1455
|
+
|
1456
|
+
|
1457
|
+
# PRY note:
|
1458
|
+
# this code is sig validation code.
|
1459
|
+
# Please issue `finish` to step out of it
|
1460
|
+
|
1461
|
+
original_method.bind_call(self, arg0, arg1, arg2, arg3, &blk)
|
1462
|
+
end
|
1463
|
+
end
|
1464
|
+
|
947
1465
|
def self.create_validator_procedure_medium(mod, original_method, method_sig, original_visibility)
|
948
1466
|
# trampoline to reduce stack frame size
|
949
1467
|
arg_types = method_sig.arg_types
|
@@ -101,7 +101,7 @@ module T::Private::Methods
|
|
101
101
|
if !decl.checked.equal?(ARG_NOT_PROVIDED)
|
102
102
|
raise BuilderError.new("You can't call .checked multiple times in a signature.")
|
103
103
|
end
|
104
|
-
if
|
104
|
+
if level == :never && !decl.on_failure.equal?(ARG_NOT_PROVIDED)
|
105
105
|
raise BuilderError.new("You can't use .checked(:#{level}) with .on_failure because .on_failure will have no effect.")
|
106
106
|
end
|
107
107
|
if !T::Private::RuntimeLevels::LEVELS.include?(level)
|
@@ -119,7 +119,7 @@ module T::Private::Methods
|
|
119
119
|
if !decl.on_failure.equal?(ARG_NOT_PROVIDED)
|
120
120
|
raise BuilderError.new("You can't call .on_failure multiple times in a signature.")
|
121
121
|
end
|
122
|
-
if decl.checked == :never
|
122
|
+
if decl.checked == :never
|
123
123
|
raise BuilderError.new("You can't use .on_failure with .checked(:#{decl.checked}) because .on_failure will have no effect.")
|
124
124
|
end
|
125
125
|
|
@@ -183,7 +183,7 @@ module T::Private::Methods
|
|
183
183
|
self
|
184
184
|
end
|
185
185
|
|
186
|
-
# Declares valid type
|
186
|
+
# Declares valid type parameters which can be used with `T.type_parameter` in
|
187
187
|
# this `sig`.
|
188
188
|
#
|
189
189
|
# This is used for generic methods. Example usage:
|
@@ -222,7 +222,7 @@ module T::Private::Methods
|
|
222
222
|
end
|
223
223
|
if decl.checked.equal?(ARG_NOT_PROVIDED)
|
224
224
|
default_checked_level = T::Private::RuntimeLevels.default_checked_level
|
225
|
-
if
|
225
|
+
if default_checked_level == :never && !decl.on_failure.equal?(ARG_NOT_PROVIDED)
|
226
226
|
raise BuilderError.new("To use .on_failure you must additionally call .checked(:tests) or .checked(:always), otherwise, the .on_failure has no effect.")
|
227
227
|
end
|
228
228
|
decl.checked = default_checked_level
|
@@ -73,8 +73,7 @@ class T::Private::Methods::Signature
|
|
73
73
|
param_names = parameters.map {|_, name| name}
|
74
74
|
missing_names = param_names - raw_arg_types.keys
|
75
75
|
raise "The declaration for `#{method.name}` is missing parameter(s): #{missing_names.join(', ')}"
|
76
|
-
elsif parameters.length
|
77
|
-
else
|
76
|
+
elsif parameters.length != raw_arg_types.size
|
78
77
|
param_names = parameters.map {|_, name| name}
|
79
78
|
has_extra_names = parameters.count {|_, name| raw_arg_types.key?(name)} < raw_arg_types.size
|
80
79
|
if has_extra_names
|
@@ -245,6 +244,15 @@ class T::Private::Methods::Signature
|
|
245
244
|
"#{@method} at #{loc}"
|
246
245
|
end
|
247
246
|
|
247
|
+
def force_type_init
|
248
|
+
@arg_types.each {|_, type| type.build_type}
|
249
|
+
@kwarg_types.each {|_, type| type.build_type}
|
250
|
+
@block_type&.build_type
|
251
|
+
@rest_type&.build_type
|
252
|
+
@keyrest_type&.build_type
|
253
|
+
@return_type.build_type
|
254
|
+
end
|
255
|
+
|
248
256
|
EMPTY_LIST = [].freeze
|
249
257
|
EMPTY_HASH = {}.freeze
|
250
258
|
end
|
@@ -59,10 +59,9 @@ module T::Private::Methods::SignatureValidation
|
|
59
59
|
# `{ new(): AbstractClass }`. We may want to consider building some
|
60
60
|
# analogue to `T.class_of` in the future that works like this `{new():
|
61
61
|
# ...}` type.
|
62
|
-
if signature.method_name == :initialize && signature.method.owner.is_a?(Class)
|
63
|
-
|
64
|
-
|
65
|
-
end
|
62
|
+
if signature.method_name == :initialize && signature.method.owner.is_a?(Class) &&
|
63
|
+
signature.mode == Modes.standard
|
64
|
+
return
|
66
65
|
end
|
67
66
|
|
68
67
|
super_method = signature.method.super_method
|
@@ -151,7 +150,7 @@ module T::Private::Methods::SignatureValidation
|
|
151
150
|
# This is a one-off hack, and we should think carefully before adding more methods here.
|
152
151
|
nil
|
153
152
|
else
|
154
|
-
raise "You marked `#{signature.method_name}` as #{pretty_mode(signature)}, but that method doesn't already exist in this class/module to be
|
153
|
+
raise "You marked `#{signature.method_name}` as #{pretty_mode(signature)}, but that method doesn't already exist in this class/module to be overridden.\n" \
|
155
154
|
" Either check for typos and for missing includes or super classes to make the parent method shows up\n" \
|
156
155
|
" ... or remove #{pretty_mode(signature)} here: #{method_loc_str(signature.method)}\n"
|
157
156
|
end
|
@@ -235,7 +234,7 @@ module T::Private::Methods::SignatureValidation
|
|
235
234
|
return if signature.override_allow_incompatible
|
236
235
|
return if super_signature.mode == Modes.untyped
|
237
236
|
return unless [signature, super_signature].all? do |sig|
|
238
|
-
sig.check_level == :always ||
|
237
|
+
sig.check_level == :always || (sig.check_level == :tests && T::Private::RuntimeLevels.check_tests?)
|
239
238
|
end
|
240
239
|
mode_noun = super_signature.mode == Modes.abstract ? 'implementation' : 'override'
|
241
240
|
|
@@ -262,7 +261,14 @@ module T::Private::Methods::SignatureValidation
|
|
262
261
|
end
|
263
262
|
|
264
263
|
# return types must be covariant
|
265
|
-
|
264
|
+
super_signature_return_type = super_signature.return_type
|
265
|
+
|
266
|
+
if super_signature_return_type == T::Private::Types::Void::Private::INSTANCE
|
267
|
+
# Treat `.void` as `T.anything` (see corresponding comment in definition_valitor for more)
|
268
|
+
super_signature_return_type = T::Types::Anything::Private::INSTANCE
|
269
|
+
end
|
270
|
+
|
271
|
+
if !signature.return_type.subtype_of?(super_signature_return_type)
|
266
272
|
raise "Incompatible return type in signature for #{mode_noun} of method `#{signature.method_name}`:\n" \
|
267
273
|
"* Base: `#{super_signature.return_type}` (in #{method_loc_str(super_signature.method)})\n" \
|
268
274
|
"* #{mode_noun.capitalize}: `#{signature.return_type}` (in #{method_loc_str(signature.method)})\n" \
|
@@ -12,9 +12,6 @@ module T::Private::RuntimeLevels
|
|
12
12
|
# Don't even validate in tests, b/c too expensive,
|
13
13
|
# or b/c we fully trust the static typing
|
14
14
|
:never,
|
15
|
-
# Validate the sig when the file is using the Sorbet Compiler.
|
16
|
-
# Behaves like :never when interpreted.
|
17
|
-
:compiled,
|
18
15
|
].freeze
|
19
16
|
|
20
17
|
@check_tests = false
|
data/lib/types/private/sealed.rb
CHANGED
@@ -5,8 +5,8 @@ module T::Private::Sealed
|
|
5
5
|
module NoInherit
|
6
6
|
def inherited(child)
|
7
7
|
super
|
8
|
-
|
9
|
-
T::Private::Sealed.validate_inheritance(
|
8
|
+
caller_loc = T::Private::CallerUtils.find_caller {|loc| loc.base_label != 'inherited'}
|
9
|
+
T::Private::Sealed.validate_inheritance(caller_loc, self, child, 'inherited')
|
10
10
|
@sorbet_sealed_module_all_subclasses << child
|
11
11
|
end
|
12
12
|
|
@@ -22,15 +22,15 @@ module T::Private::Sealed
|
|
22
22
|
module NoIncludeExtend
|
23
23
|
def included(child)
|
24
24
|
super
|
25
|
-
|
26
|
-
T::Private::Sealed.validate_inheritance(
|
25
|
+
caller_loc = T::Private::CallerUtils.find_caller {|loc| !loc.to_s.match(/in `included'$/)}
|
26
|
+
T::Private::Sealed.validate_inheritance(caller_loc, self, child, 'included')
|
27
27
|
@sorbet_sealed_module_all_subclasses << child
|
28
28
|
end
|
29
29
|
|
30
30
|
def extended(child)
|
31
31
|
super
|
32
|
-
|
33
|
-
T::Private::Sealed.validate_inheritance(
|
32
|
+
caller_loc = T::Private::CallerUtils.find_caller {|loc| !loc.to_s.match(/in `extended'$/)}
|
33
|
+
T::Private::Sealed.validate_inheritance(caller_loc, self, child, 'extended')
|
34
34
|
@sorbet_sealed_module_all_subclasses << child
|
35
35
|
end
|
36
36
|
|
@@ -68,8 +68,8 @@ module T::Private::Sealed
|
|
68
68
|
mod.instance_variable_defined?(:@sorbet_sealed_module_decl_file)
|
69
69
|
end
|
70
70
|
|
71
|
-
def self.validate_inheritance(
|
72
|
-
this_file =
|
71
|
+
def self.validate_inheritance(caller_loc, parent, child, verb)
|
72
|
+
this_file = caller_loc&.path
|
73
73
|
decl_file = parent.instance_variable_get(:@sorbet_sealed_module_decl_file) if sealed_module?(parent)
|
74
74
|
|
75
75
|
if !this_file
|