steep 1.7.0.dev.3 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/README.md +18 -0
  4. data/doc/narrowing.md +1 -1
  5. data/doc/shape.md +176 -0
  6. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +7 -24
  7. data/lib/steep/ast/types/factory.rb +27 -18
  8. data/lib/steep/ast/types/proc.rb +14 -9
  9. data/lib/steep/interface/block.rb +1 -1
  10. data/lib/steep/interface/builder.rb +1 -0
  11. data/lib/steep/interface/function.rb +14 -6
  12. data/lib/steep/interface/method_type.rb +15 -7
  13. data/lib/steep/project/pattern.rb +1 -2
  14. data/lib/steep/rake_task.rb +132 -0
  15. data/lib/steep/server/interaction_worker.rb +6 -0
  16. data/lib/steep/server/lsp_formatter.rb +2 -0
  17. data/lib/steep/services/completion_provider.rb +1 -1
  18. data/lib/steep/services/file_loader.rb +15 -20
  19. data/lib/steep/services/signature_help_provider.rb +11 -9
  20. data/lib/steep/signature/validator.rb +1 -1
  21. data/lib/steep/subtyping/check.rb +15 -6
  22. data/lib/steep/subtyping/variable_variance.rb +3 -3
  23. data/lib/steep/type_construction.rb +186 -149
  24. data/lib/steep/type_inference/block_params.rb +1 -1
  25. data/lib/steep/type_inference/logic_type_interpreter.rb +2 -1
  26. data/lib/steep/type_inference/method_params.rb +16 -0
  27. data/lib/steep/type_inference/send_args.rb +5 -2
  28. data/lib/steep/version.rb +1 -1
  29. data/steep.gemspec +5 -2
  30. metadata +7 -145
  31. data/.github/dependabot.yml +0 -28
  32. data/.github/workflows/ruby-windows.yml +0 -35
  33. data/.github/workflows/ruby.yml +0 -32
  34. data/.vscode/steep-shared.code-snippets +0 -41
  35. data/Gemfile +0 -14
  36. data/Gemfile.lock +0 -104
  37. data/Gemfile.steep +0 -0
  38. data/gemfile_steep/Gemfile +0 -3
  39. data/gemfile_steep/Gemfile.lock +0 -77
  40. data/rbs_collection.steep.lock.yaml +0 -108
  41. data/rbs_collection.steep.yaml +0 -23
  42. data/sig/shims/bundler.rbs +0 -3
  43. data/sig/shims/concurrent-ruby.rbs +0 -39
  44. data/sig/shims/exception.rbs +0 -4
  45. data/sig/shims/language-server_protocol.rbs +0 -450
  46. data/sig/shims/parser/comment.rbs +0 -33
  47. data/sig/shims/parser/nodes.rbs +0 -252
  48. data/sig/shims/parser/source/map.rbs +0 -146
  49. data/sig/shims/parser/source/range.rbs +0 -237
  50. data/sig/shims/parser.rbs +0 -69
  51. data/sig/shims/string.rbs +0 -4
  52. data/sig/shims/tagged_logging.rbs +0 -6
  53. data/sig/shims/yaml.rbs +0 -4
  54. data/sig/steep/annotation_parser.rbs +0 -60
  55. data/sig/steep/ast/annotation/collection.rbs +0 -78
  56. data/sig/steep/ast/annotation.rbs +0 -121
  57. data/sig/steep/ast/builtin.rbs +0 -69
  58. data/sig/steep/ast/ignore.rbs +0 -66
  59. data/sig/steep/ast/node/type_application.rbs +0 -31
  60. data/sig/steep/ast/node/type_assertion.rbs +0 -32
  61. data/sig/steep/ast/types/any.rbs +0 -29
  62. data/sig/steep/ast/types/boolean.rbs +0 -31
  63. data/sig/steep/ast/types/bot.rbs +0 -29
  64. data/sig/steep/ast/types/class.rbs +0 -33
  65. data/sig/steep/ast/types/factory.rbs +0 -110
  66. data/sig/steep/ast/types/helper.rbs +0 -24
  67. data/sig/steep/ast/types/instance.rbs +0 -33
  68. data/sig/steep/ast/types/intersection.rbs +0 -40
  69. data/sig/steep/ast/types/literal.rbs +0 -35
  70. data/sig/steep/ast/types/logic.rbs +0 -83
  71. data/sig/steep/ast/types/name.rbs +0 -84
  72. data/sig/steep/ast/types/nil.rbs +0 -31
  73. data/sig/steep/ast/types/proc.rbs +0 -53
  74. data/sig/steep/ast/types/record.rbs +0 -39
  75. data/sig/steep/ast/types/self.rbs +0 -33
  76. data/sig/steep/ast/types/top.rbs +0 -29
  77. data/sig/steep/ast/types/tuple.rbs +0 -37
  78. data/sig/steep/ast/types/union.rbs +0 -40
  79. data/sig/steep/ast/types/var.rbs +0 -42
  80. data/sig/steep/ast/types/void.rbs +0 -29
  81. data/sig/steep/ast/types.rbs +0 -16
  82. data/sig/steep/cli.rbs +0 -55
  83. data/sig/steep/diagnostic/deprecated/else_on_exhaustive_case.rbs +0 -13
  84. data/sig/steep/diagnostic/deprecated/unknown_constant_assigned.rbs +0 -15
  85. data/sig/steep/diagnostic/helper.rbs +0 -15
  86. data/sig/steep/diagnostic/lsp_formatter.rbs +0 -36
  87. data/sig/steep/diagnostic/ruby.rbs +0 -703
  88. data/sig/steep/diagnostic/signature.rbs +0 -252
  89. data/sig/steep/drivers/annotations.rbs +0 -17
  90. data/sig/steep/drivers/check.rbs +0 -33
  91. data/sig/steep/drivers/checkfile.rbs +0 -27
  92. data/sig/steep/drivers/diagnostic_printer.rbs +0 -25
  93. data/sig/steep/drivers/init.rbs +0 -19
  94. data/sig/steep/drivers/langserver.rbs +0 -36
  95. data/sig/steep/drivers/print_project.rbs +0 -15
  96. data/sig/steep/drivers/stats.rbs +0 -47
  97. data/sig/steep/drivers/utils/driver_helper.rbs +0 -25
  98. data/sig/steep/drivers/utils/jobs_option.rbs +0 -19
  99. data/sig/steep/drivers/validate.rbs +0 -15
  100. data/sig/steep/drivers/vendor.rbs +0 -19
  101. data/sig/steep/drivers/watch.rbs +0 -27
  102. data/sig/steep/drivers/worker.rbs +0 -29
  103. data/sig/steep/equatable.rbs +0 -11
  104. data/sig/steep/expectations.rbs +0 -72
  105. data/sig/steep/index/rbs_index.rbs +0 -141
  106. data/sig/steep/index/signature_symbol_provider.rbs +0 -41
  107. data/sig/steep/index/source_index.rbs +0 -63
  108. data/sig/steep/interface/block.rbs +0 -41
  109. data/sig/steep/interface/builder.rbs +0 -152
  110. data/sig/steep/interface/function.rbs +0 -270
  111. data/sig/steep/interface/method_type.rbs +0 -105
  112. data/sig/steep/interface/shape.rbs +0 -80
  113. data/sig/steep/interface/substitution.rbs +0 -51
  114. data/sig/steep/interface/type_param.rbs +0 -43
  115. data/sig/steep/method_name.rbs +0 -30
  116. data/sig/steep/module_helper.rbs +0 -16
  117. data/sig/steep/node_helper.rbs +0 -91
  118. data/sig/steep/path_helper.rbs +0 -15
  119. data/sig/steep/project/dsl.rbs +0 -108
  120. data/sig/steep/project/options.rbs +0 -47
  121. data/sig/steep/project/pattern.rbs +0 -47
  122. data/sig/steep/project/target.rbs +0 -25
  123. data/sig/steep/project.rbs +0 -26
  124. data/sig/steep/range_extension.rbs +0 -7
  125. data/sig/steep/server/base_worker.rbs +0 -49
  126. data/sig/steep/server/change_buffer.rbs +0 -38
  127. data/sig/steep/server/delay_queue.rbs +0 -37
  128. data/sig/steep/server/interaction_worker.rbs +0 -90
  129. data/sig/steep/server/lsp_formatter.rbs +0 -63
  130. data/sig/steep/server/master.rbs +0 -299
  131. data/sig/steep/server/type_check_worker.rbs +0 -141
  132. data/sig/steep/server/worker_process.rbs +0 -97
  133. data/sig/steep/services/completion_provider.rbs +0 -264
  134. data/sig/steep/services/content_change.rbs +0 -37
  135. data/sig/steep/services/file_loader.rbs +0 -21
  136. data/sig/steep/services/goto_service.rbs +0 -106
  137. data/sig/steep/services/hover_provider/rbs.rbs +0 -47
  138. data/sig/steep/services/hover_provider/ruby.rbs +0 -127
  139. data/sig/steep/services/hover_provider/singleton_methods.rbs +0 -11
  140. data/sig/steep/services/path_assignment.rbs +0 -21
  141. data/sig/steep/services/signature_help_provider.rbs +0 -51
  142. data/sig/steep/services/signature_service.rbs +0 -156
  143. data/sig/steep/services/stats_calculator.rbs +0 -41
  144. data/sig/steep/services/type_check_service.rbs +0 -112
  145. data/sig/steep/services/type_name_completion.rbs +0 -135
  146. data/sig/steep/signature/validator.rbs +0 -85
  147. data/sig/steep/source/ignore_ranges.rbs +0 -38
  148. data/sig/steep/source.rbs +0 -105
  149. data/sig/steep/subtyping/cache.rbs +0 -17
  150. data/sig/steep/subtyping/check.rbs +0 -131
  151. data/sig/steep/subtyping/constraints.rbs +0 -111
  152. data/sig/steep/subtyping/relation.rbs +0 -63
  153. data/sig/steep/subtyping/result.rbs +0 -179
  154. data/sig/steep/subtyping/variable_variance.rbs +0 -25
  155. data/sig/steep/thread_waiter.rbs +0 -13
  156. data/sig/steep/type_construction.rbs +0 -542
  157. data/sig/steep/type_inference/block_params.rbs +0 -170
  158. data/sig/steep/type_inference/case_when.rbs +0 -130
  159. data/sig/steep/type_inference/constant_env.rbs +0 -29
  160. data/sig/steep/type_inference/context.rbs +0 -216
  161. data/sig/steep/type_inference/context_array.rbs +0 -38
  162. data/sig/steep/type_inference/logic_type_interpreter.rbs +0 -108
  163. data/sig/steep/type_inference/method_call.rbs +0 -124
  164. data/sig/steep/type_inference/method_params.rbs +0 -127
  165. data/sig/steep/type_inference/multiple_assignment.rbs +0 -76
  166. data/sig/steep/type_inference/send_args.rbs +0 -243
  167. data/sig/steep/type_inference/type_env.rbs +0 -160
  168. data/sig/steep/type_inference/type_env_builder.rbs +0 -81
  169. data/sig/steep/typing.rbs +0 -75
  170. data/sig/steep.rbs +0 -45
