rbs 1.1.1 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +5 -1
  3. data/.gitignore +2 -0
  4. data/CHANGELOG.md +81 -0
  5. data/README.md +1 -1
  6. data/Rakefile +11 -0
  7. data/Steepfile +1 -0
  8. data/core/array.rbs +2 -2
  9. data/core/basic_object.rbs +1 -1
  10. data/core/enumerable.rbs +1 -1
  11. data/core/hash.rbs +13 -5
  12. data/core/io.rbs +4 -4
  13. data/core/kernel.rbs +2 -2
  14. data/core/marshal.rbs +4 -3
  15. data/core/module.rbs +1 -1
  16. data/core/numeric.rbs +10 -0
  17. data/core/proc.rbs +1 -1
  18. data/core/random.rbs +4 -2
  19. data/core/range.rbs +2 -2
  20. data/core/struct.rbs +3 -2
  21. data/core/thread.rbs +1 -1
  22. data/docs/CONTRIBUTING.md +5 -3
  23. data/docs/rbs_by_example.md +328 -0
  24. data/docs/sigs.md +21 -2
  25. data/docs/stdlib.md +1 -1
  26. data/docs/syntax.md +11 -14
  27. data/lib/rbs.rb +1 -0
  28. data/lib/rbs/ast/annotation.rb +2 -2
  29. data/lib/rbs/ast/comment.rb +2 -2
  30. data/lib/rbs/ast/declarations.rb +37 -22
  31. data/lib/rbs/ast/members.rb +26 -26
  32. data/lib/rbs/cli.rb +3 -0
  33. data/lib/rbs/constant_table.rb +4 -1
  34. data/lib/rbs/definition.rb +1 -1
  35. data/lib/rbs/definition_builder.rb +16 -18
  36. data/lib/rbs/definition_builder/ancestor_builder.rb +10 -2
  37. data/lib/rbs/definition_builder/method_builder.rb +4 -2
  38. data/lib/rbs/errors.rb +36 -0
  39. data/lib/rbs/location.rb +106 -2
  40. data/lib/rbs/locator.rb +205 -0
  41. data/lib/rbs/method_type.rb +2 -2
  42. data/lib/rbs/parser.rb +1315 -962
  43. data/lib/rbs/parser.y +411 -75
  44. data/lib/rbs/prototype/rb.rb +7 -3
  45. data/lib/rbs/prototype/runtime.rb +118 -42
  46. data/lib/rbs/test/hook.rb +8 -2
  47. data/lib/rbs/type_name.rb +2 -3
  48. data/lib/rbs/type_name_resolver.rb +1 -1
  49. data/lib/rbs/types.rb +36 -34
  50. data/lib/rbs/version.rb +1 -1
  51. data/lib/rbs/writer.rb +4 -2
  52. data/rbs.gemspec +1 -1
  53. data/sig/ancestor_builder.rbs +2 -0
  54. data/sig/annotation.rbs +1 -1
  55. data/sig/cli.rbs +31 -21
  56. data/sig/comment.rbs +1 -1
  57. data/sig/declarations.rbs +106 -21
  58. data/sig/environment.rbs +2 -2
  59. data/sig/errors.rbs +15 -0
  60. data/sig/location.rbs +84 -3
  61. data/sig/locator.rbs +44 -0
  62. data/sig/members.rbs +76 -12
  63. data/sig/method_builder.rbs +1 -1
  64. data/sig/method_types.rbs +1 -1
  65. data/sig/namespace.rbs +1 -1
  66. data/sig/polyfill.rbs +4 -17
  67. data/sig/rbs.rbs +8 -4
  68. data/sig/typename.rbs +1 -1
  69. data/sig/types.rbs +60 -19
  70. data/sig/util.rbs +0 -4
  71. data/sig/writer.rbs +8 -2
  72. data/stdlib/dbm/0/dbm.rbs +43 -30
  73. data/stdlib/mutex_m/0/mutex_m.rbs +1 -1
  74. data/stdlib/net-http/0/net-http.rbs +1846 -0
  75. data/stdlib/optparse/0/optparse.rbs +1214 -0
  76. data/stdlib/resolv/0/resolv.rbs +1504 -0
  77. data/stdlib/rubygems/0/requirement.rbs +84 -2
  78. data/stdlib/rubygems/0/version.rbs +2 -1
  79. data/stdlib/shellwords/0/shellwords.rbs +252 -0
  80. data/stdlib/socket/0/addrinfo.rbs +469 -0
  81. data/stdlib/socket/0/basic_socket.rbs +503 -0
  82. data/stdlib/socket/0/ip_socket.rbs +72 -0
  83. data/stdlib/socket/0/socket.rbs +2687 -0
  84. data/stdlib/socket/0/tcp_server.rbs +177 -0
  85. data/stdlib/socket/0/tcp_socket.rbs +35 -0
  86. data/stdlib/socket/0/udp_socket.rbs +111 -0
  87. data/stdlib/socket/0/unix_server.rbs +154 -0
  88. data/stdlib/socket/0/unix_socket.rbs +132 -0
  89. data/stdlib/timeout/0/timeout.rbs +5 -0
  90. data/steep/Gemfile.lock +19 -16
  91. metadata +18 -11
  92. data/bin/annotate-with-rdoc +0 -153
  93. data/bin/console +0 -14
  94. data/bin/query-rdoc +0 -103
  95. data/bin/rbs-prof +0 -9
  96. data/bin/run_in_md.rb +0 -49
  97. data/bin/setup +0 -8
  98. data/bin/sort +0 -89
  99. data/bin/steep +0 -4
  100. data/bin/test_runner.rb +0 -29
