steep 1.2.1 → 1.3.0.pre.1
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 +16 -0
- data/Gemfile.lock +4 -4
- data/Gemfile.steep +1 -1
- data/Gemfile.steep.lock +13 -3
- data/Steepfile +0 -1
- data/lib/steep/annotation_parser.rb +34 -28
- data/lib/steep/ast/annotation.rb +16 -5
- data/lib/steep/ast/node/type_application.rb +74 -0
- data/lib/steep/ast/node/type_assertion.rb +56 -0
- data/lib/steep/ast/types/factory.rb +5 -1
- data/lib/steep/diagnostic/helper.rb +2 -1
- data/lib/steep/diagnostic/lsp_formatter.rb +3 -1
- data/lib/steep/diagnostic/ruby.rb +70 -5
- data/lib/steep/diagnostic/signature.rb +21 -8
- data/lib/steep/drivers/check.rb +1 -1
- data/lib/steep/drivers/checkfile.rb +1 -1
- data/lib/steep/drivers/langserver.rb +2 -2
- data/lib/steep/drivers/stats.rb +1 -1
- data/lib/steep/drivers/watch.rb +1 -1
- data/lib/steep/drivers/worker.rb +0 -1
- data/lib/steep/server/lsp_formatter.rb +13 -3
- data/lib/steep/server/master.rb +4 -1
- data/lib/steep/server/worker_process.rb +86 -14
- data/lib/steep/services/hover_provider/rbs.rb +7 -7
- data/lib/steep/services/hover_provider/ruby.rb +19 -4
- data/lib/steep/services/signature_service.rb +7 -4
- data/lib/steep/signature/validator.rb +36 -13
- data/lib/steep/source.rb +189 -71
- data/lib/steep/type_construction.rb +232 -126
- data/lib/steep/type_inference/logic_type_interpreter.rb +3 -1
- data/lib/steep/version.rb +1 -1
- data/lib/steep.rb +2 -0
- data/rbs_collection.steep.lock.yaml +27 -10
- data/rbs_collection.steep.yaml +0 -1
- data/sig/shims/exception.rbs +4 -0
- data/sig/shims/parser/comment.rbs +33 -0
- data/sig/shims/parser.rbs +30 -2
- data/sig/steep/annotation_parser.rbs +59 -0
- data/sig/steep/ast/annotation.rbs +21 -26
- data/sig/steep/ast/node/type_application.rbs +31 -0
- data/sig/steep/ast/node/type_assertion.rbs +26 -0
- data/sig/steep/ast/types/factory.rbs +0 -2
- data/sig/steep/diagnostic/helper.rbs +9 -3
- data/sig/steep/diagnostic/lsp_formatter.rbs +12 -8
- data/sig/steep/diagnostic/ruby.rbs +62 -8
- data/sig/steep/diagnostic/signature.rbs +118 -85
- data/sig/steep/drivers/worker.rbs +11 -13
- data/sig/steep/range_extension.rbs +7 -0
- data/sig/steep/server/lsp_formatter.rbs +14 -7
- data/sig/steep/server/worker_process.rbs +74 -12
- data/sig/steep/services/hover_provider/rbs.rbs +27 -7
- data/sig/steep/services/hover_provider/ruby.rbs +18 -4
- data/sig/steep/services/hover_provider/singleton_methods.rbs +1 -1
- data/sig/steep/signature/validator.rbs +76 -0
- data/sig/steep/source.rbs +54 -30
- data/sig/steep/type_construction.rbs +85 -27
- data/sig/steep/type_inference/method_call.rbs +1 -1
- data/smoke/diagnostics-rbs/inherit-module.rbs +2 -0
- data/smoke/diagnostics-rbs/test_expectations.yml +12 -0
- data/steep.gemspec +1 -1
- metadata +16 -6
@@ -52,10 +52,18 @@ module Steep
|
|
52
52
|
context.module_context
|
53
53
|
end
|
54
54
|
|
55
|
+
def module_context!
|
56
|
+
module_context or raise
|
57
|
+
end
|
58
|
+
|
55
59
|
def method_context
|
56
60
|
context.method_context
|
57
61
|
end
|
58
62
|
|
63
|
+
def method_context!
|
64
|
+
method_context or raise
|
65
|
+
end
|
66
|
+
|
59
67
|
def block_context
|
60
68
|
context.block_context
|
61
69
|
end
|
@@ -798,42 +806,6 @@ module Steep
|
|
798
806
|
end
|
799
807
|
end
|
800
808
|
|
801
|
-
when :send
|
802
|
-
yield_self do
|
803
|
-
if self_class?(node)
|
804
|
-
module_type = expand_alias(module_context.module_type)
|
805
|
-
type = if module_type.is_a?(AST::Types::Name::Singleton)
|
806
|
-
AST::Types::Name::Singleton.new(name: module_type.name)
|
807
|
-
else
|
808
|
-
module_type
|
809
|
-
end
|
810
|
-
|
811
|
-
add_typing(node, type: type)
|
812
|
-
else
|
813
|
-
type_send(node, send_node: node, block_params: nil, block_body: nil)
|
814
|
-
end
|
815
|
-
end
|
816
|
-
|
817
|
-
when :csend
|
818
|
-
yield_self do
|
819
|
-
send_type, constr =
|
820
|
-
if self_class?(node)
|
821
|
-
module_type = expand_alias(module_context.module_type)
|
822
|
-
type = if module_type.is_a?(AST::Types::Name::Singleton)
|
823
|
-
AST::Types::Name::Singleton.new(name: module_type.name)
|
824
|
-
else
|
825
|
-
module_type
|
826
|
-
end
|
827
|
-
add_typing(node, type: type).to_ary
|
828
|
-
else
|
829
|
-
type_send(node, send_node: node, block_params: nil, block_body: nil, unwrap: true).to_ary
|
830
|
-
end
|
831
|
-
|
832
|
-
constr
|
833
|
-
.update_type_env { context.type_env.join(constr.context.type_env, context.type_env) }
|
834
|
-
.add_typing(node, type: union_type(send_type, AST::Builtin.nil_type))
|
835
|
-
end
|
836
|
-
|
837
809
|
when :match_with_lvasgn
|
838
810
|
each_child_node(node) do |child|
|
839
811
|
synthesize(child)
|
@@ -907,14 +879,16 @@ module Steep
|
|
907
879
|
}
|
908
880
|
)
|
909
881
|
|
910
|
-
call, constr = type_method_call(
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
882
|
+
call, constr = type_method_call(
|
883
|
+
node,
|
884
|
+
receiver_type: self_type,
|
885
|
+
method_name: method_context.name,
|
886
|
+
method: super_method,
|
887
|
+
arguments: node.children,
|
888
|
+
block_params: nil,
|
889
|
+
block_body: nil,
|
890
|
+
tapp: nil
|
891
|
+
)
|
918
892
|
|
919
893
|
if call && constr
|
920
894
|
constr.add_call(call)
|
@@ -947,35 +921,6 @@ module Steep
|
|
947
921
|
end
|
948
922
|
end
|
949
923
|
|
950
|
-
when :block
|
951
|
-
yield_self do
|
952
|
-
send_node, params, body = node.children
|
953
|
-
if send_node.type == :lambda
|
954
|
-
type_lambda(node, params_node: params, body_node: body, type_hint: hint)
|
955
|
-
else
|
956
|
-
type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend)
|
957
|
-
end
|
958
|
-
end
|
959
|
-
|
960
|
-
when :numblock
|
961
|
-
yield_self do
|
962
|
-
send_node, max_num, body = node.children
|
963
|
-
|
964
|
-
if max_num == 1
|
965
|
-
arg_nodes = [Parser::AST::Node.new(:procarg0, [:_1])]
|
966
|
-
else
|
967
|
-
arg_nodes = max_num.times.map {|i| Parser::AST::Node.new(:arg, [:"_#{i+1}"]) }
|
968
|
-
end
|
969
|
-
|
970
|
-
params = Parser::AST::Node.new(:args, arg_nodes)
|
971
|
-
|
972
|
-
if send_node.type == :lambda
|
973
|
-
type_lambda(node, params_node: params, body_node: body, type_hint: hint)
|
974
|
-
else
|
975
|
-
type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend)
|
976
|
-
end
|
977
|
-
end
|
978
|
-
|
979
924
|
when :def
|
980
925
|
yield_self do
|
981
926
|
name, args_node, body_node = node.children
|
@@ -1547,9 +1492,9 @@ module Steep
|
|
1547
1492
|
|
1548
1493
|
constructor.synthesize(node.children[1]) if node.children[1]
|
1549
1494
|
|
1550
|
-
if constructor.module_context
|
1551
|
-
if constructor.module_context
|
1552
|
-
module_context
|
1495
|
+
if constructor.module_context!.instance_definition && module_context!.module_definition
|
1496
|
+
if constructor.module_context!.instance_definition.type_name == module_context!.module_definition.type_name
|
1497
|
+
module_context!.defined_module_methods.merge(constructor.module_context!.defined_instance_methods)
|
1553
1498
|
end
|
1554
1499
|
end
|
1555
1500
|
end
|
@@ -2446,6 +2391,41 @@ module Steep
|
|
2446
2391
|
|
2447
2392
|
add_typing node, type: AST::Builtin.any_type, constr: constr
|
2448
2393
|
|
2394
|
+
when :assertion
|
2395
|
+
yield_self do
|
2396
|
+
# @type var as_type: AST::Node::TypeAssertion
|
2397
|
+
asserted_node, as_type = node.children
|
2398
|
+
|
2399
|
+
if type = as_type.type?(module_context!.nesting, checker.factory, [])
|
2400
|
+
actual_type, constr = synthesize(asserted_node, hint: type)
|
2401
|
+
|
2402
|
+
if result = no_subtyping?(sub_type: type, super_type: actual_type)
|
2403
|
+
typing.add_error(
|
2404
|
+
Diagnostic::Ruby::FalseAssertion.new(
|
2405
|
+
node: node,
|
2406
|
+
assertion_type: type,
|
2407
|
+
node_type: actual_type
|
2408
|
+
)
|
2409
|
+
)
|
2410
|
+
end
|
2411
|
+
|
2412
|
+
constr.add_typing(node, type: type)
|
2413
|
+
else
|
2414
|
+
synthesize(asserted_node, hint: hint)
|
2415
|
+
end
|
2416
|
+
end
|
2417
|
+
|
2418
|
+
when :block, :numblock, :send, :csend
|
2419
|
+
synthesize_sendish(node, hint: hint, tapp: nil)
|
2420
|
+
|
2421
|
+
when :tapp
|
2422
|
+
yield_self do
|
2423
|
+
sendish, tapp = node.children
|
2424
|
+
type, constr = synthesize_sendish(sendish, hint: hint, tapp: tapp)
|
2425
|
+
|
2426
|
+
constr.add_typing(node, type: type)
|
2427
|
+
end
|
2428
|
+
|
2449
2429
|
else
|
2450
2430
|
typing.add_error(Diagnostic::Ruby::UnsupportedSyntax.new(node: node))
|
2451
2431
|
add_typing(node, type: AST::Builtin.any_type)
|
@@ -2481,6 +2461,74 @@ module Steep
|
|
2481
2461
|
end
|
2482
2462
|
end
|
2483
2463
|
|
2464
|
+
def synthesize_sendish(node, hint:, tapp:)
|
2465
|
+
case node.type
|
2466
|
+
when :send
|
2467
|
+
yield_self do
|
2468
|
+
if self_class?(node)
|
2469
|
+
module_type = expand_alias(module_context!.module_type)
|
2470
|
+
type = if module_type.is_a?(AST::Types::Name::Singleton)
|
2471
|
+
AST::Types::Name::Singleton.new(name: module_type.name)
|
2472
|
+
else
|
2473
|
+
module_type
|
2474
|
+
end
|
2475
|
+
|
2476
|
+
add_typing(node, type: type)
|
2477
|
+
else
|
2478
|
+
type_send(node, send_node: node, block_params: nil, block_body: nil, tapp: tapp)
|
2479
|
+
end
|
2480
|
+
end
|
2481
|
+
when :csend
|
2482
|
+
yield_self do
|
2483
|
+
send_type, constr =
|
2484
|
+
if self_class?(node)
|
2485
|
+
module_type = expand_alias(module_context!.module_type)
|
2486
|
+
type = if module_type.is_a?(AST::Types::Name::Singleton)
|
2487
|
+
AST::Types::Name::Singleton.new(name: module_type.name)
|
2488
|
+
else
|
2489
|
+
module_type
|
2490
|
+
end
|
2491
|
+
add_typing(node, type: type).to_ary
|
2492
|
+
else
|
2493
|
+
type_send(node, send_node: node, block_params: nil, block_body: nil, unwrap: true, tapp: tapp).to_ary
|
2494
|
+
end
|
2495
|
+
|
2496
|
+
constr
|
2497
|
+
.update_type_env { context.type_env.join(constr.context.type_env, context.type_env) }
|
2498
|
+
.add_typing(node, type: union_type(send_type, AST::Builtin.nil_type))
|
2499
|
+
end
|
2500
|
+
when :block
|
2501
|
+
yield_self do
|
2502
|
+
send_node, params, body = node.children
|
2503
|
+
if send_node.type == :lambda
|
2504
|
+
type_lambda(node, params_node: params, body_node: body, type_hint: hint)
|
2505
|
+
else
|
2506
|
+
type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend, tapp: tapp)
|
2507
|
+
end
|
2508
|
+
end
|
2509
|
+
when :numblock
|
2510
|
+
yield_self do
|
2511
|
+
send_node, max_num, body = node.children
|
2512
|
+
|
2513
|
+
if max_num == 1
|
2514
|
+
arg_nodes = [Parser::AST::Node.new(:procarg0, [:_1])]
|
2515
|
+
else
|
2516
|
+
arg_nodes = max_num.times.map {|i| Parser::AST::Node.new(:arg, [:"_#{i+1}"]) }
|
2517
|
+
end
|
2518
|
+
|
2519
|
+
params = Parser::AST::Node.new(:args, arg_nodes)
|
2520
|
+
|
2521
|
+
if send_node.type == :lambda
|
2522
|
+
type_lambda(node, params_node: params, body_node: body, type_hint: hint)
|
2523
|
+
else
|
2524
|
+
type_send(node, send_node: send_node, block_params: params, block_body: body, unwrap: send_node.type == :csend, tapp: tapp)
|
2525
|
+
end
|
2526
|
+
end
|
2527
|
+
else
|
2528
|
+
raise "Unexpected node is given to `#synthesize_sendish` (#{node.type}, #{node.location.first_line})"
|
2529
|
+
end
|
2530
|
+
end
|
2531
|
+
|
2484
2532
|
def masgn_lhs?(lhs)
|
2485
2533
|
lhs.children.all? do |a|
|
2486
2534
|
asgn_type = if a.type == :splat
|
@@ -2833,6 +2881,7 @@ module Steep
|
|
2833
2881
|
def synthesize_children(node, skips: [])
|
2834
2882
|
skips = Set.new.compare_by_identity.merge(skips)
|
2835
2883
|
|
2884
|
+
# @type var constr: TypeConstruction
|
2836
2885
|
constr = self
|
2837
2886
|
|
2838
2887
|
each_child_node(node) do |child|
|
@@ -2858,18 +2907,20 @@ module Steep
|
|
2858
2907
|
end
|
2859
2908
|
end
|
2860
2909
|
|
2861
|
-
def type_send_interface(node, interface:, receiver:, receiver_type:, method_name:, arguments:, block_params:, block_body:)
|
2910
|
+
def type_send_interface(node, interface:, receiver:, receiver_type:, method_name:, arguments:, block_params:, block_body:, tapp:)
|
2862
2911
|
method = interface&.methods&.[](method_name)
|
2863
2912
|
|
2864
2913
|
if method
|
2865
|
-
call, constr = type_method_call(
|
2866
|
-
|
2867
|
-
|
2868
|
-
|
2869
|
-
|
2870
|
-
|
2871
|
-
|
2872
|
-
|
2914
|
+
call, constr = type_method_call(
|
2915
|
+
node,
|
2916
|
+
method: method,
|
2917
|
+
method_name: method_name,
|
2918
|
+
arguments: arguments,
|
2919
|
+
block_params: block_params,
|
2920
|
+
block_body: block_body,
|
2921
|
+
receiver_type: receiver_type,
|
2922
|
+
tapp: tapp
|
2923
|
+
)
|
2873
2924
|
|
2874
2925
|
if call && constr
|
2875
2926
|
case method_name.to_s
|
@@ -2962,7 +3013,7 @@ module Steep
|
|
2962
3013
|
send_node = node.children[0]
|
2963
3014
|
case send_node.type
|
2964
3015
|
when :super, :zsuper
|
2965
|
-
method_name = method_context
|
3016
|
+
method_name = method_context!.name or raise
|
2966
3017
|
return fallback_to_any(send_node) do
|
2967
3018
|
Diagnostic::Ruby::UnexpectedSuper.new(node: send_node, method: method_name)
|
2968
3019
|
end
|
@@ -2981,8 +3032,9 @@ module Steep
|
|
2981
3032
|
end
|
2982
3033
|
end
|
2983
3034
|
|
2984
|
-
def type_send(node, send_node:, block_params:, block_body:, unwrap: false)
|
3035
|
+
def type_send(node, send_node:, block_params:, block_body:, unwrap: false, tapp:)
|
2985
3036
|
# @type var constr: TypeConstruction
|
3037
|
+
# @type var receiver: Parser::AST::Node?
|
2986
3038
|
|
2987
3039
|
case send_node.type
|
2988
3040
|
when :super, :zsuper
|
@@ -3042,7 +3094,8 @@ module Steep
|
|
3042
3094
|
method_name: method_name,
|
3043
3095
|
arguments: arguments,
|
3044
3096
|
block_params: block_params,
|
3045
|
-
block_body: block_body
|
3097
|
+
block_body: block_body,
|
3098
|
+
tapp: tapp
|
3046
3099
|
)
|
3047
3100
|
else
|
3048
3101
|
constr = constr.synthesize_children(node, skips: [receiver])
|
@@ -3064,8 +3117,8 @@ module Steep
|
|
3064
3117
|
def builder_config
|
3065
3118
|
Interface::Builder::Config.new(
|
3066
3119
|
self_type: self_type,
|
3067
|
-
class_type: module_context
|
3068
|
-
instance_type: module_context
|
3120
|
+
class_type: module_context!.module_type,
|
3121
|
+
instance_type: module_context!.instance_type,
|
3069
3122
|
variable_bounds: variable_context.upper_bounds
|
3070
3123
|
)
|
3071
3124
|
end
|
@@ -3113,6 +3166,7 @@ module Steep
|
|
3113
3166
|
# compact
|
3114
3167
|
return_type = method_type.type.return_type
|
3115
3168
|
if AST::Builtin::Array.instance_type?(return_type)
|
3169
|
+
# @type var return_type: AST::Types::Name::Instance
|
3116
3170
|
elem = return_type.args[0]
|
3117
3171
|
type = AST::Builtin::Array.instance_type(unwrap(elem))
|
3118
3172
|
|
@@ -3120,7 +3174,7 @@ module Steep
|
|
3120
3174
|
call = TypeInference::MethodCall::Special.new(
|
3121
3175
|
node: node,
|
3122
3176
|
context: constr.context.method_context,
|
3123
|
-
method_name: decl.method_name,
|
3177
|
+
method_name: decl.method_name.method_name,
|
3124
3178
|
receiver_type: receiver_type,
|
3125
3179
|
actual_method_type: method_type.with(type: method_type.type.with(return_type: type)),
|
3126
3180
|
return_type: type,
|
@@ -3135,6 +3189,7 @@ module Steep
|
|
3135
3189
|
# compact
|
3136
3190
|
return_type = method_type.type.return_type
|
3137
3191
|
if AST::Builtin::Hash.instance_type?(return_type)
|
3192
|
+
# @type var return_type: AST::Types::Name::Instance
|
3138
3193
|
key = return_type.args[0]
|
3139
3194
|
value = return_type.args[1]
|
3140
3195
|
type = AST::Builtin::Hash.instance_type(key, unwrap(value))
|
@@ -3143,7 +3198,7 @@ module Steep
|
|
3143
3198
|
call = TypeInference::MethodCall::Special.new(
|
3144
3199
|
node: node,
|
3145
3200
|
context: constr.context.method_context,
|
3146
|
-
method_name: decl.method_name,
|
3201
|
+
method_name: decl.method_name.method_name,
|
3147
3202
|
receiver_type: receiver_type,
|
3148
3203
|
actual_method_type: method_type.with(type: method_type.type.with(return_type: type)),
|
3149
3204
|
return_type: type,
|
@@ -3158,7 +3213,7 @@ module Steep
|
|
3158
3213
|
nil
|
3159
3214
|
end
|
3160
3215
|
|
3161
|
-
def type_method_call(node, method_name:, receiver_type:, method:, arguments:, block_params:, block_body:,
|
3216
|
+
def type_method_call(node, method_name:, receiver_type:, method:, arguments:, block_params:, block_body:, tapp:)
|
3162
3217
|
node_range = node.loc.expression.yield_self {|l| l.begin_pos..l.end_pos }
|
3163
3218
|
|
3164
3219
|
results = method.method_types.map do |method_type|
|
@@ -3182,39 +3237,26 @@ module Steep
|
|
3182
3237
|
arguments: arguments,
|
3183
3238
|
block_params: block_params,
|
3184
3239
|
block_body: block_body,
|
3185
|
-
|
3240
|
+
tapp: tapp
|
3186
3241
|
)
|
3187
3242
|
end
|
3188
3243
|
end
|
3189
3244
|
end
|
3190
3245
|
|
3191
3246
|
case
|
3192
|
-
when results.
|
3193
|
-
|
3194
|
-
|
3195
|
-
set.merge(method_type.method_decls)
|
3196
|
-
end
|
3197
|
-
|
3198
|
-
error = Diagnostic::Ruby::IncompatibleArguments.new(node: node, method_name: method_name, receiver_type: receiver_type, method_types: method.method_types)
|
3199
|
-
call = TypeInference::MethodCall::Error.new(
|
3200
|
-
node: node,
|
3201
|
-
context: context.method_context,
|
3202
|
-
method_name: method_name,
|
3203
|
-
receiver_type: receiver_type,
|
3204
|
-
return_type: method_type.type.return_type,
|
3205
|
-
errors: [error],
|
3206
|
-
method_decls: all_decls
|
3207
|
-
)
|
3208
|
-
constr = self.with_new_typing(typing.new_child(node_range))
|
3247
|
+
when results.one?
|
3248
|
+
# There is only one overload, use the type checking result
|
3249
|
+
call, constr = results[0]
|
3209
3250
|
when (call, constr = results.find {|call, _| call.is_a?(TypeInference::MethodCall::Typed) })
|
3210
|
-
#
|
3251
|
+
# Successfully type checked with one of the overloads
|
3211
3252
|
else
|
3212
|
-
|
3213
|
-
|
3214
|
-
else
|
3215
|
-
return
|
3216
|
-
end
|
3253
|
+
# No suitable overload, more than one overlodas
|
3254
|
+
return
|
3217
3255
|
end
|
3256
|
+
|
3257
|
+
constr or raise
|
3258
|
+
call or raise
|
3259
|
+
|
3218
3260
|
constr.typing.save!
|
3219
3261
|
|
3220
3262
|
[
|
@@ -3367,12 +3409,78 @@ module Steep
|
|
3367
3409
|
constr
|
3368
3410
|
end
|
3369
3411
|
|
3370
|
-
def try_method_type(node, receiver_type:, method_name:, method_type:, arguments:, block_params:, block_body:,
|
3371
|
-
type_params, instantiation = Interface::TypeParam.rename(method_type.type_params)
|
3372
|
-
type_param_names = type_params.map(&:name)
|
3373
|
-
|
3412
|
+
def try_method_type(node, receiver_type:, method_name:, method_type:, arguments:, block_params:, block_body:, tapp:)
|
3374
3413
|
constr = self
|
3375
3414
|
|
3415
|
+
if tapp && type_args = tapp.types?(module_context!.nesting, checker.factory, [])
|
3416
|
+
type_arity = method_type.type_params.size
|
3417
|
+
type_param_names = method_type.type_params.map(&:name)
|
3418
|
+
|
3419
|
+
# Explicit type application
|
3420
|
+
if type_args.size == type_arity
|
3421
|
+
# @type var args_: Array[AST::Types::t]
|
3422
|
+
args_ = []
|
3423
|
+
|
3424
|
+
type_args.each_with_index do |type, index|
|
3425
|
+
param = method_type.type_params[index]
|
3426
|
+
if param.upper_bound
|
3427
|
+
if result = no_subtyping?(sub_type: type, super_type: param.upper_bound)
|
3428
|
+
args_ << AST::Builtin.any_type
|
3429
|
+
constr.typing.add_error(
|
3430
|
+
Diagnostic::Ruby::TypeArgumentMismatchError.new(
|
3431
|
+
type_arg: type,
|
3432
|
+
type_param: param,
|
3433
|
+
result: result
|
3434
|
+
)
|
3435
|
+
)
|
3436
|
+
else
|
3437
|
+
args_ << type
|
3438
|
+
end
|
3439
|
+
else
|
3440
|
+
args_ << type
|
3441
|
+
end
|
3442
|
+
end
|
3443
|
+
|
3444
|
+
method_type = method_type.instantiate(Interface::Substitution.build(type_param_names, args_))
|
3445
|
+
else
|
3446
|
+
if type_args.size > type_arity
|
3447
|
+
type_args.drop(type_arity).each do |type_arg|
|
3448
|
+
constr.typing.add_error(
|
3449
|
+
Diagnostic::Ruby::UnexpectedTypeArgument.new(
|
3450
|
+
type_arg: type_arg,
|
3451
|
+
method_type: method_type
|
3452
|
+
)
|
3453
|
+
)
|
3454
|
+
end
|
3455
|
+
end
|
3456
|
+
|
3457
|
+
if type_args.size < type_arity
|
3458
|
+
constr.typing.add_error(
|
3459
|
+
Diagnostic::Ruby::InsufficientTypeArgument.new(
|
3460
|
+
node: tapp.node,
|
3461
|
+
type_args: type_args,
|
3462
|
+
method_type: method_type
|
3463
|
+
)
|
3464
|
+
)
|
3465
|
+
end
|
3466
|
+
|
3467
|
+
method_type = method_type.instantiate(
|
3468
|
+
Interface::Substitution.build(
|
3469
|
+
type_param_names,
|
3470
|
+
Array.new(type_param_names.size, AST::Builtin.any_type)
|
3471
|
+
)
|
3472
|
+
)
|
3473
|
+
end
|
3474
|
+
|
3475
|
+
type_params = []
|
3476
|
+
type_param_names.clear
|
3477
|
+
else
|
3478
|
+
# Infer type application
|
3479
|
+
type_params, instantiation = Interface::TypeParam.rename(method_type.type_params)
|
3480
|
+
type_param_names = type_params.map(&:name)
|
3481
|
+
method_type = method_type.instantiate(instantiation)
|
3482
|
+
end
|
3483
|
+
|
3376
3484
|
constr = constr.with(
|
3377
3485
|
context: context.with(
|
3378
3486
|
variable_context: TypeInference::Context::TypeVariableContext.new(
|
@@ -3382,14 +3490,12 @@ module Steep
|
|
3382
3490
|
)
|
3383
3491
|
)
|
3384
3492
|
|
3385
|
-
method_type = method_type.instantiate(instantiation)
|
3386
|
-
|
3387
3493
|
variance = Subtyping::VariableVariance.from_method_type(method_type)
|
3388
3494
|
constraints = Subtyping::Constraints.new(unknowns: type_params.map(&:name))
|
3389
3495
|
ccontext = Subtyping::Constraints::Context.new(
|
3390
3496
|
self_type: self_type,
|
3391
|
-
instance_type: module_context
|
3392
|
-
class_type: module_context
|
3497
|
+
instance_type: module_context!.instance_type,
|
3498
|
+
class_type: module_context!.module_type,
|
3393
3499
|
variance: variance
|
3394
3500
|
)
|
3395
3501
|
|
@@ -3576,7 +3682,7 @@ module Steep
|
|
3576
3682
|
|
3577
3683
|
case node.children[0].type
|
3578
3684
|
when :super, :zsuper
|
3579
|
-
unless method_context
|
3685
|
+
unless method_context!.super_method
|
3580
3686
|
errors << Diagnostic::Ruby::UnexpectedSuper.new(
|
3581
3687
|
node: node.children[0],
|
3582
3688
|
method: method_name
|
@@ -134,7 +134,9 @@ module Steep
|
|
134
134
|
assignments = masgn.expand(lhs, rhs_type_converted, false)
|
135
135
|
end
|
136
136
|
|
137
|
-
assignments
|
137
|
+
unless assignments
|
138
|
+
raise "Multiple assignment rhs doesn't look correct: #{rhs_type.to_s} (#{assignment_node.location.expression&.source_line})"
|
139
|
+
end
|
138
140
|
|
139
141
|
assignments.each do |pair|
|
140
142
|
node, type = pair
|
data/lib/steep/version.rb
CHANGED
data/lib/steep.rb
CHANGED
@@ -50,6 +50,8 @@ require "steep/ast/types/record"
|
|
50
50
|
require "steep/ast/types/logic"
|
51
51
|
require "steep/ast/annotation"
|
52
52
|
require "steep/ast/annotation/collection"
|
53
|
+
require "steep/ast/node/type_assertion"
|
54
|
+
require "steep/ast/node/type_application"
|
53
55
|
require "steep/ast/builtin"
|
54
56
|
require "steep/ast/types/factory"
|
55
57
|
|
@@ -10,6 +10,10 @@ gems:
|
|
10
10
|
version: '0'
|
11
11
|
source:
|
12
12
|
type: stdlib
|
13
|
+
- name: rbs
|
14
|
+
version: 2.8.0.pre.1
|
15
|
+
source:
|
16
|
+
type: rubygems
|
13
17
|
- name: dbm
|
14
18
|
version: '0'
|
15
19
|
source:
|
@@ -19,7 +23,7 @@ gems:
|
|
19
23
|
source:
|
20
24
|
type: git
|
21
25
|
name: ruby/gem_rbs_collection
|
22
|
-
revision:
|
26
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
23
27
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
24
28
|
repo_dir: gems
|
25
29
|
- name: ast
|
@@ -27,7 +31,7 @@ gems:
|
|
27
31
|
source:
|
28
32
|
type: git
|
29
33
|
name: ruby/gem_rbs_collection
|
30
|
-
revision:
|
34
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
31
35
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
32
36
|
repo_dir: gems
|
33
37
|
- name: csv
|
@@ -43,7 +47,7 @@ gems:
|
|
43
47
|
source:
|
44
48
|
type: git
|
45
49
|
name: ruby/gem_rbs_collection
|
46
|
-
revision:
|
50
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
47
51
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
48
52
|
repo_dir: gems
|
49
53
|
- name: json
|
@@ -55,7 +59,7 @@ gems:
|
|
55
59
|
source:
|
56
60
|
type: git
|
57
61
|
name: ruby/gem_rbs_collection
|
58
|
-
revision:
|
62
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
59
63
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
60
64
|
repo_dir: gems
|
61
65
|
- name: logger
|
@@ -71,7 +75,7 @@ gems:
|
|
71
75
|
source:
|
72
76
|
type: git
|
73
77
|
name: ruby/gem_rbs_collection
|
74
|
-
revision:
|
78
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
75
79
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
76
80
|
repo_dir: gems
|
77
81
|
- name: rainbow
|
@@ -79,7 +83,7 @@ gems:
|
|
79
83
|
source:
|
80
84
|
type: git
|
81
85
|
name: ruby/gem_rbs_collection
|
82
|
-
revision:
|
86
|
+
revision: 94fcc911186b127cffdfd7a378b5e0b511196089
|
83
87
|
remote: https://github.com/ruby/gem_rbs_collection.git
|
84
88
|
repo_dir: gems
|
85
89
|
- name: securerandom
|
@@ -90,6 +94,22 @@ gems:
|
|
90
94
|
version: '0'
|
91
95
|
source:
|
92
96
|
type: stdlib
|
97
|
+
- name: pathname
|
98
|
+
version: '0'
|
99
|
+
source:
|
100
|
+
type: stdlib
|
101
|
+
- name: optparse
|
102
|
+
version: '0'
|
103
|
+
source:
|
104
|
+
type: stdlib
|
105
|
+
- name: tsort
|
106
|
+
version: '0'
|
107
|
+
source:
|
108
|
+
type: stdlib
|
109
|
+
- name: rdoc
|
110
|
+
version: '0'
|
111
|
+
source:
|
112
|
+
type: stdlib
|
93
113
|
- name: monitor
|
94
114
|
version: '0'
|
95
115
|
source:
|
@@ -110,11 +130,8 @@ gems:
|
|
110
130
|
version: '0'
|
111
131
|
source:
|
112
132
|
type: stdlib
|
113
|
-
- name: pathname
|
114
|
-
version: '0'
|
115
|
-
source:
|
116
|
-
type: stdlib
|
117
133
|
- name: forwardable
|
118
134
|
version: '0'
|
119
135
|
source:
|
120
136
|
type: stdlib
|
137
|
+
gemfile_lock_path: Gemfile.steep.lock
|
data/rbs_collection.steep.yaml
CHANGED