steep 1.7.0.dev.3 → 1.7.0.dev.4

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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +12 -12
  3. data/doc/narrowing.md +1 -1
  4. data/doc/shape.md +176 -0
  5. data/gemfile_steep/Gemfile.lock +5 -5
  6. data/lib/steep/ast/types/factory.rb +27 -18
  7. data/lib/steep/ast/types/proc.rb +14 -9
  8. data/lib/steep/interface/block.rb +1 -1
  9. data/lib/steep/interface/builder.rb +1 -0
  10. data/lib/steep/interface/function.rb +14 -6
  11. data/lib/steep/interface/method_type.rb +15 -7
  12. data/lib/steep/project/pattern.rb +1 -2
  13. data/lib/steep/server/interaction_worker.rb +6 -0
  14. data/lib/steep/server/lsp_formatter.rb +2 -0
  15. data/lib/steep/services/completion_provider.rb +1 -1
  16. data/lib/steep/services/file_loader.rb +15 -20
  17. data/lib/steep/services/signature_help_provider.rb +11 -9
  18. data/lib/steep/signature/validator.rb +1 -1
  19. data/lib/steep/subtyping/check.rb +15 -6
  20. data/lib/steep/subtyping/variable_variance.rb +3 -3
  21. data/lib/steep/type_construction.rb +185 -149
  22. data/lib/steep/type_inference/block_params.rb +1 -1
  23. data/lib/steep/type_inference/logic_type_interpreter.rb +2 -1
  24. data/lib/steep/type_inference/method_params.rb +16 -0
  25. data/lib/steep/type_inference/send_args.rb +5 -2
  26. data/lib/steep/version.rb +1 -1
  27. data/sig/steep/ast/types/factory.rbs +2 -2
  28. data/sig/steep/interface/builder.rbs +12 -53
  29. data/sig/steep/interface/function.rbs +5 -4
  30. data/sig/steep/services/signature_help_provider.rbs +1 -1
  31. data/sig/steep/subtyping/variable_variance.rbs +1 -1
  32. data/sig/steep/type_inference/block_params.rbs +1 -1
  33. data/sig/steep/type_inference/method_params.rbs +3 -3
  34. data/steep.gemspec +1 -1
  35. metadata +5 -4
@@ -850,8 +850,10 @@ module Steep
850
850
  relation.function!
851
851
 
852
852
  All(relation) do |result|
853
- result.add(relation.map {|fun| fun.params }) do |rel|
854
- check_method_params(name, rel)
853
+ if relation.sub_type.params && relation.super_type.params
854
+ result.add(relation.map {|fun| _ = fun.params }) do |rel|
855
+ check_method_params(name, rel)
856
+ end
855
857
  end
856
858
 
857
859
  result.add(relation.map {|fun| fun.return_type }) do |rel|
@@ -906,16 +908,23 @@ module Steep
906
908
  end
907
909
 
908
910
  def match_method_type_fails?(name, type1, type2)
909
- match_params(name, Relation(type1.type.params, type2.type.params)).tap do |param_pairs|
910
- return param_pairs unless param_pairs.is_a?(Array)
911
+ if type1.type.params && type2.type.params
912
+ match_params(name, Relation(type1.type.params, type2.type.params)).tap do |param_pairs|
913
+ return param_pairs unless param_pairs.is_a?(Array)
914
+ end
911
915
  end
912
916
 
913
917
  case result = expand_block_given(name, Relation(type1.block, type2.block))
914
918
  when Result::Base
915
919
  return result
916
920
  when Relation
917
- match_params(name, result.map {|m| m.type.params }).tap do |param_pairs|
918
- return param_pairs unless param_pairs.is_a?(Array)
921
+ type1.block or raise
922
+ type2.block or raise
923
+
924
+ if type1.block.type.params && type2.block.type.params
925
+ match_params(name, result.map {|m| _ = m.type.params }).tap do |param_pairs|
926
+ return param_pairs unless param_pairs.is_a?(Array)
927
+ end
919
928
  end
920
929
  end
921
930
 
