rbs 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +34 -0
- data/Rakefile +2 -0
- data/core/array.rbs +1 -1
- data/core/enumerable.rbs +1 -1
- data/core/hash.rbs +13 -5
- data/core/io.rbs +3 -3
- data/core/module.rbs +1 -1
- data/core/numeric.rbs +10 -0
- data/core/proc.rbs +1 -1
- data/core/random.rbs +4 -2
- data/core/range.rbs +2 -2
- data/core/struct.rbs +3 -2
- data/core/thread.rbs +1 -1
- data/docs/CONTRIBUTING.md +5 -3
- data/docs/sigs.md +18 -1
- data/docs/syntax.md +11 -11
- data/lib/rbs.rb +1 -0
- data/lib/rbs/ast/annotation.rb +2 -2
- data/lib/rbs/ast/comment.rb +2 -2
- data/lib/rbs/ast/declarations.rb +37 -22
- data/lib/rbs/ast/members.rb +26 -26
- data/lib/rbs/cli.rb +3 -0
- data/lib/rbs/constant_table.rb +4 -1
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder.rb +14 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +1 -0
- data/lib/rbs/definition_builder/method_builder.rb +4 -2
- data/lib/rbs/location.rb +106 -2
- data/lib/rbs/locator.rb +205 -0
- data/lib/rbs/method_type.rb +2 -2
- data/lib/rbs/parser.rb +1050 -713
- data/lib/rbs/parser.y +403 -71
- data/lib/rbs/test/hook.rb +8 -2
- data/lib/rbs/type_name.rb +2 -3
- data/lib/rbs/type_name_resolver.rb +1 -1
- data/lib/rbs/types.rb +36 -34
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +4 -2
- data/sig/annotation.rbs +1 -1
- data/sig/cli.rbs +31 -21
- data/sig/comment.rbs +1 -1
- data/sig/declarations.rbs +106 -21
- data/sig/environment.rbs +2 -2
- data/sig/location.rbs +84 -3
- data/sig/locator.rbs +44 -0
- data/sig/members.rbs +76 -12
- data/sig/method_builder.rbs +1 -1
- data/sig/method_types.rbs +1 -1
- data/sig/polyfill.rbs +13 -8
- data/sig/rbs.rbs +8 -4
- data/sig/typename.rbs +1 -1
- data/sig/types.rbs +60 -19
- data/sig/util.rbs +0 -4
- data/sig/writer.rbs +8 -2
- data/stdlib/rubygems/0/requirement.rbs +84 -2
- data/stdlib/rubygems/0/version.rbs +2 -1
- data/stdlib/shellwords/0/shellwords.rbs +252 -0
- data/steep/Gemfile.lock +16 -13
- metadata +5 -2
data/lib/rbs/parser.y
CHANGED
@@ -65,10 +65,21 @@ rule
|
|
65
65
|
reset_variable_scope
|
66
66
|
|
67
67
|
location = val[1].location + val[7].location
|
68
|
+
location = location.with_children(
|
69
|
+
required: {
|
70
|
+
keyword: val[1].location,
|
71
|
+
name: val[3].location,
|
72
|
+
end: val[7].location
|
73
|
+
},
|
74
|
+
optional: {
|
75
|
+
type_params: val[4]&.location,
|
76
|
+
lt: val[5]&.location
|
77
|
+
}
|
78
|
+
)
|
68
79
|
result = Declarations::Class.new(
|
69
80
|
name: val[3].value,
|
70
81
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
71
|
-
super_class: val[5],
|
82
|
+
super_class: val[5]&.value,
|
72
83
|
members: val[6],
|
73
84
|
annotations: val[0],
|
74
85
|
location: location,
|
@@ -79,40 +90,84 @@ rule
|
|
79
90
|
super_class:
|
80
91
|
{ result = nil }
|
81
92
|
| kLT class_name {
|
82
|
-
|
83
|
-
|
84
|
-
|
93
|
+
loc = val[1].location.with_children(
|
94
|
+
required: { name: val[1].location },
|
95
|
+
optional: { args: nil }
|
96
|
+
)
|
97
|
+
sup = Declarations::Class::Super.new(name: val[1].value, args: [], location: loc)
|
98
|
+
result = LocatedValue.new(value: sup, location: val[0].location)
|
85
99
|
}
|
86
100
|
| kLT class_name kLBRACKET type_list kRBRACKET {
|
87
|
-
|
88
|
-
|
89
|
-
|
101
|
+
loc = (val[1].location + val[4].location).with_children(
|
102
|
+
required: { name: val[1].location },
|
103
|
+
optional: { args: val[2].location + val[4].location }
|
104
|
+
)
|
105
|
+
sup = Declarations::Class::Super.new(name: val[1].value, args: val[3], location: loc)
|
106
|
+
result = LocatedValue.new(value: sup, location: val[0].location)
|
90
107
|
}
|
91
108
|
|
92
109
|
module_decl:
|
93
110
|
annotations kMODULE start_new_scope class_name module_type_params colon_module_self_types class_members kEND {
|
94
111
|
reset_variable_scope
|
95
112
|
|
113
|
+
colon_loc = val[5].location
|
114
|
+
self_loc = val[5].value.yield_self do |params|
|
115
|
+
case params.size
|
116
|
+
when 0
|
117
|
+
nil
|
118
|
+
when 1
|
119
|
+
params[0].location
|
120
|
+
else
|
121
|
+
params.first.location + params.last.location
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
96
125
|
location = val[1].location + val[7].location
|
126
|
+
location = location.with_children(
|
127
|
+
required: {
|
128
|
+
keyword: val[1].location,
|
129
|
+
name: val[3].location,
|
130
|
+
end: val[7].location
|
131
|
+
},
|
132
|
+
optional: {
|
133
|
+
type_params: val[4]&.location,
|
134
|
+
colon: colon_loc,
|
135
|
+
self_types: self_loc
|
136
|
+
}
|
137
|
+
)
|
97
138
|
result = Declarations::Module.new(
|
98
139
|
name: val[3].value,
|
99
140
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
100
|
-
self_types: val[5],
|
141
|
+
self_types: val[5].value,
|
101
142
|
members: val[6],
|
102
143
|
annotations: val[0],
|
103
144
|
location: location,
|
104
145
|
comment: leading_comment(val[0].first&.location || location)
|
105
146
|
)
|
106
147
|
}
|
107
|
-
| annotations kMODULE start_new_scope tUKEYWORD module_self_types class_members kEND {
|
148
|
+
| annotations kMODULE start_new_scope namespace tUKEYWORD module_self_types class_members kEND {
|
108
149
|
reset_variable_scope
|
109
150
|
|
110
|
-
location = val[1].location + val[
|
151
|
+
location = val[1].location + val[7].location
|
152
|
+
name_loc, colon_loc = split_kw_loc(val[4].location)
|
153
|
+
self_loc = case val[5].size
|
154
|
+
when 0
|
155
|
+
nil
|
156
|
+
when 1
|
157
|
+
val[5][0].location
|
158
|
+
else
|
159
|
+
val[5].first.location + val[5].last.location
|
160
|
+
end
|
161
|
+
location = location.with_children(
|
162
|
+
required: { keyword: val[1].location, name: name_loc, end: val[7].location },
|
163
|
+
optional: { colon: colon_loc, type_params: nil, self_types: self_loc }
|
164
|
+
)
|
165
|
+
|
111
166
|
result = Declarations::Module.new(
|
112
|
-
name: val[
|
167
|
+
name: RBS::TypeName.new(name: val[4].value, namespace: val[3]&.value || RBS::Namespace.empty),
|
113
168
|
type_params: Declarations::ModuleTypeParams.empty,
|
114
|
-
self_types: val[
|
115
|
-
members: val[
|
169
|
+
self_types: val[5],
|
170
|
+
members: val[6],
|
116
171
|
annotations: val[0],
|
117
172
|
location: location,
|
118
173
|
comment: leading_comment(val[0].first&.location || location)
|
@@ -120,9 +175,9 @@ rule
|
|
120
175
|
}
|
121
176
|
|
122
177
|
colon_module_self_types:
|
123
|
-
{ result = [] }
|
178
|
+
{ result = LocatedValue.new(value: [], location: nil) }
|
124
179
|
| kCOLON module_self_types {
|
125
|
-
result = val[1]
|
180
|
+
result = LocatedValue.new(value: val[1], location: val[0].location)
|
126
181
|
}
|
127
182
|
|
128
183
|
module_self_types:
|
@@ -138,6 +193,10 @@ rule
|
|
138
193
|
name = val[0].value
|
139
194
|
args = val[2]
|
140
195
|
location = val[0].location + val[3].location
|
196
|
+
location = location.with_children(
|
197
|
+
required: { name: val[0].location },
|
198
|
+
optional: { args: val[1].location + val[3].location }
|
199
|
+
)
|
141
200
|
|
142
201
|
case
|
143
202
|
when name.class?
|
@@ -151,7 +210,10 @@ rule
|
|
151
210
|
| qualified_name {
|
152
211
|
name = val[0].value
|
153
212
|
args = []
|
154
|
-
location = val[0].location
|
213
|
+
location = val[0].location.with_children(
|
214
|
+
required: { name: val[0].location },
|
215
|
+
optional: { args: nil }
|
216
|
+
)
|
155
217
|
|
156
218
|
case
|
157
219
|
when name.class?
|
@@ -186,35 +248,61 @@ rule
|
|
186
248
|
| signature
|
187
249
|
|
188
250
|
attribute_kind:
|
189
|
-
{ result = :instance }
|
190
|
-
| kSELF kDOT { result = :singleton }
|
251
|
+
{ result = LocatedValue.new(value: :instance, location: nil) }
|
252
|
+
| kSELF kDOT { result = LocatedValue.new(value: :singleton, location: val[0].location + val[1].location) }
|
191
253
|
|
192
254
|
attribute_member:
|
193
255
|
annotations kATTRREADER attribute_kind keyword type {
|
194
256
|
location = val[1].location + val[4].location
|
257
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
258
|
+
location = location.with_children(
|
259
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
260
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
261
|
+
)
|
195
262
|
result = Members::AttrReader.new(name: val[3].value,
|
196
263
|
ivar_name: nil,
|
197
264
|
type: val[4],
|
198
|
-
kind: val[2],
|
265
|
+
kind: val[2].value,
|
199
266
|
annotations: val[0],
|
200
267
|
location: location,
|
201
268
|
comment: leading_comment(val[0].first&.location || location))
|
202
269
|
}
|
203
270
|
| annotations kATTRREADER attribute_kind method_name attr_var_opt kCOLON type {
|
204
271
|
location = val[1].location + val[6].location
|
272
|
+
ivar_loc = val[4]&.location
|
273
|
+
case name_value = val[4]&.value
|
274
|
+
when LocatedValue
|
275
|
+
ivar_name = name_value.value
|
276
|
+
ivar_name_loc = name_value.location
|
277
|
+
when false
|
278
|
+
ivar_name = false
|
279
|
+
ivar_name_loc = nil
|
280
|
+
else
|
281
|
+
ivar_name = nil
|
282
|
+
ivar_loc = nil
|
283
|
+
end
|
284
|
+
location = location.with_children(
|
285
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
286
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
287
|
+
)
|
205
288
|
result = Members::AttrReader.new(name: val[3].value.to_sym,
|
206
|
-
ivar_name:
|
289
|
+
ivar_name: ivar_name,
|
207
290
|
type: val[6],
|
208
|
-
kind: val[2],
|
291
|
+
kind: val[2].value,
|
209
292
|
annotations: val[0],
|
210
293
|
location: location,
|
211
294
|
comment: leading_comment(val[0].first&.location || location))
|
212
295
|
}
|
213
296
|
| annotations kATTRWRITER attribute_kind keyword type {
|
214
297
|
location = val[1].location + val[4].location
|
298
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
299
|
+
location = location.with_children(
|
300
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
301
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
302
|
+
)
|
215
303
|
result = Members::AttrWriter.new(name: val[3].value,
|
216
304
|
ivar_name: nil,
|
217
|
-
kind: val[2],
|
305
|
+
kind: val[2].value,
|
218
306
|
type: val[4],
|
219
307
|
annotations: val[0],
|
220
308
|
location: location,
|
@@ -222,9 +310,26 @@ rule
|
|
222
310
|
}
|
223
311
|
| annotations kATTRWRITER attribute_kind method_name attr_var_opt kCOLON type {
|
224
312
|
location = val[1].location + val[6].location
|
313
|
+
ivar_loc = val[4]&.location
|
314
|
+
case name_value = val[4]&.value
|
315
|
+
when LocatedValue
|
316
|
+
ivar_name = name_value.value
|
317
|
+
ivar_name_loc = name_value.location
|
318
|
+
when false
|
319
|
+
ivar_name = false
|
320
|
+
ivar_name_loc = nil
|
321
|
+
else
|
322
|
+
ivar_name = nil
|
323
|
+
ivar_loc = nil
|
324
|
+
end
|
325
|
+
location = location.with_children(
|
326
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
327
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
328
|
+
)
|
329
|
+
|
225
330
|
result = Members::AttrWriter.new(name: val[3].value.to_sym,
|
226
|
-
ivar_name:
|
227
|
-
kind: val[2],
|
331
|
+
ivar_name: ivar_name,
|
332
|
+
kind: val[2].value,
|
228
333
|
type: val[6],
|
229
334
|
annotations: val[0],
|
230
335
|
location: location,
|
@@ -232,9 +337,15 @@ rule
|
|
232
337
|
}
|
233
338
|
| annotations kATTRACCESSOR attribute_kind keyword type {
|
234
339
|
location = val[1].location + val[4].location
|
340
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
341
|
+
location = location.with_children(
|
342
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
343
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
344
|
+
)
|
345
|
+
|
235
346
|
result = Members::AttrAccessor.new(name: val[3].value,
|
236
347
|
ivar_name: nil,
|
237
|
-
kind: val[2],
|
348
|
+
kind: val[2].value,
|
238
349
|
type: val[4],
|
239
350
|
annotations: val[0],
|
240
351
|
location: location,
|
@@ -242,9 +353,26 @@ rule
|
|
242
353
|
}
|
243
354
|
| annotations kATTRACCESSOR attribute_kind method_name attr_var_opt kCOLON type {
|
244
355
|
location = val[1].location + val[6].location
|
356
|
+
ivar_loc = val[4]&.location
|
357
|
+
case name_value = val[4]&.value
|
358
|
+
when LocatedValue
|
359
|
+
ivar_name = name_value.value
|
360
|
+
ivar_name_loc = name_value.location
|
361
|
+
when false
|
362
|
+
ivar_name = false
|
363
|
+
ivar_name_loc = nil
|
364
|
+
else
|
365
|
+
ivar_name = nil
|
366
|
+
ivar_loc = nil
|
367
|
+
end
|
368
|
+
location = location.with_children(
|
369
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
370
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
371
|
+
)
|
372
|
+
|
245
373
|
result = Members::AttrAccessor.new(name: val[3].value.to_sym,
|
246
|
-
ivar_name:
|
247
|
-
kind: val[2],
|
374
|
+
ivar_name: ivar_name,
|
375
|
+
kind: val[2].value,
|
248
376
|
type: val[6],
|
249
377
|
annotations: val[0],
|
250
378
|
location: location,
|
@@ -253,12 +381,21 @@ rule
|
|
253
381
|
|
254
382
|
attr_var_opt:
|
255
383
|
{ result = nil }
|
256
|
-
| kLPAREN kRPAREN { result = false }
|
257
|
-
| kLPAREN tIVAR kRPAREN {
|
384
|
+
| kLPAREN kRPAREN { result = LocatedValue.new(value: false, location: val[0].location + val[1].location) }
|
385
|
+
| kLPAREN tIVAR kRPAREN {
|
386
|
+
result = LocatedValue.new(
|
387
|
+
value: val[1],
|
388
|
+
location: val[0].location + val[2].location
|
389
|
+
)
|
390
|
+
}
|
258
391
|
|
259
392
|
var_type_member:
|
260
393
|
tIVAR kCOLON type {
|
261
|
-
location = val[0].location + val[2].location
|
394
|
+
location = (val[0].location + val[2].location).with_children(
|
395
|
+
required: { name: val[0].location, colon: val[1].location },
|
396
|
+
optional: { kind: nil }
|
397
|
+
)
|
398
|
+
|
262
399
|
result = Members::InstanceVariable.new(
|
263
400
|
name: val[0].value,
|
264
401
|
type: val[2],
|
@@ -277,7 +414,11 @@ rule
|
|
277
414
|
)
|
278
415
|
end
|
279
416
|
|
280
|
-
location = val[0].location + val[2].location
|
417
|
+
location = (val[0].location + val[2].location).with_children(
|
418
|
+
required: { name: val[0].location, colon: val[1].location },
|
419
|
+
optional: { kind: nil }
|
420
|
+
)
|
421
|
+
|
281
422
|
result = Members::ClassVariable.new(
|
282
423
|
name: val[0].value,
|
283
424
|
type: type,
|
@@ -296,7 +437,11 @@ rule
|
|
296
437
|
)
|
297
438
|
end
|
298
439
|
|
299
|
-
location = val[0].location + val[4].location
|
440
|
+
location = (val[0].location + val[4].location).with_children(
|
441
|
+
required: { name: val[2].location, colon: val[3].location },
|
442
|
+
optional: { kind: val[0].location + val[1].location }
|
443
|
+
)
|
444
|
+
|
300
445
|
result = Members::ClassInstanceVariable.new(
|
301
446
|
name: val[2].value,
|
302
447
|
type: type,
|
@@ -310,6 +455,10 @@ rule
|
|
310
455
|
reset_variable_scope
|
311
456
|
|
312
457
|
location = val[1].location + val[6].location
|
458
|
+
location = location.with_children(
|
459
|
+
required: { keyword: val[1].location, name: val[3].location, end: val[6].location },
|
460
|
+
optional: { type_params: val[4]&.location }
|
461
|
+
)
|
313
462
|
result = Declarations::Interface.new(
|
314
463
|
name: val[3].value,
|
315
464
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
@@ -352,7 +501,12 @@ rule
|
|
352
501
|
if val[2].value.alias?
|
353
502
|
raise SemanticsError.new("Should include module or interface", subject: val[2].value, location: val[2].location)
|
354
503
|
end
|
355
|
-
|
504
|
+
|
505
|
+
location = (val[1].location + val[2].location).with_children(
|
506
|
+
required: { keyword: val[1].location, name: val[2].location },
|
507
|
+
optional: { args: nil }
|
508
|
+
)
|
509
|
+
|
356
510
|
result = Members::Include.new(name: val[2].value,
|
357
511
|
args: [],
|
358
512
|
annotations: val[0],
|
@@ -363,7 +517,12 @@ rule
|
|
363
517
|
if val[2].value.alias?
|
364
518
|
raise SemanticsError.new("Should include module or interface", subject: val[2].value, location: val[2].location)
|
365
519
|
end
|
366
|
-
|
520
|
+
|
521
|
+
location = (val[1].location + val[5].location).with_children(
|
522
|
+
required: { keyword: val[1].location, name: val[2].location },
|
523
|
+
optional: { args: val[3].location + val[5].location }
|
524
|
+
)
|
525
|
+
|
367
526
|
result = Members::Include.new(name: val[2].value,
|
368
527
|
args: val[4],
|
369
528
|
annotations: val[0],
|
@@ -376,7 +535,12 @@ rule
|
|
376
535
|
if val[2].value.alias?
|
377
536
|
raise SemanticsError.new("Should extend module or interface", subject: val[2].value, location: val[2].location)
|
378
537
|
end
|
379
|
-
|
538
|
+
|
539
|
+
location = (val[1].location + val[2].location).with_children(
|
540
|
+
required: { keyword: val[1].location, name: val[2].location },
|
541
|
+
optional: { args: nil }
|
542
|
+
)
|
543
|
+
|
380
544
|
result = Members::Extend.new(name: val[2].value,
|
381
545
|
args: [],
|
382
546
|
annotations: val[0],
|
@@ -387,7 +551,12 @@ rule
|
|
387
551
|
if val[2].value.alias?
|
388
552
|
raise SemanticsError.new("Should extend module or interface", subject: val[2].value, location: val[2].location)
|
389
553
|
end
|
390
|
-
|
554
|
+
|
555
|
+
location = (val[1].location + val[5].location).with_children(
|
556
|
+
required: { keyword: val[1].location, name: val[2].location },
|
557
|
+
optional: { args: val[3].location + val[5].location }
|
558
|
+
)
|
559
|
+
|
391
560
|
result = Members::Extend.new(name: val[2].value,
|
392
561
|
args: val[4],
|
393
562
|
annotations: val[0],
|
@@ -400,7 +569,12 @@ rule
|
|
400
569
|
unless val[2].value.class?
|
401
570
|
raise SemanticsError.new("Should prepend module", subject: val[2].value, location: val[2].location)
|
402
571
|
end
|
403
|
-
|
572
|
+
|
573
|
+
location = (val[1].location + val[2].location).with_children(
|
574
|
+
required: { keyword: val[1].location, name: val[2].location },
|
575
|
+
optional: { args: nil }
|
576
|
+
)
|
577
|
+
|
404
578
|
result = Members::Prepend.new(name: val[2].value,
|
405
579
|
args: [],
|
406
580
|
annotations: val[0],
|
@@ -411,7 +585,12 @@ rule
|
|
411
585
|
unless val[2].value.class?
|
412
586
|
raise SemanticsError.new("Should prepend module", subject: val[2].value, location: val[2].location)
|
413
587
|
end
|
414
|
-
|
588
|
+
|
589
|
+
location = (val[1].location + val[5].location).with_children(
|
590
|
+
required: { keyword: val[1].location, name: val[2].location },
|
591
|
+
optional: { args: val[3].location + val[5].location }
|
592
|
+
)
|
593
|
+
|
415
594
|
result = Members::Prepend.new(name: val[2].value,
|
416
595
|
args: val[4],
|
417
596
|
annotations: val[0],
|
@@ -429,10 +608,22 @@ rule
|
|
429
608
|
method_member:
|
430
609
|
annotations attributes overload kDEF method_kind def_name method_types {
|
431
610
|
location = val[3].location + val[6].last.location
|
611
|
+
children = {}
|
612
|
+
|
613
|
+
required_children = { keyword: val[3].location, name: val[5].location }
|
614
|
+
optional_children = { kind: nil, overload: nil }
|
615
|
+
|
616
|
+
if val[4]
|
617
|
+
kind = val[4].value
|
618
|
+
optional_children[:kind] = val[4].location
|
619
|
+
else
|
620
|
+
kind = :instance
|
621
|
+
end
|
432
622
|
|
433
623
|
last_type = val[6].last
|
434
624
|
if last_type.is_a?(LocatedValue) && last_type.value == :dot3
|
435
625
|
overload = true
|
626
|
+
optional_children[:overload] = last_type.location
|
436
627
|
val[6].pop
|
437
628
|
else
|
438
629
|
overload = false
|
@@ -440,10 +631,10 @@ rule
|
|
440
631
|
|
441
632
|
result = Members::MethodDefinition.new(
|
442
633
|
name: val[5].value,
|
443
|
-
kind:
|
634
|
+
kind: kind,
|
444
635
|
types: val[6],
|
445
636
|
annotations: val[0],
|
446
|
-
location: location,
|
637
|
+
location: location.with_children(required: required_children, optional: optional_children),
|
447
638
|
comment: leading_comment(val[0].first&.location || val[2]&.location || val[3].location),
|
448
639
|
overload: overload || !!val[2]
|
449
640
|
)
|
@@ -455,9 +646,9 @@ rule
|
|
455
646
|
}
|
456
647
|
|
457
648
|
method_kind:
|
458
|
-
{ result =
|
459
|
-
| kSELF kDOT { result = :singleton }
|
460
|
-
| kSELFQ kDOT { result = :singleton_instance }
|
649
|
+
{ result = nil }
|
650
|
+
| kSELF kDOT { result = LocatedValue.new(value: :singleton, location: val[0].location + val[1].location) }
|
651
|
+
| kSELFQ kDOT { result = LocatedValue.new(value: :singleton_instance, location: val[0].location + val[1].location) }
|
461
652
|
|
462
653
|
method_types:
|
463
654
|
method_type { result = [val[0]] }
|
@@ -498,7 +689,14 @@ rule
|
|
498
689
|
}
|
499
690
|
|
500
691
|
def_name:
|
501
|
-
keyword
|
692
|
+
keyword {
|
693
|
+
loc = val[0].location
|
694
|
+
|
695
|
+
result = LocatedValue.new(
|
696
|
+
value: val[0].value,
|
697
|
+
location: Location.new(buffer: loc.buffer, start_pos: loc.start_pos, end_pos: loc.end_pos - 1)
|
698
|
+
)
|
699
|
+
}
|
502
700
|
| method_name kCOLON {
|
503
701
|
result = LocatedValue.new(value: val[0].value.to_sym,
|
504
702
|
location: val[0].location + val[1].location)
|
@@ -555,19 +753,34 @@ rule
|
|
555
753
|
|
556
754
|
module_type_param:
|
557
755
|
type_param_check type_param_variance tUIDENT {
|
558
|
-
|
559
|
-
|
560
|
-
|
756
|
+
loc = case
|
757
|
+
when l0 = val[0].location
|
758
|
+
l0 + val[2].location
|
759
|
+
when l1 = val[1].location
|
760
|
+
l1 + val[2].location
|
761
|
+
else
|
762
|
+
val[2].location
|
763
|
+
end
|
764
|
+
loc = loc.with_children(
|
765
|
+
required: { name: val[2].location },
|
766
|
+
optional: { variance: val[1].location, unchecked: val[0].location }
|
767
|
+
)
|
768
|
+
result = Declarations::ModuleTypeParams::TypeParam.new(
|
769
|
+
name: val[2].value.to_sym,
|
770
|
+
variance: val[1].value,
|
771
|
+
skip_validation: val[0].value,
|
772
|
+
location: loc
|
773
|
+
)
|
561
774
|
}
|
562
775
|
|
563
776
|
type_param_variance:
|
564
|
-
{ result = :invariant }
|
565
|
-
| kOUT { result = :covariant }
|
566
|
-
| kIN { result = :contravariant }
|
777
|
+
{ result = LocatedValue.new(value: :invariant, location: nil) }
|
778
|
+
| kOUT { result = LocatedValue.new(value: :covariant, location: val[0].location) }
|
779
|
+
| kIN { result = LocatedValue.new(value: :contravariant, location: val[0].location) }
|
567
780
|
|
568
781
|
type_param_check:
|
569
|
-
{ result = false }
|
570
|
-
| kUNCHECKED { result = true }
|
782
|
+
{ result = LocatedValue.new(value: false, location: nil) }
|
783
|
+
| kUNCHECKED { result = LocatedValue.new(value: true, location: val[0].location) }
|
571
784
|
|
572
785
|
type_params:
|
573
786
|
{ result = nil }
|
@@ -589,6 +802,10 @@ rule
|
|
589
802
|
alias_member:
|
590
803
|
annotations kALIAS method_name method_name {
|
591
804
|
location = val[1].location + val[3].location
|
805
|
+
location = location.with_children(
|
806
|
+
required: { keyword: val[1].location, new_name: val[2].location, old_name: val[3].location },
|
807
|
+
optional: { new_kind: nil, old_kind: nil }
|
808
|
+
)
|
592
809
|
result = Members::Alias.new(
|
593
810
|
new_name: val[2].value.to_sym,
|
594
811
|
old_name: val[3].value.to_sym,
|
@@ -600,6 +817,13 @@ rule
|
|
600
817
|
}
|
601
818
|
| annotations kALIAS kSELF kDOT method_name kSELF kDOT method_name {
|
602
819
|
location = val[1].location + val[7].location
|
820
|
+
location = location.with_children(
|
821
|
+
required: { keyword: val[1].location, new_name: val[4].location, old_name: val[7].location },
|
822
|
+
optional: {
|
823
|
+
new_kind: val[2].location + val[3].location,
|
824
|
+
old_kind: val[5].location + val[6].location
|
825
|
+
}
|
826
|
+
)
|
603
827
|
result = Members::Alias.new(
|
604
828
|
new_name: val[4].value.to_sym,
|
605
829
|
old_name: val[7].value.to_sym,
|
@@ -613,16 +837,24 @@ rule
|
|
613
837
|
type_decl:
|
614
838
|
annotations kTYPE type_alias_name kEQ type {
|
615
839
|
location = val[1].location + val[4].location
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
840
|
+
location = location.with_children(
|
841
|
+
required: { keyword: val[1].location, name: val[2].location, eq: val[3].location }
|
842
|
+
)
|
843
|
+
result = Declarations::Alias.new(
|
844
|
+
name: val[2].value,
|
845
|
+
type: val[4],
|
846
|
+
annotations: val[0],
|
847
|
+
location: location,
|
848
|
+
comment: leading_comment(val[0].first&.location || location)
|
849
|
+
)
|
621
850
|
}
|
622
851
|
|
623
852
|
const_decl:
|
624
853
|
class_name kCOLON type {
|
625
854
|
location = val[0].location + val[2].location
|
855
|
+
location = location.with_children(
|
856
|
+
required: { name: val[0].location, colon: val[1].location }
|
857
|
+
)
|
626
858
|
result = Declarations::Constant.new(name: val[0].value,
|
627
859
|
type: val[2],
|
628
860
|
location: location,
|
@@ -630,6 +862,13 @@ rule
|
|
630
862
|
}
|
631
863
|
| namespace tUKEYWORD type {
|
632
864
|
location = (val[0] || val[1]).location + val[2].location
|
865
|
+
|
866
|
+
lhs_loc = (val[0] || val[1]).location + val[1].location
|
867
|
+
name_loc, colon_loc = split_kw_loc(lhs_loc)
|
868
|
+
location = location.with_children(
|
869
|
+
required: { name: name_loc, colon: colon_loc }
|
870
|
+
)
|
871
|
+
|
633
872
|
name = TypeName.new(name: val[1].value, namespace: val[0]&.value || Namespace.empty)
|
634
873
|
result = Declarations::Constant.new(name: name,
|
635
874
|
type: val[2],
|
@@ -640,6 +879,9 @@ rule
|
|
640
879
|
global_decl:
|
641
880
|
tGLOBALIDENT kCOLON type {
|
642
881
|
location = val[0].location + val[2].location
|
882
|
+
location = location.with_children(
|
883
|
+
required: { name: val[0].location, colon: val[1].location }
|
884
|
+
)
|
643
885
|
result = Declarations::Global.new(name: val[0].value.to_sym,
|
644
886
|
type: val[2],
|
645
887
|
location: location,
|
@@ -731,11 +973,23 @@ rule
|
|
731
973
|
if is_bound_variable?(name.name)
|
732
974
|
result = Types::Variable.new(name: name.name, location: location)
|
733
975
|
else
|
976
|
+
location = location.with_children(
|
977
|
+
required: { name: val[0].location },
|
978
|
+
optional: { args: nil }
|
979
|
+
)
|
734
980
|
result = Types::ClassInstance.new(name: name, args: args, location: location)
|
735
981
|
end
|
736
982
|
when name.alias?
|
983
|
+
location = location.with_children(
|
984
|
+
required: { name: val[0].location },
|
985
|
+
optional: { args: nil }
|
986
|
+
)
|
737
987
|
result = Types::Alias.new(name: name, location: location)
|
738
988
|
when name.interface?
|
989
|
+
location = location.with_children(
|
990
|
+
required: { name: val[0].location },
|
991
|
+
optional: { args: nil }
|
992
|
+
)
|
739
993
|
result = Types::Interface.new(name: name, args: args, location: location)
|
740
994
|
end
|
741
995
|
}
|
@@ -749,8 +1003,16 @@ rule
|
|
749
1003
|
if is_bound_variable?(name.name)
|
750
1004
|
raise SemanticsError.new("#{name.name} is type variable and cannot be applied", subject: name, location: location)
|
751
1005
|
end
|
1006
|
+
location = location.with_children(
|
1007
|
+
required: { name: val[0].location },
|
1008
|
+
optional: { args: val[1].location + val[3].location }
|
1009
|
+
)
|
752
1010
|
result = Types::ClassInstance.new(name: name, args: args, location: location)
|
753
1011
|
when name.interface?
|
1012
|
+
location = location.with_children(
|
1013
|
+
required: { name: val[0].location },
|
1014
|
+
optional: { args: val[1].location + val[3].location }
|
1015
|
+
)
|
754
1016
|
result = Types::Interface.new(name: name, args: args, location: location)
|
755
1017
|
else
|
756
1018
|
raise SyntaxError.new(token_str: "kLBRACKET", error_value: val[1])
|
@@ -773,8 +1035,11 @@ rule
|
|
773
1035
|
result = type
|
774
1036
|
}
|
775
1037
|
| kSINGLETON kLPAREN class_name kRPAREN {
|
776
|
-
|
777
|
-
|
1038
|
+
location = val[0].location + val[3].location
|
1039
|
+
location = location.with_children(
|
1040
|
+
required: { name: val[2].location }
|
1041
|
+
)
|
1042
|
+
result = Types::ClassSingleton.new(name: val[2].value, location: location)
|
778
1043
|
}
|
779
1044
|
| kHAT proc_type {
|
780
1045
|
type, block = val[1].value
|
@@ -968,40 +1233,97 @@ rule
|
|
968
1233
|
|
969
1234
|
required_positional:
|
970
1235
|
type var_name_opt {
|
971
|
-
|
972
|
-
|
1236
|
+
loc = val[0].location
|
1237
|
+
if var_name = val[1]
|
1238
|
+
loc = loc + var_name.location
|
1239
|
+
end
|
1240
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1241
|
+
|
1242
|
+
result = Types::Function::Param.new(
|
1243
|
+
type: val[0],
|
1244
|
+
name: var_name&.value&.to_sym,
|
1245
|
+
location: loc
|
1246
|
+
)
|
973
1247
|
}
|
974
1248
|
|
975
1249
|
optional_positional:
|
976
1250
|
kQUESTION type var_name_opt {
|
977
|
-
|
978
|
-
|
1251
|
+
loc = val[0].location + val[1].location
|
1252
|
+
if var_name = val[2]
|
1253
|
+
loc = loc + var_name.location
|
1254
|
+
end
|
1255
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1256
|
+
|
1257
|
+
result = Types::Function::Param.new(
|
1258
|
+
type: val[1],
|
1259
|
+
name: val[2]&.value&.to_sym,
|
1260
|
+
location: loc
|
1261
|
+
)
|
979
1262
|
}
|
980
1263
|
|
981
1264
|
rest_positional:
|
982
1265
|
kSTAR type var_name_opt {
|
983
|
-
|
984
|
-
|
1266
|
+
loc = val[0].location + val[1].location
|
1267
|
+
if var_name = val[2]
|
1268
|
+
loc = loc + var_name.location
|
1269
|
+
end
|
1270
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1271
|
+
|
1272
|
+
result = Types::Function::Param.new(
|
1273
|
+
type: val[1],
|
1274
|
+
name: val[2]&.value&.to_sym,
|
1275
|
+
location: loc
|
1276
|
+
)
|
985
1277
|
}
|
986
1278
|
|
987
1279
|
required_keyword:
|
988
1280
|
keyword_name type var_name_opt {
|
989
|
-
|
990
|
-
|
1281
|
+
loc = val[0].location + val[1].location
|
1282
|
+
if var_name = val[2]
|
1283
|
+
loc = loc + var_name.location
|
1284
|
+
end
|
1285
|
+
|
1286
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1287
|
+
|
1288
|
+
param = Types::Function::Param.new(
|
1289
|
+
type: val[1],
|
1290
|
+
name: val[2]&.value&.to_sym,
|
1291
|
+
location: loc
|
1292
|
+
)
|
991
1293
|
result = { val[0].value => param }
|
992
1294
|
}
|
993
1295
|
|
994
1296
|
optional_keyword:
|
995
1297
|
kQUESTION keyword_name type var_name_opt {
|
996
|
-
|
997
|
-
|
1298
|
+
loc = val[0].location + val[2].location
|
1299
|
+
if var_name = val[3]
|
1300
|
+
loc = loc + var_name.location
|
1301
|
+
end
|
1302
|
+
|
1303
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1304
|
+
|
1305
|
+
param = Types::Function::Param.new(
|
1306
|
+
type: val[2],
|
1307
|
+
name: val[3]&.value&.to_sym,
|
1308
|
+
location: loc
|
1309
|
+
)
|
998
1310
|
result = { val[1].value => param }
|
999
1311
|
}
|
1000
1312
|
|
1001
1313
|
rest_keyword:
|
1002
1314
|
kSTAR2 type var_name_opt {
|
1003
|
-
|
1004
|
-
|
1315
|
+
loc = val[0].location + val[1].location
|
1316
|
+
if var_name = val[2]
|
1317
|
+
loc = loc + var_name.location
|
1318
|
+
end
|
1319
|
+
|
1320
|
+
loc = loc.with_children(optional: { name: var_name&.location })
|
1321
|
+
|
1322
|
+
result = Types::Function::Param.new(
|
1323
|
+
type: val[1],
|
1324
|
+
name: val[2]&.value&.to_sym,
|
1325
|
+
location: loc
|
1326
|
+
)
|
1005
1327
|
}
|
1006
1328
|
|
1007
1329
|
var_name_opt:
|
@@ -1431,6 +1753,16 @@ def on_error(token_id, error_value, value_stack)
|
|
1431
1753
|
raise SyntaxError.new(token_str: token_to_str(token_id), error_value: error_value, value_stack: value_stack)
|
1432
1754
|
end
|
1433
1755
|
|
1756
|
+
def split_kw_loc(loc)
|
1757
|
+
buf = loc.buffer
|
1758
|
+
start_pos = loc.start_pos
|
1759
|
+
end_pos = loc.end_pos
|
1760
|
+
[
|
1761
|
+
Location.new(buffer: buf, start_pos: start_pos, end_pos: end_pos - 1),
|
1762
|
+
Location.new(buffer: buf, start_pos: end_pos - 1, end_pos: end_pos)
|
1763
|
+
]
|
1764
|
+
end
|
1765
|
+
|
1434
1766
|
class SyntaxError < ParsingError
|
1435
1767
|
attr_reader :token_str, :error_value, :value_stack
|
1436
1768
|
|