@@ -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)
@@ -2102,6 +2106,7 @@ module Steep
2102
2106
  end
2103
2107
 
2104
2108
  if body
2109
+ resbody_construction.typing.add_context_for_node(body, context: resbody_construction.context)
2105
2110
  resbody_construction.synthesize(body, hint: hint)
2106
2111
  else
2107
2112
  Pair.new(constr: body_constr, type: AST::Builtin.nil_type)
@@ -2172,10 +2177,21 @@ module Steep
2172
2177
  var_type = AST::Builtin.any_type
2173
2178
  else
2174
2179
  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 }
2180
+ method_type = (each.method_types || []).find do |type|
2181
+ if type.block
2182
+ if type.block.type.params
2183
+ type.block.type.params.first_param
2184
+ else
2185
+ true
2186
+ end
2187
+ end
2188
+ end
2189
+ if method_type
2176
2190
  if block = method_type.block
2177
- if first_param = block.type.params.first_param
2191
+ if first_param = block.type&.params&.first_param
2178
2192
  var_type = first_param.type #: AST::Types::t
2193
+ else
2194
+ var_type - AST::Builtin.any_type
2179
2195
  end
2180
2196
  end
2181
2197
  end
@@ -2386,31 +2402,33 @@ module Steep
2386
2402
 