@@ -46,7 +46,7 @@ module Steep
46
46
  end
47
47
 
48
48
  def self.add_params(params, block:, covariants:, contravariants:)
49
- params.each_type do |type|
49
+ params&.each_type do |type|
50
50
  add_type(type, variance: block ? :contravariant : :covariant, covariants: covariants, contravariants: contravariants)
51
51
  end
52
52
  end
@@ -64,12 +64,12 @@ module Steep
64
64
  contravariants << type.name
65
65
  end
66
66
  when AST::Types::Proc
67
- type.type.params.each_type do |type|
67
+ type.type.params&.each_type do |type|
68
68
  add_type(type, variance: variance, covariants: contravariants, contravariants: covariants)
69
69
  end
70
70
  add_type(type.type.return_type, variance: variance, covariants: covariants, contravariants: contravariants)
71
71
  if type.block
72
- type.block.type.params.each_type do |type|
72
+ type.block.type.params&.each_type do |type|
73
73
  add_type(type, variance: variance, covariants: covariants, contravariants: contravariants)
74
74
  end
75
75
  add_type(type.type.return_type, variance: variance, covariants: contravariants, contravariants: covariants)
@@ -1635,28 +1635,32 @@ module Steep
1635
1635
  when :yield
1636
1636
  if method_context && method_context.method_type
1637
1637
  if block_type = method_context.block_type
1638
- type = AST::Types::Proc.new(
1639
- type: block_type.type,
1640
- block: nil,
1641
- self_type: block_type.self_type
1642
- )
1643
- args = TypeInference::SendArgs.new(
1644
- node: node,
1645
- arguments: node.children,
1646
- type: type
1647
- )
1638
+ if block_type.type.params
1639
+ type = AST::Types::Proc.new(
1640
+ type: block_type.type,
1641
+ block: nil,
1642
+ self_type: block_type.self_type
1643
+ )
1644
+ args = TypeInference::SendArgs.new(
1645
+ node: node,
1646
+ arguments: node.children,
1647
+ type: type
1648
+ )
1648
1649
 
1649
- # @type var errors: Array[Diagnostic::Ruby::Base]
1650
- errors = []
1651
- constr = type_check_args(
1652
- nil,
1653
- args,
1654
- Subtyping::Constraints.new(unknowns: []),
1655
- errors
1656
- )
1650
+ # @type var errors: Array[Diagnostic::Ruby::Base]
1651
+ errors = []
1652
+ constr = type_check_args(
1653
+ nil,
1654
+ args,
1655
+ Subtyping::Constraints.new(unknowns: []),
1656
+ errors
1657
+ )
1657
1658
 
1658
- errors.each do |error|
1659
- typing.add_error(error)
1659
+ errors.each do |error|
1660
+ typing.add_error(error)
1661
+ end
1662
+ else
1663
+ constr = type_check_untyped_args(node.children)
1660
1664
  end
1661
1665
 
1662
1666
  add_typing(node, type: block_type.type.return_type)
@@ -2172,10 +2176,21 @@ module Steep
2172
2176
  var_type = AST::Builtin.any_type
2173
2177
  else
2174
2178
  if each = calculate_interface(collection_type, :each, private: true)
2175
- if method_type = (each.method_types || []).find {|type| type.block && type.block.type.params.first_param }
2179
+ method_type = (each.method_types || []).find do |type|
2180
+ if type.block
2181
+ if type.block.type.params
2182
+ type.block.type.params.first_param
2183
+ else
2184
+ true
2185
+ end
2186
+ end
2187
+ end
2188
+ if method_type
2176
2189
  if block = method_type.block
2177
- if first_param = block.type.params.first_param
2190
+ if first_param = block.type&.params&.first_param
2178
2191
  var_type = first_param.type #: AST::Types::t
2192
+ else
2193
+ var_type - AST::Builtin.any_type
2179
2194
  end
2180
2195
  end
2181
2196
  end
@@ -2386,31 +2401,33 @@ module Steep
2386
2401
 
2387
2402
  if hint.is_a?(AST::Types::Proc) && value_node.type == :sym