data/lib/rbs/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "1.1.1"
2
+ VERSION = "1.3.1"
3
3
  end
data/lib/rbs/writer.rb CHANGED
@@ -267,8 +267,10 @@ module RBS
267
267
  end
268
268
 
269
269
  if member.overload
270
- string << padding
271
- string << "|"
270
+ if member.types.size > 0
271
+ string << padding
272
+ string << "|"
273
+ end
272
274
  string << " ...\n"
273
275
  end
274
276
 
data/rbs.gemspec CHANGED
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  # Specify which files should be added to the gem when it is released.
29
29
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
30
30
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
31
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
31
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features|bin)/}) }
32
32
  end
33
33
  spec.files << "lib/rbs/parser.rb"
34
34
  spec.bindir = "exe"
@@ -80,6 +80,7 @@ module RBS
80
80
  def interface_ancestors: (TypeName, ?building_ancestors: Array[Definition::Ancestor::t]) -> Definition::InstanceAncestors
81
81
 
82
82
  def mixin_ancestors: (Environment::ClassEntry | Environment::ModuleEntry,
83
+ TypeName,
83
84
  included_modules: Array[Definition::Ancestor::Instance]?,
84
85
  included_interfaces:Array[Definition::Ancestor::Instance]?,
85
86
  prepended_modules: Array[Definition::Ancestor::Instance]?,
@@ -87,6 +88,7 @@ module RBS
87
88
  extended_interfaces: Array[Definition::Ancestor::Instance]?) -> void
88
89
 