2387
2403
  if hint.is_a?(AST::Types::Proc) && value_node.type == :sym
2388
2404
  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
2405
+ if hint.type.params
2406
+ # Assumes Symbol#to_proc implementation
2407
+ param_type = hint.type.params.required[0]
2408
+ case param_type
2409
+ when AST::Types::Any
2410
+ type = AST::Types::Any.new
2411
+ else
2412
+ if method = calculate_interface(param_type, private: true)&.methods&.[](value_node.children[0])
2413
+ return_types = method.method_types.filter_map do |method_type|
2414
+ if method_type.type.params.nil? || method_type.type.params.optional?
2415
+ method_type.type.return_type
2416
+ end
2399
2417
  end
2400
- end
2401
2418
 
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)
2419
+ unless return_types.empty?
2420
+ type = AST::Types::Proc.new(
2421
+ type: Interface::Function.new(
2422
+ params: Interface::Function::Params.empty.with_first_param(
2423
+ Interface::Function::Params::PositionalParams::Required.new(param_type)
2424
+ ),
2425
+ return_type: return_types[0],
2426
+ location: nil
2407
2427
  ),
2408
- return_type: return_types[0],
2409
- location: nil
2410
- ),
2411
- block: nil,
2412
- self_type: nil
2413
- )
2428
+ block: nil,
2429
+ self_type: nil
2430
+ )
2431
+ end
2414
2432
  end