2388
2403
  if hint.one_arg?
2389
- # Assumes Symbol#to_proc implementation
2390
- param_type = hint.type.params.required[0]
2391
- case param_type
2392
- when AST::Types::Any
2393
- type = AST::Types::Any.new
2394
- else
2395
- if method = calculate_interface(param_type, private: true)&.methods&.[](value_node.children[0])
2396
- return_types = method.method_types.filter_map do |method_type|
2397
- if method_type.type.params.optional?
2398
- method_type.type.return_type
2404
+ if hint.type.params
2405
+ # Assumes Symbol#to_proc implementation
2406
+ param_type = hint.type.params.required[0]
2407
+ case param_type
2408
+ when AST::Types::Any
2409
+ type = AST::Types::Any.new
2410
+ else
2411
+ if method = calculate_interface(param_type, private: true)&.methods&.[](value_node.children[0])
2412
+ return_types = method.method_types.filter_map do |method_type|
2413
+ if method_type.type.params.nil? || method_type.type.params.optional?
2414
+ method_type.type.return_type
2415
+ end
2399
2416
  end
2400
- end
2401
2417
 
2402
- unless return_types.empty?
2403
- type = AST::Types::Proc.new(
2404
- type: Interface::Function.new(
2405
- params: Interface::Function::Params.empty.with_first_param(
2406
- Interface::Function::Params::PositionalParams::Required.new(param_type)
2418
+ unless return_types.empty?
2419
+ type = AST::Types::Proc.new(
2420
+ type: Interface::Function.new(
2421
+ params: Interface::Function::Params.empty.with_first_param(
2422
+ Interface::Function::Params::PositionalParams::Required.new(param_type)
2423
+ ),
2424
+ return_type: return_types[0],
2425
+ location: nil
2407
2426
  ),
2408
- return_type: return_types[0],
2409
- location: nil
2410
- ),
2411
- block: nil,
2412
- self_type: nil
2413
- )
2427
+ block: nil,
2428
+ self_type: nil
2429
+ )
2430
+ end
2414
2431
  end
2415
2432
  end
2416
2433
  end
@@ -3186,7 +3203,7 @@ module Steep
3186
3203
  end
3187
3204
 
3188
3205
  def type_send_interface(node, interface:, receiver:, receiver_type:, method_name:, arguments:, block_params:, block_body:, tapp:, hint:)
3189
- method = interface&.methods&.[](method_name)
3206
+ method = interface.methods[method_name]
3190
3207
 
3191
3208
  if method
3192
3209
  call, constr = type_method_call(
@@ -3915,13 +3932,17 @@ module Steep
3915
3932
  # @type var errors: Array[Diagnostic::Ruby::Base]
3916
3933
  errors = []
3917
3934
 
3918
- args = TypeInference::SendArgs.new(node: node, arguments: arguments, type: method_type)
3919
- constr = constr.type_check_args(
3920
- method_name,
3921
- args,
3922
- constraints,
3923
- errors
3924
- )
3935
+ if method_type.type.params
3936
+ args = TypeInference::SendArgs.new(node: node, arguments: arguments, type: method_type)
3937
+ constr = constr.type_check_args(
3938
+ method_name,
3939
+ args,
3940
+ constraints,
3941
+ errors
3942
+ )
3943
+ else
3944
+ constr = constr.type_check_untyped_args(arguments)
3945
+ end
3925
3946
 
3926
3947
  if block_params
3927
3948
  # block is given
@@ -4010,11 +4031,12 @@ module Steep
4010
4031
  end
4011
4032
 
4012
4033
  method_type, solved, s = apply_solution(errors, node: node, method_type: method_type) {
4013
- constraints.solution(
4014
- checker,
4015
- variables: method_type.type.params.free_variables + method_type.block.type.params.free_variables,
4016
- context: ccontext
4017
- )
4034
+ fvs_ = Set[] #: Set[AST::Types::variable]
4035
+
4036
+ fvs_.merge(method_type.type.params.free_variables) if method_type.type.params
4037
+ fvs_.merge(method_type.block.type.params.free_variables) if method_type.block.type.params
4038
+
4039
+ constraints.solution(checker, variables: fvs_, context: ccontext)
4018
4040
  }
4019
4041
 
4020
4042
  method_type.block or raise
@@ -4102,129 +4124,143 @@ module Steep
4102
4124
  return_type = method_type.type.return_type
4103
4125
  end
4104
4126
  else
4105
- # Block is given but method doesn't accept
4106
- #
4107
- constr.type_block_without_hint(node: node, block_annotations: block_annotations, block_params: block_params_, block_body: block_body) do |error|
4108
- errors << error
4109
- end
4127
+ if args
4128
+ # Block is given but method doesn't accept
4129
+ #
4130
+ constr.type_block_without_hint(node: node, block_annotations: block_annotations, block_params: block_params_, block_body: block_body) do |error|
4131
+ errors << error
4132
+ end
4110
4133
 
4111
- case node.children[0].type
4112
- when :super, :zsuper
4113
- unless method_context!.super_method
4114
- errors << Diagnostic::Ruby::UnexpectedSuper.new(
4115
- node: node.children[0],
4116
- method: method_name
4134
+ case node.children[0].type
4135
+ when :super, :zsuper
4136
+ unless method_context!.super_method
4137
+ errors << Diagnostic::Ruby::UnexpectedSuper.new(
4138
+ node: node.children[0],
4139
+ method: method_name
4140
+ )
4141
+ end
4142
+ else
4143
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4144
+ node: node,
4145
+ method_type: method_type
4117
4146
  )
4118
4147
  end
4148
+
4149
+ method_type = eliminate_vars(method_type, type_param_names)
4150
+ return_type = method_type.type.return_type
4119
4151
  else
4120
- errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4121
- node: node,
4122
- method_type: method_type
4123
- )
4152
+ if block_body
4153
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
4154
+ type_block_without_hint(
4155
+ node: node,
4156
+ block_annotations: block_annotations,
4157
+ block_params: TypeInference::BlockParams.from_node(block_params, annotations: block_annotations),
4158
+ block_body: block_body
4159
+ )
4160
+ end
4124
4161
  end
4125
-
4126
- method_type = eliminate_vars(method_type, type_param_names)
4127
- return_type = method_type.type.return_type
4128
4162
  end
4129
4163
  else
4130
4164
  # Block syntax is not given
4131
- arg = args.block_pass_arg
4165
+ if args
4166
+ arg = args.block_pass_arg
4132
4167
 
4133
- case
4134
- when forwarded_args_node = args.forwarded_args_node
4135
- (_, block = method_context!.forward_arg_type) or raise
4168
+ case
4169
+ when forwarded_args_node = args.forwarded_args_node
4170
+ (_, block = method_context!.forward_arg_type) or raise
4136
4171
 
4137
- method_block_type = method_type.block&.to_proc_type || AST::Builtin.nil_type
4138
- forwarded_block_type = block&.to_proc_type || AST::Builtin.nil_type
4172
+ method_block_type = method_type.block&.to_proc_type || AST::Builtin.nil_type
4173
+ forwarded_block_type = block&.to_proc_type || AST::Builtin.nil_type
4139
4174
 
4140
- if result = constr.no_subtyping?(sub_type: forwarded_block_type, super_type: method_block_type)
4141
- errors << Diagnostic::Ruby::IncompatibleArgumentForwarding.new(
4142
- method_name: method_name,
4143
- node: forwarded_args_node,
4144
- block_pair: [block, method_type.block],
4145
- result: result
4146
- )
4147
- end
4175
+ if result = constr.no_subtyping?(sub_type: forwarded_block_type, super_type: method_block_type)
4176
+ errors << Diagnostic::Ruby::IncompatibleArgumentForwarding.new(
4177
+ method_name: method_name,
4178
+ node: forwarded_args_node,
4179
+ block_pair: [block, method_type.block],
4180
+ result: result
4181
+ )
4182
+ end
4148
4183
 
4149
- when arg.compatible?
4150
- if arg.node
4151
- # Block pass (&block) is given
4152
- node_type, constr = constr.synthesize(arg.node, hint: arg.node_type)
4184
+ when arg.compatible?
4185
+ if arg.node
4186
+ # Block pass (&block) is given
4187
+ node_type, constr = constr.synthesize(arg.node, hint: arg.node_type)
4153
4188
 
4154
- nil_given =
4155
- constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success? &&
4156
- !node_type.is_a?(AST::Types::Any)
4189
+ nil_given =
4190
+ constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success? &&
4191
+ !node_type.is_a?(AST::Types::Any)
4157
4192
 
4158
- if nil_given
4159
- # nil is given ==> no block arg node is given
4160
- method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4161
- constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4162
- }
4163
- method_type = eliminate_vars(method_type, type_param_names) unless solved
4193
+ if nil_given
4194
+ # nil is given ==> no block arg node is given
4195
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4196
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4197
+ }
4198
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4164
4199
 
