steep 1.4.0.dev.2 → 1.4.0.dev.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -2
  3. data/Gemfile +1 -1
  4. data/Gemfile.lock +7 -9
  5. data/Gemfile.steep +1 -2
  6. data/Gemfile.steep.lock +9 -10
  7. data/README.md +7 -1
  8. data/Steepfile +0 -3
  9. data/bin/rbs +0 -1
  10. data/guides/README.md +5 -0
  11. data/guides/src/gem-rbs-collection/gem-rbs-collection.md +143 -0
  12. data/guides/src/getting-started/getting-started.md +164 -0
  13. data/guides/src/nil-optional/nil-optional.md +195 -0
  14. data/lib/steep/diagnostic/ruby.rb +79 -4
  15. data/lib/steep/drivers/check.rb +4 -4
  16. data/lib/steep/interface/block.rb +10 -0
  17. data/lib/steep/module_helper.rb +13 -11
  18. data/lib/steep/path_helper.rb +4 -0
  19. data/lib/steep/server/interaction_worker.rb +105 -92
  20. data/lib/steep/services/type_name_completion.rb +157 -0
  21. data/lib/steep/source.rb +1 -0
  22. data/lib/steep/type_construction.rb +402 -229
  23. data/lib/steep/type_inference/block_params.rb +13 -0
  24. data/lib/steep/type_inference/context.rb +3 -3
  25. data/lib/steep/type_inference/method_params.rb +42 -16
  26. data/lib/steep/type_inference/send_args.rb +79 -50
  27. data/lib/steep/type_inference/type_env.rb +7 -1
  28. data/lib/steep/version.rb +1 -1
  29. data/lib/steep.rb +1 -0
  30. data/rbs_collection.steep.lock.yaml +0 -28
  31. data/rbs_collection.steep.yaml +10 -9
  32. data/sample/lib/conference.rb +12 -0
  33. data/sample/sig/conference.rbs +5 -0
  34. data/sig/shims/language-server_protocol.rbs +12 -0
  35. data/sig/shims/parser/nodes.rbs +37 -0
  36. data/sig/shims/parser.rbs +1 -0
  37. data/sig/shims/string.rbs +4 -0
  38. data/sig/steep/ast/types/factory.rbs +10 -8
  39. data/sig/steep/diagnostic/lsp_formatter.rbs +1 -1
  40. data/sig/steep/diagnostic/ruby.rbs +38 -2
  41. data/sig/steep/drivers/check.rbs +1 -1
  42. data/sig/steep/drivers/checkfile.rbs +1 -1
  43. data/sig/steep/drivers/diagnostic_printer.rbs +1 -1
  44. data/sig/steep/drivers/watch.rbs +1 -1
  45. data/sig/steep/index/signature_symbol_provider.rbs +1 -1
  46. data/sig/steep/interface/block.rbs +2 -0
  47. data/sig/steep/interface/builder.rbs +5 -3
  48. data/sig/steep/interface/method_type.rbs +5 -3
  49. data/sig/steep/module_helper.rbs +9 -0
  50. data/sig/steep/path_helper.rbs +3 -1
  51. data/sig/steep/server/base_worker.rbs +1 -1
  52. data/sig/steep/server/interaction_worker.rbs +46 -17
  53. data/sig/steep/server/master.rbs +1 -1
  54. data/sig/steep/server/type_check_worker.rbs +7 -5
  55. data/sig/steep/server/worker_process.rbs +6 -4
  56. data/sig/steep/services/completion_provider.rbs +2 -0
  57. data/sig/steep/services/type_name_completion.rbs +122 -0
  58. data/sig/steep/type_construction.rbs +99 -30
  59. data/sig/steep/type_inference/block_params.rbs +4 -0
  60. data/sig/steep/type_inference/context.rbs +70 -22
  61. data/sig/steep/type_inference/method_params.rbs +43 -24
  62. data/sig/steep/type_inference/multiple_assignment.rbs +1 -1
  63. data/sig/steep/type_inference/send_args.rbs +13 -3
  64. data/sig/steep/typing.rbs +7 -2
  65. data/smoke/diagnostics/test_expectations.yml +1 -0
  66. data/steep.gemspec +0 -1
  67. metadata +10 -16
@@ -20,6 +20,8 @@ module Steep
20
20
 
21
21
  include NodeHelper
22
22
 
23
+ include ModuleHelper
24
+
23
25
  attr_reader checker: Subtyping::Check
24
26
 
25
27
  attr_reader source: Source