2415
2433
  end
2416
2434
  end
@@ -3186,7 +3204,7 @@ module Steep
3186
3204
  end
3187
3205
 
3188
3206
  def type_send_interface(node, interface:, receiver:, receiver_type:, method_name:, arguments:, block_params:, block_body:, tapp:, hint:)
3189
- method = interface&.methods&.[](method_name)
3207
+ method = interface.methods[method_name]
3190
3208
 
3191
3209
  if method
3192
3210
  call, constr = type_method_call(
@@ -3915,13 +3933,17 @@ module Steep
3915
3933
  # @type var errors: Array[Diagnostic::Ruby::Base]
3916
3934
  errors = []
3917
3935
 
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
- )
3936
+ if method_type.type.params
3937
+ args = TypeInference::SendArgs.new(node: node, arguments: arguments, type: method_type)
3938
+ constr = constr.type_check_args(
3939
+ method_name,
3940
+ args,
3941
+ constraints,
3942
+ errors
3943
+ )
3944
+ else
3945
+ constr = constr.type_check_untyped_args(arguments)
3946
+ end
3925
3947
 
3926
3948
  if block_params
3927
3949
  # block is given
@@ -4010,11 +4032,12 @@ module Steep
4010
4032
  end
4011
4033
 
4012
4034
  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
- )
4035
+ fvs_ = Set[] #: Set[AST::Types::variable]
4036
+
4037
+ fvs_.merge(method_type.type.params.free_variables) if method_type.type.params
4038
+ fvs_.merge(method_type.block.type.params.free_variables) if method_type.block.type.params
4039
+
4040
+ constraints.solution(checker, variables: fvs_, context: ccontext)
4018
4041
  }
4019
4042
 
4020
4043
  method_type.block or raise
@@ -4102,129 +4125,143 @@ module Steep
4102
4125
  return_type = method_type.type.return_type
4103
4126
  end
4104
4127
  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