4165
- # Passing no block
4166
- errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4167
- node: node,
4168
- method_type: method_type
4169
- )
4170
- else
4171
- # non-nil value is given
4172
- constr.check_relation(sub_type: node_type, super_type: arg.node_type, constraints: constraints).else do |result|
4173
- errors << Diagnostic::Ruby::BlockTypeMismatch.new(
4174
- node: arg.node,
4175
- expected: arg.node_type,
4176
- actual: node_type,
4177
- result: result
4200
+ # Passing no block
4201
+ errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4202
+ node: node,
4203
+ method_type: method_type
4178
4204
  )
4179
- end
4205
+ else
4206
+ # non-nil value is given
4207
+ constr.check_relation(sub_type: node_type, super_type: arg.node_type, constraints: constraints).else do |result|
4208
+ errors << Diagnostic::Ruby::BlockTypeMismatch.new(
4209
+ node: arg.node,
4210
+ expected: arg.node_type,
4211
+ actual: node_type,
4212
+ result: result
4213
+ )
4214
+ end
4180
4215
 
4216
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4217
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4218
+ }
4219
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4220
+ end
4221
+ else
4222
+ # Block is not given
4181
4223
  method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4182
4224
  constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4183
4225
  }
4184
4226
  method_type = eliminate_vars(method_type, type_param_names) unless solved