@@ -30,9 +32,7 @@ module Steep
30
32
 
31
33
  attr_reader context: TypeInference::Context
32
34
 
33
- %a{pure} def module_context: () -> TypeInference::Context::ModuleContext?
34
-
35
- def module_context!: () -> TypeInference::Context::ModuleContext
35
+ %a{pure} def module_context: () -> TypeInference::Context::ModuleContext
36
36
 
37
37
  %a{pure} def method_context: () -> TypeInference::Context::MethodContext?
38
38
 
@@ -40,6 +40,8 @@ module Steep
40
40
 
41
41
  %a{pure} def block_context: () -> TypeInference::Context::BlockContext?
42
42
 
43
+ def block_context!: () -> TypeInference::Context::BlockContext
44
+
43
45
  %a{pure} def break_context: () -> TypeInference::Context::BreakContext?
44
46
 
45
47
  %a{pure} def self_type: () -> AST::Types::t
@@ -58,7 +60,7 @@ module Steep
58
60
 
59
61
  def update_type_env: () { (TypeInference::TypeEnv) -> TypeInference::TypeEnv } -> TypeConstruction
60
62
 
61
- def check_relation: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::Base
63
+ def check_relation: (sub_type: AST::Types::t, super_type: AST::Types::t, ?constraints: Subtyping::Constraints) -> Subtyping::Result::t
62
64
 
63
65
  # This is a variation of `#check_relation` method.
64
66
  # It checks if given subtyping relation `sub_type <: super_type` holds or not, and returns truthy when *doesn't* hold.
@@ -82,7 +84,7 @@ module Steep
82
84
 
83
85
  def implement_module: (module_name: RBS::TypeName, annotations: AST::Annotation::Collection, ?super_name: RBS::TypeName?) -> AST::Annotation::Implements::Module?
84
86
 
85
- def default_module_context: (untyped implement_module_name, nesting: untyped) -> untyped
87
+ def default_module_context: (AST::Annotation::Implements::Module? implement_module_name, nesting: RBS::Resolver::context) -> TypeInference::Context::ModuleContext
86
88
 
87
89
  def for_module: (untyped node, untyped new_module_name) -> untyped
88
90
 
@@ -104,7 +106,7 @@ module Steep
104
106
 
105
107
  def for_sclass: (Parser::AST::Node node, AST::Types::t `type`) -> TypeConstruction?
106
108
 
107
- def for_branch: (Parser::AST::Node node, ?break_context: TypeInference::Context::BreakContext?) -> untyped
109
+ def for_branch: (Parser::AST::Node node, ?break_context: TypeInference::Context::BreakContext?) -> TypeConstruction
108
110
 
109
111
  def add_typing: (Parser::AST::Node node, type: AST::Types::t, ?constr: TypeConstruction) -> Pair
110
112
 
@@ -112,7 +114,7 @@ module Steep
112
114
 
113
115
  def synthesize: (Parser::AST::Node node, ?hint: AST::Types::t?, ?condition: bool) -> Pair
114
116
 
115
- def check: (Parser::AST::Node node, AST::Types::t `type`, ?constraints: Subtyping::Constraints) { (AST::Types::t, AST::Types::t, Subtyping::Result::Base) -> void } -> Pair
117
+ def check: (Parser::AST::Node node, AST::Types::t `type`, ?constraints: Subtyping::Constraints) { (AST::Types::t, AST::Types::t, Subtyping::Result::t) -> void } -> Pair
116
118
 
117
119
  def masgn_lhs?: (untyped lhs) -> untyped
118
120
 
@@ -126,13 +128,43 @@ module Steep
126
128
 
127
129
  def constant_typename: (Parser::AST::Node parent, Symbol name) -> RBS::TypeName?
128
130
 