89
90
  def mixin_ancestors0: (AST::Declarations::Class | AST::Declarations::Module | AST::Declarations::Interface,
91
+ TypeName,
90
92
  align_params: Substitution?,
91
93
  included_modules: Array[Definition::Ancestor::Instance]?,
92
94
  included_interfaces:Array[Definition::Ancestor::Instance]?,
data/sig/annotation.rbs CHANGED
@@ -20,7 +20,7 @@ module RBS
20
20
 
21
21
  def hash: () -> Integer
22
22
 
23
- def to_json: (*untyped) -> String
23
+ include _ToJson
24
24
  end
25
25
  end
26
26
  end
data/sig/cli.rbs CHANGED
@@ -8,51 +8,61 @@ module RBS
8
8
  attr_reader repos: Array[String]
9
9
 
10
10
  def initialize: () -> void
11
-
11
+
12
12
  def loader: () -> EnvironmentLoader
13
+
14
+ def setup_library_options: (OptionParser) -> OptionParser
15
+ end
16
+
17
+ interface _IO
18
+ def puts: (*untyped) -> void
19
+
20
+ def print: (*untyped) -> void
21
+
22
+ def flush: () -> void
13
23
  end
14
24
 
15
- attr_reader stdout: IO
16
- attr_reader stderr: IO
25
+ attr_reader stdout: _IO
26
+ attr_reader stderr: _IO
17
27
 
18
28
  def initialize: (stdout: IO, stderr: IO) -> void
19
-
29
+
20
30
  COMMANDS: Array[Symbol]
21
31
 
22
32
  def library_parse: (OptionParser, options: LibraryOptions) -> void
23
-
33
+
24
34
  def parse_logging_options: (OptionParser) -> void
25
-
35
+
26
36
  def has_parser?: () -> bool
27
-
37
+
28
38
  def run: (Array[String] args) -> void
29
-
39
+
30
40
  def run_ast: (Array[String], LibraryOptions) -> void
31
-
41
+
32
42
  def run_list: (Array[String], LibraryOptions) -> void
33
-
43
+
34
44
  def run_ancestors: (Array[String], LibraryOptions) -> void
35
-
45
+
36
46
  def run_methods: (Array[String], LibraryOptions) -> void
37
-
47
+
38
48
  def run_method: (Array[String], LibraryOptions) -> void
39
-
49
+
40
50
  def run_validate: (Array[String], LibraryOptions) -> void
41
-
51
+
42
52
  def run_constant: (Array[String], LibraryOptions) -> void
43
-
53
+
44
54
  def run_paths: (Array[String], LibraryOptions) -> void
45
-
55
+
46
56
  def run_prototype: (Array[String], LibraryOptions) -> void
47
-
57
+
48
58
  def run_prototype_file: (String format, Array[String]) -> void
49
-
59
+
50
60
  def run_vendor: (Array[String], LibraryOptions) -> void
51
-
61
+
52
62
  def run_parse: (Array[String], LibraryOptions) -> void
53
-
63
+
54
64
  def run_test: (Array[String], LibraryOptions) -> void
55
-
65
+
56
66
  def test_opt: (LibraryOptions) -> String?
57
67
  end
58
68
  end
data/sig/comment.rbs CHANGED
@@ -18,7 +18,7 @@ module RBS
18
18
 
19
19
  def hash: () -> Integer
20
20
 
21
- def to_json: (*untyped) -> String
21
+ include _ToJson
22
22
 
23
23
  def concat: (string: String, location: Location?) -> self
24
24
  end
data/sig/declarations.rbs CHANGED
@@ -10,11 +10,21 @@ module RBS
10
10
 
11
11
  class ModuleTypeParams
12
12
  class TypeParam
13
+ # Key
14
+ # ^^^ name
15
+ #
16
+ # unchecked out Elem
17
+ # ^^^^^^^^^ unchecked
18
+ # ^^^ variance
19
+ # ^^^^ name
20
+ type loc = Location::WithChildren[:name, :variance | :unchecked]
21
+
13
22
  attr_reader name: Symbol
14
23
  attr_reader variance: variance
15
24
  attr_reader skip_validation: bool
25
+ attr_reader location: loc?
16
26
 
17
- def initialize: (name: Symbol, variance: variance, skip_validation: boolish) -> void
27
+ def initialize: (name: Symbol, variance: variance, skip_validation: boolish, location: loc?) -> void
18
28
 
19
29
  include _ToJson
20
30
  end
@@ -68,19 +78,42 @@ module RBS
68
78
  end
69
79
 
70
80
  class Class < Base
71
- type member = Members::t | t
72
-
73
81
  class Super
82
+ # String
83
+ # ^^^^^^ name
84
+ #
85
+ # Array[String]
86
+ # ^^^^^ name
87
+ # ^^^^^^^^ args
88
+ #
89
+ type loc = Location::WithChildren[:name, :args]
90
+
74
91
  attr_reader name: TypeName
75
92
  attr_reader args: Array[Types::t]
76
- attr_reader location: Location?
93
+ attr_reader location: loc?
77
94
 
78
- def initialize: (name: TypeName, args: Array[Types::t], location: Location?) -> void
95
+ def initialize: (name: TypeName, args: Array[Types::t], location: loc?) -> void
79
96
 
80
97
  include _HashEqual
81
98
  include _ToJson
82
99
  end
83
100
 
101
+ type member = Members::t | t
102
+
103
+ # class Foo end
104
+ # ^^^^^ keyword
105
+ # ^^^ name
106
+ # ^^^ end
107
+ #
108
+ # class Foo[A] < String end
109
+ # ^^^^^ keyword
110
+ # ^^^ name
111
+ # ^^^ type_params
112
+ # ^ lt
113
+ # ^^^ end
114
+ #
115
+ type loc = Location::WithChildren[:keyword | :name | :end, :type_params | :lt]
116
+
84
117
  include NestedDeclarationHelper
85
118
  include MixinHelper
86
119
 
@@ -89,24 +122,28 @@ module RBS
89
122
  attr_reader members: Array[member]
90
123
  attr_reader super_class: Super?
91
124
  attr_reader annotations: Array[Annotation]
92
- attr_reader location: Location?
125
+ attr_reader location: loc?
93
126
  attr_reader comment: Comment?
94
127
 
95
- def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], super_class: Super?, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
128
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], super_class: Super?, annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
96
129
 