4185
4227
  end
4186
- else
4187
- # Block is not given
4228
+
4229
+ return_type = method_type.type.return_type
4230
+
4231
+ when arg.block_missing?
4232
+ # Block is required but not given
4188
4233
  method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4189
4234
  constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4190
4235
  }
4191
- method_type = eliminate_vars(method_type, type_param_names) unless solved
4192
- end
4193
-
4194
- return_type = method_type.type.return_type
4195
4236
 
4196
- when arg.block_missing?
4197
- # Block is required but not given
4198
- method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4199
- constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4200
- }
4201
-
4202
- method_type = eliminate_vars(method_type, type_param_names) unless solved
4203
- return_type = method_type.type.return_type
4237
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4238
+ return_type = method_type.type.return_type
4204
4239
 
4205
- errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4206
- node: node,
4207
- method_type: method_type
4208
- )
4240
+ errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4241
+ node: node,
4242
+ method_type: method_type
4243
+ )
4209
4244
 
4210
- when arg.unexpected_block?
4211
- # Unexpected block pass node is given
4245
+ when arg.unexpected_block?
4246
+ # Unexpected block pass node is given
4212
4247
 
4213
- arg.node or raise
4248
+ arg.node or raise
4214
4249
 
4215
- method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4216
- constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4217
- }
4218
- method_type = eliminate_vars(method_type, type_param_names) unless solved
4219
- return_type = method_type.type.return_type
4250
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4251
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4252
+ }
4253
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4254
+ return_type = method_type.type.return_type
4220
4255
 
4221
- node_type, constr = constr.synthesize(arg.node)
4256
+ node_type, constr = constr.synthesize(arg.node)
4222
4257
 
4223
- unless constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success?
4224
- errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4225
- node: node,
4226
- method_type: method_type
4227
- )
4258
+ unless constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success?
4259
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4260
+ node: node,
4261
+ method_type: method_type
4262
+ )
4263
+ end
4228
4264
  end