4128
+ if args
4129
+ # Block is given but method doesn't accept
4130
+ #
4131
+ constr.type_block_without_hint(node: node, block_annotations: block_annotations, block_params: block_params_, block_body: block_body) do |error|
4132
+ errors << error
4133
+ end
4110
4134
 
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
4135
+ case node.children[0].type
4136
+ when :super, :zsuper
4137
+ unless method_context!.super_method
4138
+ errors << Diagnostic::Ruby::UnexpectedSuper.new(
4139
+ node: node.children[0],
4140
+ method: method_name
4141
+ )
4142
+ end
4143
+ else
4144
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4145
+ node: node,
4146
+ method_type: method_type
4117
4147
  )
4118
4148
  end
4149
+
4150
+ method_type = eliminate_vars(method_type, type_param_names)
4151
+ return_type = method_type.type.return_type
4119
4152
  else
4120
- errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4121
- node: node,
4122
- method_type: method_type
4123
- )
4153
+ if block_body
4154
+ block_annotations = source.annotations(block: node, factory: checker.factory, context: nesting)
4155
+ type_block_without_hint(
4156
+ node: node,
4157
+ block_annotations: block_annotations,
4158
+ block_params: TypeInference::BlockParams.from_node(block_params, annotations: block_annotations),
4159
+ block_body: block_body
4160
+ )
4161
+ end
4124
4162
  end
4125
-
4126
- method_type = eliminate_vars(method_type, type_param_names)
4127
- return_type = method_type.type.return_type
4128
4163
  end
4129
4164
  else
4130
4165
  # Block syntax is not given
4131
- arg = args.block_pass_arg
4166
+ if args
4167
+ arg = args.block_pass_arg
4132
4168
 
4133
- case
4134
- when forwarded_args_node = args.forwarded_args_node
4135
- (_, block = method_context!.forward_arg_type) or raise
4169
+ case
4170
+ when forwarded_args_node = args.forwarded_args_node
4171
+ (_, block = method_context!.forward_arg_type) or raise
4136
4172
 
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
4173
+ method_block_type = method_type.block&.to_proc_type || AST::Builtin.nil_type
4174
+ forwarded_block_type = block&.to_proc_type || AST::Builtin.nil_type
4139
4175
 
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
4176
+ if result = constr.no_subtyping?(sub_type: forwarded_block_type, super_type: method_block_type)
4177
+ errors << Diagnostic::Ruby::IncompatibleArgumentForwarding.new(
4178
+ method_name: method_name,
4179
+ node: forwarded_args_node,
4180
+ block_pair: [block, method_type.block],
4181
+ result: result
4182
+ )
4183
+ end
4148
4184
 
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)
4185
+ when arg.compatible?
4186
+ if arg.node
4187
+ # Block pass (&block) is given
4188
+ node_type, constr = constr.synthesize(arg.node, hint: arg.node_type)
4153
4189
 
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)
4190
+ nil_given =
4191
+ constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success? &&
4192
+ !node_type.is_a?(AST::Types::Any)
4157
4193
 
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
4194
+ if nil_given
4195
+ # nil is given ==> no block arg node is given
4196
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4197
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4198
+ }
4199
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4164
4200
 
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
4201
+ # Passing no block
4202
+ errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4203
+ node: node,
4204
+ method_type: method_type
4178
4205
  )
4179
- end
4206
+ else
4207
+ # non-nil value is given
4208
+ constr.check_relation(sub_type: node_type, super_type: arg.node_type, constraints: constraints).else do |result|
4209
+ errors << Diagnostic::Ruby::BlockTypeMismatch.new(
4210
+ node: arg.node,
4211
+ expected: arg.node_type,
4212
+ actual: node_type,
4213
+ result: result
4214
+ )
4215
+ end
4180
4216
 
4217
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4218
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4219
+ }
4220
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4221
+ end
4222
+ else
4223
+ # Block is not given
4181
4224
  method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4182
4225
  constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4183
4226
  }
4184
4227
  method_type = eliminate_vars(method_type, type_param_names) unless solved
4185
4228
  end