129
- def synthesize_constant: (Parser::AST::Node node, Parser::AST::Node? parent_node, Symbol constant_name) { () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
131
+ # Synthesize a constant declaration -- :cdecl, :class, or :module
132
+ #
133
+ # * `node` is the node that references a constant
134
+ # * `parent_node` is the parent (namespace) of a constant reference
135
+ # * `constant_name` is the name of constant
136
+ #
137
+ # Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
138
+ #
139
+ # Returns a tuple of
140
+ #
141
+ # * The type of the constant
142
+ # * TypeConstruction instance after the evaluation
143
+ # * The full name of the constant
144
+ #
145
+ def synthesize_constant_decl: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
146
+
147
+ # Synthesize a constant reference
148
+ #
149
+ # * `node` is the node that references a constant
150
+ # * `parent_node` is the parent (namespace) of a constant reference
151
+ # * `constant_name` is the name of constant
152
+ #
153
+ # Yields a block that is expected to add an error, or it reports Diagnostic::Ruby::UnknownConstant if not given.
154
+ #
155
+ # Returns a tuple of
156
+ #
157
+ # * The type of the constant
158
+ # * TypeConstruction instance after the evaluation
159
+ # * The full name of the constant
160
+ #
161
+ def synthesize_constant: (Parser::AST::Node? node, Parser::AST::Node? parent_node, Symbol constant_name) ?{ () -> void } -> [AST::Types::t, TypeConstruction, RBS::TypeName?]
130
162
 
131
163
  def optional_proc?: (untyped `type`) -> (untyped | nil | nil | nil | nil)
132
164
 
133
- def type_lambda: (Parser::AST::Node node, params_node: Parser::AST::Node, body_node: Parser::AST::Node, type_hint: AST::Types::t?) -> Pair
165
+ def type_lambda: (Parser::AST::Node & Parser::AST::_BlockNode node, params_node: Parser::AST::Node, body_node: Parser::AST::Node, type_hint: AST::Types::t?) -> Pair
134
166
 
135
- def synthesize_children: (Parser::AST::Node node, ?skips: Array[Parser::AST::Node]) -> TypeConstruction
167
+ def synthesize_children: (Parser::AST::Node node, ?skips: Array[Parser::AST::Node?]) -> TypeConstruction
136
168
 
137
169
  # Synthesize `:send`, `:csend`, `:block`, and `:numblock` node
138
170
  #
@@ -255,7 +287,13 @@ module Steep
255
287
 
256
288
  def eliminate_vars: (untyped `type`, untyped variables, ?to: untyped) -> untyped
257
289
 
290
+ # Type check arguments
291
+ #
292
+ # * Receives the `method_name` of a method that is being called
293
+ # * `method_name` is `nil` if it type checks arguments of block or proc
294
+ #
258
295
  def type_check_args: (
296
+ Symbol | nil,
259
297
  TypeInference::SendArgs,
260
298
  Subtyping::Constraints,
261
299
  Array[Diagnostic::Ruby::Base]
@@ -263,7 +301,7 @@ module Steep
263
301
 
264
302
  def type_check_argument: (Parser::AST::Node node, type: AST::Types::t, constraints: Subtyping::Constraints, errors: Array[Diagnostic::Ruby::Base], ?report_node: Parser::AST::Node) -> Pair
265
303
 
266
- def type_block_without_hint: (node: Parser::AST::Node, block_annotations: AST::Annotation::Collection, block_params: TypeInference::BlockParams?, block_body: Parser::AST::Node?) ?{ (Diagnostic::Ruby::Base) -> void } -> void
304
+ def type_block_without_hint: (node: Parser::AST::Node & Parser::AST::_BlockNode, block_annotations: AST::Annotation::Collection, block_params: TypeInference::BlockParams?, block_body: Parser::AST::Node?) ?{ (Diagnostic::Ruby::Base) -> void } -> void
267
305
 
268
306
  def set_up_block_mlhs_params_env: (
269
307
  Parser::AST::Node mlhs_node,
@@ -299,15 +337,19 @@ module Steep
299
337
 
300
338
  # Synthesize the block body and returns the type of the body
301
339
  #
302
- # The constructor can be discarded because it cannot change anything outer than block.
340
+ # The constructor can be safely discarded because it cannot change anything outer than block.
303
341
  #
304
- def synthesize_block: (node: Parser::AST::Node, block_type_hint: AST::Types::t?, block_body: Parser::AST::Node?) -> AST::Types::t
342
+ def synthesize_block: (
343
+ node: Parser::AST::Node & Parser::AST::_BlockNode,
344
+ block_type_hint: AST::Types::t?,
345
+ block_body: Parser::AST::Node?
346
+ ) -> AST::Types::t
305
347
 
306
- def nesting: () -> RBS::Resolver::context
348
+ %a{pure} def nesting: () -> RBS::Resolver::context
307
349
 
308
350
  def absolute_name: (untyped name) -> untyped
309
351
 
310
- def union_type: (*AST::Types::t types) -> AST::Types::t
352
+ def union_type: (*AST::Types::t? types) -> AST::Types::t
311
353
 
312
354
  # Returns union type of given types
313
355
  #
@@ -328,27 +370,35 @@ module Steep
328
370
  #
329
371
  def union_of_tuple_to_tuple_of_union: (AST::Types::Union) -> AST::Types::Tuple?
330
372
 
331
- def validate_method_definitions: (untyped node, untyped module_name) -> (nil | untyped)
373
+ def validate_method_definitions: (Parser::AST::Node node, AST::Annotation::Implements::Module module_name) -> void
332
374
 
333
375
  def fallback_to_any: (Parser::AST::Node node) ?{ () -> Diagnostic::Ruby::Base } -> Pair
334
376
 
335
- def self_class?: (untyped node) -> untyped
377
+ # Return `true` if `node` is `self.class`
378
+ def self_class?: (Parser::AST::Node node) -> bool
336
379
 
337
- def namespace_module?: (untyped node) -> (false | untyped)
380
+ # Returns `true` if the given `node` is a `class` or `module` declaration that only contains module/class definitions
381
+ #
382
+ def namespace_module?: (Parser::AST::Node node) -> bool
338
383
 
339
384
  def type_any_rec: (Parser::AST::Node node) -> Pair
340
385
 
341
386
  def unwrap: (AST::Types::t `type`) -> AST::Types::t
342
387
 
388
+ # Returns `nil` if `type` is recursive
389
+ #
390
+ # See `Factory#deep_expand_alias`.
391
+ #
343
392
  def deep_expand_alias: (AST::Types::t `type`) -> AST::Types::t?
344
393
 
345
- def flatten_union: (AST::Types::t `type`) -> Array[AST::Types::t]
394
+ # `A | B | ... | Z` => `[A, B, ..., Z]`
395
+ def flatten_union: (AST::Types::t) -> Array[AST::Types::t]
346
396
 
347
- def select_flatten_types: (untyped `type`) { () -> untyped } -> untyped
397
+ def select_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> Array[AST::Types::t]
348
398
 
349
- def partition_flatten_types: (AST::Types::t `type`) { (AST::Types::t) -> boolish } -> [Array[AST::Types::t], Array[AST::Types::t]]
399
+ def partition_flatten_types: (AST::Types::t) { (AST::Types::t) -> boolish } -> [Array[AST::Types::t], Array[AST::Types::t]]
350
400
 
351
- def flatten_array_elements: (untyped `type`) -> untyped
401
+ def flatten_array_elements: (AST::Types::t) -> Array[AST::Types::t]
352
402
 
353
403
  def expand_alias: (AST::Types::t `type`) -> AST::Types::t
354
404
  | [A] (AST::Types::t) { (AST::Types::t) -> A } -> A
@@ -357,7 +407,12 @@ module Steep
357
407
 
358
408
  def to_instance_type: (untyped `type`, ?args: untyped?) -> untyped
359
409
 
360
- def try_tuple_type!: (Parser::AST::Node node, ?hint: AST::Types::Tuple?) -> Pair
410
+ # Synthesize the type of a node, assuming it has tuple type when possible
411
+ #
412
+ # * Try `#try_tuple_type` if applicable, or
413
+ # * Run the normal `#synthesize` else
414
+ #
415
+ def try_tuple_type!: (Parser::AST::Node node, ?hint: AST::Types::t?) -> Pair
361
416
 
362
417
  # Try to give `array_node` a tuple type
363
418
  #
@@ -428,22 +483,36 @@ module Steep
428
483
  # * When hint is union type, it tries recursively with the union cases.
429
484
  # * Otherwise, it tries to be a hash instance.
430
485
  #
431
- def type_hash: (untyped hash_node, hint: untyped) -> untyped
486
+ def type_hash: (Parser::AST::Node hash_node, hint: AST::Types::t?) -> untyped
432
487
 
433
488
  # Returns the first one from elements of `types` that returns a type `t` where `t <: hint`.
434
489
  #
435
490
  def pick_one_of: (Array[AST::Types::t] types, range: untyped) { (AST::Types::t hint, TypeConstruction) -> Pair? } -> Pair?
436
491
 
437
- def save_typing: () -> untyped
492
+ # *Commit* the transaction (current typing) and returns a `TypeConstruction` with saved typing
493
+ #
494
+ # ```ruby
495
+ # transaction = typing.new_child(range) {|child| constr.with_new_typing(child) }
496
+ #
497
+ # # Do something that may fail
498
+ #
499
+ # if succeeded
500
+ # # Commit the may-fail operation
501
+ # constr = transaction.save_typing()
502
+ # else
503
+ # # Abort the transaction
504
+ # end
505
+ # ```
506
+ def save_typing: () -> TypeConstruction
438
507
 
439
- # Returns `true` if a method call can be identified as _pure_.
508
+ # Returns `true` if a method call can be identified as _pure_:
440
509
  #
441
- # * The `node` is not a call with call
442
- # * It always calls _pure_ method
443
- # * The `receiver` is _pure_
510
+ # * The `node` is not a call with block,
511
+ # * It always calls _pure_ method,
512
+ # * The `receiver` is _pure_, and
444
513
  # * All of the arguments are _pure_
445
514
  #
446
- def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node receiver, Array[Parser::AST::Node] arguments) -> bool
515
+ def pure_send?: (TypeInference::MethodCall::Typed call, Parser::AST::Node? receiver, Array[Parser::AST::Node] arguments) -> bool
447
516
 
448
517
  # Transform given `node` to a node that has a local variable instead of the outer most call/non-value node
449
518
  #
@@ -149,6 +149,10 @@ module Steep
149
149
 
150
150
  def each: () { (Param | MultipleParam) -> void } -> void
151
151
  | () -> Enumerator[Param | MultipleParam, void]
152
+
153
+ # Yields `Param` recursively
154
+ #
155
+ def each_single_param: () { (Param) -> void } -> void
152
156
  end
153
157
  end
154
158
  end
@@ -1,31 +1,45 @@
1
+ use Steep::Interface::Function::Params, Steep::Interface::Block
2
+
1
3
  module Steep
2
4
  module TypeInference
5
+ # Type checking context
3
6
  class Context
7
+ # Information about the method which the body is being type checked
8
+ #
4
9
  class MethodContext
10
+ # Name of the method
5
11
  attr_reader name: Symbol?
6
12
 
13
+ # `nil` when RBS doesn't have the corresponding method definition
7
14
  attr_reader method: RBS::Definition::Method?
8
15
 
16
+ # `nil` when no method type is given
9
17
  attr_reader method_type: Interface::MethodType?
10
18
 
19
+ # Falls back to `untyped`
11
20
  attr_reader return_type: AST::Types::t
12
21
 
13
- attr_reader constructor: bool
14
-
22
+ # The *super* method if identified
15
23
  attr_reader super_method: RBS::Definition::Method?
16
24
 
25
+ # The type of forwarding params when `...` is given
26
+ attr_reader forward_arg_type: [Params, Block?]?
27
+
17
28
  def initialize: (
18
29
  name: Symbol,
19
30
  method: RBS::Definition::Method?,
20
31
  method_type: Interface::MethodType?,
21
32
  return_type: AST::Types::t,
22
- constructor: bool,
23
- super_method: RBS::Definition::Method?
33
+ super_method: RBS::Definition::Method?,
34
+ forward_arg_type: [Params, Block?]?
24
35
  ) -> void
25
36
 
37
+ # Type of the block of the current method type
26
38
  def block_type: () -> Interface::Block?
27
39
  end
28
40
 
41
+ # Information about the block which the body is being type checked
42
+ #
29
43
  class BlockContext
30
44
  # The type of block itself
31
45
  #
@@ -38,6 +52,7 @@ module Steep
38
52
  def subst: (Interface::Substitution) -> BlockContext
39
53
  end
40
54
 
55
+ # Context about the `break` syntax
41
56
  class BreakContext
42
57
  # Type of arguments to `break` statement
43
58
  #
@@ -54,23 +69,40 @@ module Steep
54
69
  def subst: (Interface::Substitution) -> BreakContext
55
70
  end
56
71
 
72
+ # Information about the module which the body is being type checked
73
+ #
57
74
  class ModuleContext
75
+ # The type of an instance of current module
58
76
  attr_reader instance_type: AST::Types::t
59
77
 
78
+ # The type of singleton of current module
60
79
  attr_reader module_type: AST::Types::t
61
80
 
62
- attr_reader defined_instance_methods: untyped
81
+ # The set of name of instance methods that is defined in the `module`/`class` statement
82
+ attr_reader defined_instance_methods: Set[Symbol]
63
83
 
64
- attr_reader defined_module_methods: untyped
84
+ # The set of name of singleton methods that is defined in the `module`/`class` statement
85
+ attr_reader defined_module_methods: Set[Symbol]
65
86
 
87
+ # The nesting of current module
88
+ #
89
+ # Cannot be `nil`.
90
+ #
66
91
  attr_reader nesting: RBS::Resolver::context
67
92
 
68
- attr_reader implement_name: untyped
93
+ # The name that is given to `@implements` annotation
94
+ #
95
+ # `nil` when no `@implements` annotation is given.
96
+ #
97
+ attr_reader implement_name: AST::Annotation::Implements::Module?
69
98
 
99
+ # The name of the class/module.
70
100
  attr_reader class_name: RBS::TypeName
71
101
 
102
+ # The definition of the instance of the module
72
103
  attr_reader instance_definition: RBS::Definition?
73
104
 
105
+ # The definition of the singleton of the module
74
106
  attr_reader module_definition: RBS::Definition?
75
107
 
76
108
  @class_variables: Hash[Symbol, RBS::Types::t]?
@@ -78,19 +110,20 @@ module Steep
78
110
  def initialize: (
79
111
  instance_type: AST::Types::t,
80
112
  module_type: AST::Types::t,
81
- implement_name: untyped,
113
+ implement_name: AST::Annotation::Implements::Module?,
82
114
  class_name: RBS::TypeName,
83
115
  nesting: RBS::Resolver::context,
84
116
  ?instance_definition: RBS::Definition?,
85
117
  ?module_definition: RBS::Definition?
86
118
  ) -> void
87
119
 
88
- def class_variables: () -> Hash[Symbol, RBS::Types::t]?
120
+ # Returns a hash from the name of a class variable to its type
121
+ %a{pure} def class_variables: () -> Hash[Symbol, RBS::Types::t]?
89
122
 
90
123
  def update: (
91
124
  ?instance_type: AST::Types::t,
92
125
  ?module_type: AST::Types::t,
93
- ?implement_name: untyped,
126
+ ?implement_name: AST::Annotation::Implements::Module?,
94
127
  ?class_name: RBS::TypeName,
95
128
  ?instance_definition: RBS::Definition?,
96
129
  ?module_definition: RBS::Definition?,
@@ -98,6 +131,8 @@ module Steep
98
131
  ) -> ModuleContext
99
132
  end
100
133
 
134
+ # Information about the free type variables
135
+ #
101
136
  class TypeVariableContext
102
137
  attr_reader table: Hash[Symbol, Interface::TypeParam]
103
138
 
@@ -105,6 +140,7 @@ module Steep
105
140
 
106
141
  def initialize: (Array[Interface::TypeParam] type_params, ?parent_context: TypeVariableContext?) -> void
107
142
 
143
+ # Returns the upper bound of a type variable
108
144
  def []: (Symbol name) -> AST::Types::t?
109
145
 
110
146
  def upper_bounds: () -> Hash[Symbol, AST::Types::t]
@@ -112,9 +148,14 @@ module Steep
112
148
  def self.empty: () -> TypeVariableContext
113
149
  end
114
150
 
115
- attr_reader call_context: untyped
151
+ # The caller where a method is called from
152
+ attr_reader call_context: MethodCall::context
116
153
 
117
- attr_reader method_context: untyped
154
+ # MethodContext for current execution point
155
+ #
156
+ # `nil` when not in any method definition.
157
+ #
158
+ attr_reader method_context: MethodContext?
118
159
 
119
160
  # BlockContext for current execution point
120
161
  #
@@ -122,10 +163,17 @@ module Steep
122
163
  #
123
164
  attr_reader block_context: BlockContext?
124
165
 
166
+ # BreakContext for current execution point
167
+ #
168
+ # `nil` if `break` is not allowed.
169
+ #
125
170
  attr_reader break_context: BreakContext?
126
171
 
127
- attr_reader module_context: ModuleContext?
172
+ # ModuleContext for current execution point
173
+ attr_reader module_context: ModuleContext
128
174
 
175
+ # The type of `self`
176
+ #
129
177
  attr_reader self_type: AST::Types::t
130
178
 
131
179
  attr_reader type_env: TypeEnv
@@ -133,25 +181,25 @@ module Steep
133
181
  attr_reader variable_context: TypeVariableContext
134
182
 
135
183
  def initialize: (
136
- method_context: untyped,
184
+ method_context: MethodContext?,
137
185
  block_context: BlockContext?,
138
186
  break_context: BreakContext?,
139
- module_context: ModuleContext?,
140
- self_type: untyped,
187
+ module_context: ModuleContext,
188
+ self_type: AST::Types::t,
141
189
  type_env: TypeEnv,
142
- call_context: untyped,
190
+ call_context: MethodCall::context,
143
191
  variable_context: TypeVariableContext
144
192
  ) -> void
145
193
 
146
194
  def with: (
147
- ?method_context: untyped,
195
+ ?method_context: MethodContext?,
148
196
  ?block_context: BlockContext?,
149
197
  ?break_context: BreakContext?,
150
- ?module_context: ModuleContext?,
151
- ?self_type: untyped,
198
+ ?module_context: ModuleContext,
199
+ ?self_type: AST::Types::t,
152
200
  ?type_env: TypeEnv,
153
- ?call_context: untyped,
154
- ?variable_context: untyped
201
+ ?call_context: MethodCall::context,
202
+ ?variable_context: TypeVariableContext
155
203
  ) -> Context
156
204
 
157
205
  def factory: () -> AST::Types::Factory
@@ -1,24 +1,31 @@
1
+ use Parser::AST::Node, Steep::Interface::MethodType
2
+ use Steep::Interface::Function::Params, Steep::Interface::Block
3
+
1
4
  module Steep
2
5
  module TypeInference
6
+ # A MethodParams object provides the information of parameters from MethodType and nodes
7
+ #
8
+ # It primarly provides a mapping from a local variable (method parameter) to its type.
9
+ #
3
10
  class MethodParams
4
11
  class BaseParameter
5
12
  attr_reader name: Symbol
6
13
 
7
- attr_reader type: untyped
14
+ attr_reader type: AST::Types::t?
8
15
 
9
- attr_reader node: Parser::AST::Node
16
+ attr_reader node: Node
10
17
 
11
- def initialize: (name: Symbol, type: untyped, node: Parser::AST::Node) -> void
18
+ def initialize: (name: Symbol, type: AST::Types::t?, node: Node) -> void
12
19
 
13
20
  def optional?: () -> bool
14
21
 
15
- def value: () -> Parser::AST::Node
22
+ def value: () -> Node?
16
23
 
17
24
  def var_type: () -> AST::Types::t
18
25
 
19
26
  def untyped?: () -> bool
20
27
 
21
- def ==: (untyped other) -> untyped
28
+ def ==: (untyped other) -> bool
22
29
 
23
30
  alias eql? ==
24
31
 
@@ -34,27 +41,25 @@ module Steep
34
41
  class BaseRestParameter
35
42
  attr_reader name: Symbol
36
43
 
37
- attr_reader type: untyped
44
+ attr_reader type: AST::Types::t?
38
45
 
39
- attr_reader node: Parser::AST::Node
46
+ attr_reader node: Node
40
47
 
41
- def initialize: (name: Symbol, type: untyped, node: Parser::AST::Node) -> void
48
+ def initialize: (name: Symbol, type: AST::Types::t?, node: Node) -> void
42
49
 
43
50
  def ==: (untyped other) -> bool
44
51
 
45
52
  alias eql? ==
46
53
 
47
54
  def hash: () -> Integer
48
-
49
- def var_type: () -> AST::Types::t
50
55
  end
51
56
 
52
57
  class PositionalRestParameter < BaseRestParameter
53
- def var_type: () -> AST::Types::t
58
+ def var_type: () -> AST::Types::Name::Instance
54
59
  end
55
60
 
56
61
  class KeywordRestParameter < BaseRestParameter
57
- def var_type: () -> AST::Types::t
62
+ def var_type: () -> AST::Types::Name::Instance
58
63
  end
59
64
 
60
65
  class BlockParameter
@@ -62,11 +67,11 @@ module Steep
62
67
 
63
68
  attr_reader type: Interface::Function?
64
69
 
65
- attr_reader node: Parser::AST::Node
70
+ attr_reader node: Node
66
71
 
67
72
  attr_reader self_type: AST::Types::t?
68
73
 
69
- def initialize: (name: Symbol, type: Interface::Function?, node: Parser::AST::Node, optional: boolish, self_type: AST::Types::t?) -> void
74
+ def initialize: (name: Symbol, type: Interface::Function?, node: Node, optional: boolish, self_type: AST::Types::t?) -> void
70
75
 
71
76
  @optional: boolish
72
77
 
@@ -81,28 +86,42 @@ module Steep
81
86
  def hash: () -> Integer
82
87
  end
83
88
 
84
- attr_reader args: untyped
89
+ type param = PositionalParameter | KeywordParameter | PositionalRestParameter | KeywordRestParameter | BlockParameter
90
+
91
+ # The children of `:args` node
92
+ attr_reader args: Array[Node]
93
+
94
+ attr_reader method_type: MethodType?
85
95
 
86
- attr_reader method_type: untyped
96
+ # Mapping from the name of parameter to parameter object
97
+ attr_reader params: Hash[Symbol, param]
87
98
 
88
- attr_reader params: untyped
99
+ attr_reader errors: Array[Diagnostic::Ruby::Base]
89
100
 
90
- attr_reader errors: untyped
101
+ # The type of `...`
102
+ #
103
+ # `nil` if the node doesn't have it.
104
+ #
105
+ attr_reader forward_arg_type: [Params, Block?]?
91
106
 
92
- def initialize: (args: untyped, method_type: untyped) -> void
107
+ def initialize: (args: Array[Node], method_type: MethodType?, forward_arg_type: [Params, Block?]?) -> void
93
108
 
94
- def []: (untyped name) -> untyped
109
+ def []: (Symbol name) -> param
110
+
111
+ def param?: (Symbol) -> bool
95
112
 
96
113
  def size: () -> Integer
97
114
 
98
- def each_param: () { (BaseParameter | BaseRestParameter | BlockParameter) -> void } -> void
99
- | () -> Enumerator[BaseParameter | BaseRestParameter | BlockParameter, void]
115
+ def each_param: () { (param) -> void } -> void
116
+ | () -> Enumerator[param, void]
100
117
 
101
118
  def each: () { (Symbol, AST::Types::t) -> void } -> void
102
119
 
103
- def self.empty: (node: Parser::AST::Node) -> MethodParams
120
+ def update: (?forward_arg_type: [Params, Block?]?) -> MethodParams
121
+
122
+ def self.empty: (node: Node) -> MethodParams
104
123
 
105
- def self.build: (node: Parser::AST::Node, method_type: untyped) -> MethodParams
124
+ def self.build: (node: Node, method_type: MethodType) -> MethodParams
106
125
  end
107
126
  end
108
127
  end
@@ -59,7 +59,7 @@ module Steep
59
59
  # Returns a type hint for multiple assignment right hand side
60
60
  #
61
61
  # It constructs a structure of tuple types, based on the assignment lhs, and variable types.
62
- #
62
+ #
63
63
  def hint_for_mlhs: (Parser::AST::Node mlhs, TypeEnv env) -> AST::Types::t?
64
64
 
65
65
  private
@@ -68,7 +68,7 @@ module Steep
68
68
 
69
69
  def following_args: () -> Array[Parser::AST::Node]
70
70
 
71
- def param: () -> Interface::Function::Params::PositionalParams::param?
71
+ %a{pure} def param: () -> Interface::Function::Params::PositionalParams::param?
72
72
 
73
73
  def update: (?index: Integer, ?positional_params: Interface::Function::Params::PositionalParams?, ?uniform: bool) -> PositionalArgs
74
74
 
@@ -198,6 +198,14 @@ module Steep
198
198
  def node_type: () -> AST::Types::t
199
199
  end
200
200
 
201
+ class ForwardedArgs
202
+ attr_reader node: Parser::AST::Node
203
+
204
+ attr_reader params: Interface::Function::Params
205
+
206
+ def initialize: (node: Parser::AST::Node, params: Interface::Function::Params) -> void
207
+ end
208
+
201
209
  attr_reader node: Parser::AST::Node
202
210
 
203
211
  attr_reader arguments: Array[Parser::AST::Node]
@@ -216,14 +224,16 @@ module Steep
216
224
 
217
225
  def kwargs_node: () -> Parser::AST::Node?
218
226
 
227
+ def forwarded_args_node: () -> Parser::AST::Node?
228
+
219
229
  def positional_arg: () -> PositionalArgs
220
230
 
221
231
  def keyword_args: () -> KeywordArgs
222
232
 
223
233
  def block_pass_arg: () -> BlockPassArg
224
234
 
225
- def each: () { (PositionalArgs::arg | KeywordArgs::arg) -> void } -> Array[Diagnostic::Ruby::Base]
226
- | () -> Enumerator[PositionalArgs::arg | KeywordArgs::arg, Array[Diagnostic::Ruby::Base]]
235
+ def each: () { (PositionalArgs::arg | KeywordArgs::arg) -> void } -> [ForwardedArgs?, Array[Diagnostic::Ruby::Base]]
236
+ | () -> Enumerator[PositionalArgs::arg | KeywordArgs::arg, [ForwardedArgs?, Array[Diagnostic::Ruby::Base]]]
227
237
  end
228
238
  end
229
239
  end