4229
4265
  end
4230
4266
  end
@@ -4796,7 +4832,7 @@ module Steep
4796
4832
  if shape = calculate_interface(type, private: false)
4797
4833
  if entry = shape.methods[method]
4798
4834
  method_type = entry.method_types.find do |method_type|
4799
- method_type.type.params.optional?
4835
+ method_type.type.params.nil? || method_type.type.params.optional?
4800
4836
  end
4801
4837
 
4802
4838
  method_type.type.return_type if method_type
@@ -248,7 +248,7 @@ module Steep
248
248
  # @type var zip: Array[[Param | MultipleParam, AST::Types::t]]
249
249
  zip = []
250
250
 
251
- if untyped_args?(params_type)
251
+ if params_type.nil? || untyped_args?(params_type)
252
252
  params.each do |param|
253
253
  if param == rest_param
254
254
  zip << [param, AST::Builtin::Array.instance_type(fill_untyped: true)]
@@ -596,7 +596,8 @@ module Steep
596
596
  if shape = subtyping.builder.shape(type, config)
597
597
  if entry = shape.methods[method]
598
598
  method_type = entry.method_types.find do |method_type|
599
- method_type.type.params.optional?
599
+ method_type.type.params.nil? ||
600
+ method_type.type.params.optional?
600
601
  end
601
602
 
602
603
  method_type.type.return_type if method_type
@@ -241,6 +241,22 @@ module Steep
241
241
 
242
242
  instance = new(args: original, method_type: method_type, forward_arg_type: nil)
243
243
 
244
+ unless method_type.type.params
245
+ args.each do |arg|
246
+ case arg.type
247
+ when :arg
248
+ name = arg.children[0]
249
+ instance.params[name] = PositionalParameter.new(name: name, type: AST::Builtin.any_type, node: arg)
250
+ when :optarg
251
+ name = arg.children[0]
252
+ instance.params[name] = PositionalParameter.new(name: name, type: AST::Builtin.any_type, node: arg)
253
+ when :forward_arg
254
+ return instance.update(forward_arg_type: true)
255
+ end
256
+ end
257
+ return instance
258
+ end
259
+
244
260
  positional_params = method_type.type.params.positional_params
245
261
 
246
262
  loop do
@@ -500,6 +500,7 @@ module Steep
500
500
  attr_reader :type
501
501
 
502
502
  def initialize(node:, arguments:, type:)
503
+ raise "Untyped function is not supported" unless type.type.params
503
504
  @node = node
504
505
  @arguments = arguments
505
506
  @type = type
@@ -508,9 +509,9 @@ module Steep
508
509
  def params
509
510
  case type
510
511
  when Interface::MethodType
511
- type.type.params
512
+ type.type.params or raise
512
513
  when AST::Types::Proc
513
- type.type.params
514
+ type.type.params or raise
514
515
  else
515
516
  raise
516
517
  end
@@ -526,10 +527,12 @@ module Steep
526
527
  end
527
528
 
528
529
  def positional_params
530
+ params or raise
529
531
  params.positional_params
530
532
  end
531
533
 
532
534
  def keyword_params
535
+ params or raise
533
536
  params.keyword_params
534
537
  end
535
538
 
data/lib/steep/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Steep
2
- VERSION = "1.7.0.dev.3"
2
+ VERSION = "1.7.0.dev.4"
3
3
  end
@@ -28,9 +28,9 @@ module Steep
28
28
 
29
29
  def type_1_opt: (t?) -> RBS::Types::t?
30
30
 
31
- def function_1: (Interface::Function func) -> RBS::Types::Function
31
+ def function_1: (Interface::Function func) -> RBS::Types::function
32
32
 
33
- def params: (RBS::Types::Function `type`) -> Interface::Function::Params
33
+ def params: (RBS::Types::function `type`) -> Interface::Function::Params?
34
34
 
35
35
  def type_param: (RBS::AST::TypeParam type_param) -> Interface::TypeParam
36
36