4186
- else
4187
- # Block is not given
4229
+
4230
+ return_type = method_type.type.return_type
4231
+
4232
+ when arg.block_missing?
4233
+ # Block is required but not given
4188
4234
  method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4189
4235
  constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4190
4236
  }
4191
- method_type = eliminate_vars(method_type, type_param_names) unless solved
4192
- end
4193
-
4194
- return_type = method_type.type.return_type
4195
4237
 
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
4238
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4239
+ return_type = method_type.type.return_type
4204
4240
 
4205
- errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4206
- node: node,
4207
- method_type: method_type
4208
- )
4241
+ errors << Diagnostic::Ruby::RequiredBlockMissing.new(
4242
+ node: node,
4243
+ method_type: method_type
4244
+ )
4209
4245
 
4210
- when arg.unexpected_block?
4211
- # Unexpected block pass node is given
4246
+ when arg.unexpected_block?
4247
+ # Unexpected block pass node is given
4212
4248
 
4213
- arg.node or raise
4249
+ arg.node or raise
4214
4250
 
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
4251
+ method_type, solved, _ = apply_solution(errors, node: node, method_type: method_type) {
4252
+ constraints.solution(checker, variables: method_type.free_variables, context: ccontext)
4253
+ }
4254
+ method_type = eliminate_vars(method_type, type_param_names) unless solved
4255
+ return_type = method_type.type.return_type
4220
4256
 
4221
- node_type, constr = constr.synthesize(arg.node)
4257
+ node_type, constr = constr.synthesize(arg.node)
4222
4258
 
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
- )
4259
+ unless constr.check_relation(sub_type: node_type, super_type: AST::Builtin.nil_type).success?
4260
+ errors << Diagnostic::Ruby::UnexpectedBlockGiven.new(
4261
+ node: node,
4262
+ method_type: method_type
4263
+ )
4264
+ end
4228
4265
  end
4229
4266
  end
4230
4267
  end
@@ -4796,7 +4833,7 @@ module Steep
4796
4833
  if shape = calculate_interface(type, private: false)
4797
4834
  if entry = shape.methods[method]
4798
4835
  method_type = entry.method_types.find do |method_type|
4799
- method_type.type.params.optional?
4836
+ method_type.type.params.nil? || method_type.type.params.optional?
4800
4837
  end
4801
4838
 
4802
4839
  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"
3
3
  end
data/steep.gemspec CHANGED
@@ -18,8 +18,11 @@ Gem::Specification.new do |spec|
18
18
  spec.metadata["source_code_uri"] = "https://github.com/soutaro/steep"
19
19
  spec.metadata["changelog_uri"] = "https://github.com/soutaro/steep/blob/master/CHANGELOG.md"
20
20
 
21
+ skip_dirs = %w(test spec features smoke sig gemfile_steep .github .vscode)
22
+ skip_files = %w(Gemfile Gemfile.lock rbs_collection.steep.yaml rbs_collection.steep.lock.yaml)
23
+
21
24
  spec.files = `git ls-files -z`.split("\x0").reject {|f|
22
- f.match(%r{^(test|spec|features|smoke)/})
25
+ skip_dirs.any? {|dir| f.start_with?(dir + File::SEPARATOR) } || skip_files.include?(f)
23
26
  }
24
27
 
25
28
  spec.bindir = "exe"
@@ -33,7 +36,7 @@ Gem::Specification.new do |spec|
33
36
  spec.add_runtime_dependency "rainbow", ">= 2.2.2", "< 4.0"
34
37
  spec.add_runtime_dependency "listen", "~> 3.0"
35
38
  spec.add_runtime_dependency "language_server-protocol", ">= 3.15", "< 4.0"
36
- spec.add_runtime_dependency "rbs", ">= 3.1.0"
39
+ spec.add_runtime_dependency "rbs", ">= 3.5.0.pre"
37
40
  spec.add_runtime_dependency "concurrent-ruby", ">= 1.1.10"
38
41
  spec.add_runtime_dependency "terminal-table", ">= 2", "< 4"
39
42
  spec.add_runtime_dependency "securerandom", ">= 0.1"