97
130
  include _HashEqual
98
131
  include _ToJson
99
132
  end
100
133
 
101
134
  class Module < Base
102
- type member = Members::t | t
103
-
104
135
  class Self
136
+ # _Each[String]
137
+ # ^^^^^ name
138
+ # ^^^^^^^^ args
139
+ #
140
+ type loc = Location::WithChildren[:name, :args]
141
+
105
142
  attr_reader name: TypeName
106
143
  attr_reader args: Array[Types::t]
107
- attr_reader location: Location?
144
+ attr_reader location: loc?
108
145
 
109
- def initialize: (name: TypeName, args: Array[Types::t], location: Location?) -> void
146
+ def initialize: (name: TypeName, args: Array[Types::t], location: loc?) -> void
110
147
 
111
148
  include _HashEqual
112
149
  include _ToJson
@@ -114,18 +151,35 @@ module RBS
114
151
  def to_s: () -> String
115
152
  end
116
153
 
154
+ type member = Members::t | t
155
+
156
+ # module Foo end
157
+ # ^^^^^^ keyword
158
+ # ^^^ name
159
+ # ^^^ end
160
+ #
161
+ # module Foo[A] : BasicObject end
162
+ # ^^^^^^ keyword
163
+ # ^^^ name
164
+ # ^^^ type_params
165
+ # ^ colon
166
+ # ^^^^^^^^^^^ self_types
167
+ # ^^^ end
168
+ #
169
+ type loc = Location::WithChildren[:keyword | :name | :end, :type_params | :colon | :self_types]
170
+
117
171
  include NestedDeclarationHelper
118
172
  include MixinHelper
119
173
 
120
174
  attr_reader name: TypeName
121
175
  attr_reader type_params: ModuleTypeParams
122
176
  attr_reader members: Array[member]
123
- attr_reader location: Location?
177
+ attr_reader location: loc?
124
178
  attr_reader annotations: Array[Annotation]
125
179
  attr_reader self_types: Array[Self]
126
180
  attr_reader comment: Comment?
127
181
 
128
- def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], location: Location?, annotations: Array[Annotation], self_types: Array[Self], comment: Comment?) -> void
182
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], location: loc?, annotations: Array[Annotation], self_types: Array[Self], comment: Comment?) -> void
129
183
 
130
184
  include _HashEqual
131
185
  include _ToJson
@@ -134,14 +188,27 @@ module RBS
134
188
  class Interface
135
189
  type member = Members::t
136
190
 
191
+ # interface _Foo end
192
+ # ^^^^^^^^^ keyword
193
+ # ^^^^ name
194
+ # ^^^ end
195
+ #
196
+ # interface _Bar[A, B] end
197
+ # ^^^^^^^^^ keyword
198
+ # ^^^^ name
199
+ # ^^^^^^ type_params
200
+ # ^^^ end
201
+ #
202
+ type loc = Location::WithChildren[:name | :keyword | :end, :type_params]
203
+
137
204
  attr_reader name: TypeName
138
205
  attr_reader type_params: ModuleTypeParams
139
206
  attr_reader members: Array[member]
140
207
  attr_reader annotations: Array[Annotation]
141
- attr_reader location: Location?
208
+ attr_reader location: loc?
142
209
  attr_reader comment: Comment?
143
210
 
144
- def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
211
+ def initialize: (name: TypeName, type_params: ModuleTypeParams, members: Array[member], annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
145
212
 
146
213
  include MixinHelper
147
214
 
@@ -150,37 +217,55 @@ module RBS
150
217
  end
151
218
 
152
219
  class Alias < Base
220
+ # type loc = Location
221
+ # ^^^^ keyword
222
+ # ^^^ name
223
+ # ^ eq
224
+ type loc = Location::WithChildren[:keyword | :name | :eq, bot]
225
+
153
226
  attr_reader name: TypeName
154
227
  attr_reader type: Types::t
155
228
  attr_reader annotations: Array[Annotation]
156
- attr_reader location: Location?
229
+ attr_reader location: loc?
157
230
  attr_reader comment: Comment?
158
231
 
159
- def initialize: (name: TypeName, type: Types::t, annotations: Array[Annotation], location: Location?, comment: Comment?) -> void
232
+ def initialize: (name: TypeName, type: Types::t, annotations: Array[Annotation], location: loc?, comment: Comment?) -> void
160
233
 
161
234
  include _HashEqual
162
235
  include _ToJson
163
236
  end
164
237
 
165
238
  class Constant < Base
239
+ # VERSION: String
240
+ # ^^^^^^^ name
241
+ # ^ colon
242
+ #
243
+ type loc = Location::WithChildren[:name | :colon, bot]
244
+
166
245
  attr_reader name: TypeName
167
246
  attr_reader type: Types::t
168
- attr_reader location: Location?
247
+ attr_reader location: loc?
169
248
  attr_reader comment: Comment?
170
249
 
171
- def initialize: (name: TypeName, type: Types::t, location: Location?, comment: Comment?) -> void
250
+ def initialize: (name: TypeName, type: Types::t, location: loc?, comment: Comment?) -> void
172
251
 
173
252
  include _HashEqual
174
253
  include _ToJson
175
254
  end
176
255
 
177
256
  class Global < Base
257
+ # $SIZE: String
258
+ # ^^^^^ name
259
+ # ^ colon
260
+ #
261
+ type loc = Location::WithChildren[:name | :colon, bot]
262
+
178
263
  attr_reader name: Symbol
179
264
  attr_reader type: Types::t
180
- attr_reader location: Location?
265
+ attr_reader location: loc?
181
266
  attr_reader comment: Comment?
182
267
 
183
- def initialize: (name: Symbol, type: Types::t, location: Location?, comment: Comment?) -> void
268
+ def initialize: (name: Symbol, type: Types::t, location: loc?, comment: Comment?) -> void
184
269
 
185
270
  include _HashEqual
186
271
  include _ToJson
data/sig/environment.rbs CHANGED
@@ -5,7 +5,7 @@ module RBS
5
5
  interface _WithContext
6
6
  def outer: () -> Array[module_decl]
7
7
 
8
- def decl: () -> module_decl
8
+ def decl: () -> untyped
9
9
  end
10
10
 
11
11
  module ContextUtil : _WithContext
@@ -23,7 +23,7 @@ module RBS
23
23
  end
24
24
 
25
25
  attr_reader name: TypeName
26
- attr_reader decls: Array[D[module_decl]]
26
+ attr_reader decls: Array[untyped]
27
27
 
28
28
  def initialize: (name: TypeName) -> void
29
29
 
data/sig/errors.rbs CHANGED
@@ -181,4 +181,19 @@ module RBS
181
181
 
182
182
  def location: () -> Location?
183
183
  end
184
+
185
+ class MixinClassError < DefinitionError
186
+ type member = AST::Members::Include | AST::Members::Prepend | AST::Members::Extend
187
+
188
+ attr_reader type_name: TypeName
189
+ attr_reader member: member
190
+
191
+ def initialize: (type_name: TypeName, member: member) -> void
192
+
193
+ def location: () -> Location?
194
+
195
+ def self.check!: (type_name: TypeName, env: Environment, member: member) -> void
196
+
197
+ def mixin_name: () -> String
198
+ end
184
199
  end
data/sig/location.rbs CHANGED
@@ -13,40 +13,121 @@ module RBS
13
13
 
14
14
  def initialize: (buffer: Buffer, start_pos: Integer, end_pos: Integer) -> void
15
15
 
16
- def inspect: () -> ::String
16
+ def inspect: () -> String
17
17
 
18
+ # Returns the name of the buffer.
18
19
  def name: () -> untyped
19
20
 
21
+ # Line of the `start_pos` (1 origin)
20
22
  def start_line: () -> Integer
21
23
 
24
+ # Column of the `start_pos` (0 origin)
22
25
  def start_column: () -> Integer
23
26
 
27
+ # Line of the `end_pos` (1 origin)
24
28
  def end_line: () -> Integer
25
29
 
30
+ # Column of the `end_pos` (0 origin)
26
31
  def end_column: () -> Integer
27
32
 
28
33
  def start_loc: () -> Buffer::loc
29
34
 
30
35
  def end_loc: () -> Buffer::loc
31
36
 
37
+ def range: () -> Range[Integer]
38
+
39
+ # A substring of buffer associated to the location.
32
40
  def source: () -> String
33
41
 
34
42
  def to_s: () -> String
35
43
 
44
+ # Returns a string representation suitable for terminal output.
45
+ #
46
+ # Location.to_string(loc) # => a.rb:1:0...3:4
47
+ # Location.to_string(nil) # => *:*:*..*:*
48
+ #
36
49
  def self.to_string: (Location? location, ?default: ::String default) -> String
37
50
 
38
51
  def ==: (untyped other) -> bool
39
52
 
53
+ # Returns a new location with starting positionof `self` and ending position of `other`.
54
+ #
55
+ # l1 = Location.new(buffer: buffer, start_pos: 0, end_pox: x)
56
+ # l2 = Location.new(buffer: buffer, start_pos: y, end_pos: 20)
57
+ # l1 + l2 # => Location.new(buffer: buffer, start_pos: 0, end_pos: 20)
58
+ #
40
59
  def +: (Location other) -> Location
41
60
 
61
+ # Returns true if `loc` is exact predecessor of `self`.
62
+ #
63
+ # l1 = Location.new(...) # 0..10
64
+ # l2 = Location.new(...) # 10..13
65
+ # l3 = Location.new(...) # 13..20
66
+ #
67
+ # l1.pred?(l2) # => true
68
+ # l2.pred?(l3) # => true
69
+ # l1.pred?(l3) # => false
70
+ #
42
71
  def pred?: (Location loc) -> bool
43
72
 
44
- def to_json: (*untyped args) -> untyped
73
+ include _ToJson
45
74
 
46
75
  # `<<` locations given as argument.
76
+ #
47
77
  def concat: (*Location?) -> Location
48
78
 
49
- # Append given location destructively.
79
+ # Inplace version of `+`.
80
+ #
50
81
  def <<: (Location?) -> Location
82
+
83
+ # Returns WithChildren instance with given children.
84
+ #
85
+ # location.with_children(
86
+ # required: { name: name.location },
87
+ # optional: { args: nil }
88
+ # )
89
+ #
90
+ def with_children: [R, O](?required: Hash[R, Range[Integer] | Location], ?optional: Hash[O, Range[Integer] | Location | nil]) -> WithChildren[R, O]
91
+
92
+ # Location::WithChildren contains _child_ locations.
93
+ #
94
+ # # Array[String]
95
+ # # ^^^^^ <= name
96
+ # # ^^^^^^^^ <= args
97
+ # #
98
+ # # @type var loc: Location::WithChildren[:name, :args]
99
+ # loc = Location::WithChildren.new(buffer: buffer, start_pos: 0, end_pos: 13)
100
+ # loc = loc.merge_required({ name: 1...5 })
101
+ # loc = loc.merge_optional({ args: 5...13 })
102
+ #
103
+ # loc[:name] # => Location instance for `Array`
104
+ # loc[:args] # => Location instance for `[String]`
105
+ #
106
+ class WithChildren[RequiredChildKeys, OptionalChildKeys] < Location
107
+ attr_reader required_children: Hash[RequiredChildKeys, Range[Integer]]
108
+
109
+ attr_reader optional_children: Hash[OptionalChildKeys, Range[Integer]?]
110
+
111
+ def initialize: ...
112
+
113
+ def initialize_copy: ...
114
+
115
+ # Returns `Location` instance for given _child_ name.
116
+ #
117
+ # # @type var loc: Location::WithChildren[:name, :args]
118
+ # loc[:name] # => Location
119
+ # loc[:args] # => may be nil
120
+ #
121
+ # Note that passing unknown symbol raises an error even if the child is _optional_.
122
+ # You need explicitly set `nil` for absent optional children.
123
+ #
124
+ def []: (RequiredChildKeys) -> Location
125
+ | (OptionalChildKeys) -> Location?
126
+ | (Symbol) -> Location?
127
+
128
+ def merge_required: (Hash[RequiredChildKeys, Range[Integer] | Location]) -> self
129
+
130
+ def merge_optional: (Hash[OptionalChildKeys, Range[Integer] | Location | nil]) -> self
131
+ end
51
132
  end
52
133
  end