rbs 1.1.1 → 1.3.1
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/.github/workflows/ruby.yml +5 -1
- data/.gitignore +2 -0
- data/CHANGELOG.md +81 -0
- data/README.md +1 -1
- data/Rakefile +11 -0
- data/Steepfile +1 -0
- data/core/array.rbs +2 -2
- data/core/basic_object.rbs +1 -1
- data/core/enumerable.rbs +1 -1
- data/core/hash.rbs +13 -5
- data/core/io.rbs +4 -4
- data/core/kernel.rbs +2 -2
- data/core/marshal.rbs +4 -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/rbs_by_example.md +328 -0
- data/docs/sigs.md +21 -2
- data/docs/stdlib.md +1 -1
- data/docs/syntax.md +11 -14
- 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 +16 -18
- data/lib/rbs/definition_builder/ancestor_builder.rb +10 -2
- data/lib/rbs/definition_builder/method_builder.rb +4 -2
- data/lib/rbs/errors.rb +36 -0
- 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 +1315 -962
- data/lib/rbs/parser.y +411 -75
- data/lib/rbs/prototype/rb.rb +7 -3
- data/lib/rbs/prototype/runtime.rb +118 -42
- 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/rbs.gemspec +1 -1
- data/sig/ancestor_builder.rbs +2 -0
- 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/errors.rbs +15 -0
- 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/namespace.rbs +1 -1
- data/sig/polyfill.rbs +4 -17
- 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/dbm/0/dbm.rbs +43 -30
- data/stdlib/mutex_m/0/mutex_m.rbs +1 -1
- data/stdlib/net-http/0/net-http.rbs +1846 -0
- data/stdlib/optparse/0/optparse.rbs +1214 -0
- data/stdlib/resolv/0/resolv.rbs +1504 -0
- 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/stdlib/socket/0/addrinfo.rbs +469 -0
- data/stdlib/socket/0/basic_socket.rbs +503 -0
- data/stdlib/socket/0/ip_socket.rbs +72 -0
- data/stdlib/socket/0/socket.rbs +2687 -0
- data/stdlib/socket/0/tcp_server.rbs +177 -0
- data/stdlib/socket/0/tcp_socket.rbs +35 -0
- data/stdlib/socket/0/udp_socket.rbs +111 -0
- data/stdlib/socket/0/unix_server.rbs +154 -0
- data/stdlib/socket/0/unix_socket.rbs +132 -0
- data/stdlib/timeout/0/timeout.rbs +5 -0
- data/steep/Gemfile.lock +19 -16
- metadata +18 -11
- data/bin/annotate-with-rdoc +0 -153
- data/bin/console +0 -14
- data/bin/query-rdoc +0 -103
- data/bin/rbs-prof +0 -9
- data/bin/run_in_md.rb +0 -49
- data/bin/setup +0 -8
- data/bin/sort +0 -89
- data/bin/steep +0 -4
- data/bin/test_runner.rb +0 -29
data/lib/rbs/parser.y
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class RBS::Parser
|
2
|
-
token tUIDENT tLIDENT tNAMESPACE tINTERFACEIDENT tGLOBALIDENT
|
2
|
+
token tUIDENT tLIDENT tUNDERSCOREIDENT tNAMESPACE tINTERFACEIDENT tGLOBALIDENT
|
3
3
|
tLKEYWORD tUKEYWORD tLKEYWORD_Q_E tUKEYWORD_Q_E
|
4
4
|
tIVAR tCLASSVAR
|
5
5
|
tANNOTATION
|
@@ -12,6 +12,7 @@ class RBS::Parser
|
|
12
12
|
kPREPEND kEXTENSION kINCOMPATIBLE
|
13
13
|
type_TYPE type_SIGNATURE type_METHODTYPE tEOF
|
14
14
|
kOUT kIN kUNCHECKED kOVERLOAD
|
15
|
+
tPARAMNAME
|
15
16
|
|
16
17
|
prechigh
|
17
18
|
nonassoc kQUESTION
|
@@ -65,10 +66,21 @@ rule
|
|
65
66
|
reset_variable_scope
|
66
67
|
|
67
68
|
location = val[1].location + val[7].location
|
69
|
+
location = location.with_children(
|
70
|
+
required: {
|
71
|
+
keyword: val[1].location,
|
72
|
+
name: val[3].location,
|
73
|
+
end: val[7].location
|
74
|
+
},
|
75
|
+
optional: {
|
76
|
+
type_params: val[4]&.location,
|
77
|
+
lt: val[5]&.location
|
78
|
+
}
|
79
|
+
)
|
68
80
|
result = Declarations::Class.new(
|
69
81
|
name: val[3].value,
|
70
82
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
71
|
-
super_class: val[5],
|
83
|
+
super_class: val[5]&.value,
|
72
84
|
members: val[6],
|
73
85
|
annotations: val[0],
|
74
86
|
location: location,
|
@@ -79,40 +91,84 @@ rule
|
|
79
91
|
super_class:
|
80
92
|
{ result = nil }
|
81
93
|
| kLT class_name {
|
82
|
-
|
83
|
-
|
84
|
-
|
94
|
+
loc = val[1].location.with_children(
|
95
|
+
required: { name: val[1].location },
|
96
|
+
optional: { args: nil }
|
97
|
+
)
|
98
|
+
sup = Declarations::Class::Super.new(name: val[1].value, args: [], location: loc)
|
99
|
+
result = LocatedValue.new(value: sup, location: val[0].location)
|
85
100
|
}
|
86
101
|
| kLT class_name kLBRACKET type_list kRBRACKET {
|
87
|
-
|
88
|
-
|
89
|
-
|
102
|
+
loc = (val[1].location + val[4].location).with_children(
|
103
|
+
required: { name: val[1].location },
|
104
|
+
optional: { args: val[2].location + val[4].location }
|
105
|
+
)
|
106
|
+
sup = Declarations::Class::Super.new(name: val[1].value, args: val[3], location: loc)
|
107
|
+
result = LocatedValue.new(value: sup, location: val[0].location)
|
90
108
|
}
|
91
109
|
|
92
110
|
module_decl:
|
93
111
|
annotations kMODULE start_new_scope class_name module_type_params colon_module_self_types class_members kEND {
|
94
112
|
reset_variable_scope
|
95
113
|
|
114
|
+
colon_loc = val[5].location
|
115
|
+
self_loc = val[5].value.yield_self do |params|
|
116
|
+
case params.size
|
117
|
+
when 0
|
118
|
+
nil
|
119
|
+
when 1
|
120
|
+
params[0].location
|
121
|
+
else
|
122
|
+
params.first.location + params.last.location
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
96
126
|
location = val[1].location + val[7].location
|
127
|
+
location = location.with_children(
|
128
|
+
required: {
|
129
|
+
keyword: val[1].location,
|
130
|
+
name: val[3].location,
|
131
|
+
end: val[7].location
|
132
|
+
},
|
133
|
+
optional: {
|
134
|
+
type_params: val[4]&.location,
|
135
|
+
colon: colon_loc,
|
136
|
+
self_types: self_loc
|
137
|
+
}
|
138
|
+
)
|
97
139
|
result = Declarations::Module.new(
|
98
140
|
name: val[3].value,
|
99
141
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
100
|
-
self_types: val[5],
|
142
|
+
self_types: val[5].value,
|
101
143
|
members: val[6],
|
102
144
|
annotations: val[0],
|
103
145
|
location: location,
|
104
146
|
comment: leading_comment(val[0].first&.location || location)
|
105
147
|
)
|
106
148
|
}
|
107
|
-
| annotations kMODULE start_new_scope tUKEYWORD module_self_types class_members kEND {
|
149
|
+
| annotations kMODULE start_new_scope namespace tUKEYWORD module_self_types class_members kEND {
|
108
150
|
reset_variable_scope
|
109
151
|
|
110
|
-
location = val[1].location + val[
|
152
|
+
location = val[1].location + val[7].location
|
153
|
+
name_loc, colon_loc = split_kw_loc(val[4].location)
|
154
|
+
self_loc = case val[5].size
|
155
|
+
when 0
|
156
|
+
nil
|
157
|
+
when 1
|
158
|
+
val[5][0].location
|
159
|
+
else
|
160
|
+
val[5].first.location + val[5].last.location
|
161
|
+
end
|
162
|
+
location = location.with_children(
|
163
|
+
required: { keyword: val[1].location, name: name_loc, end: val[7].location },
|
164
|
+
optional: { colon: colon_loc, type_params: nil, self_types: self_loc }
|
165
|
+
)
|
166
|
+
|
111
167
|
result = Declarations::Module.new(
|
112
|
-
name: val[
|
168
|
+
name: RBS::TypeName.new(name: val[4].value, namespace: val[3]&.value || RBS::Namespace.empty),
|
113
169
|
type_params: Declarations::ModuleTypeParams.empty,
|
114
|
-
self_types: val[
|
115
|
-
members: val[
|
170
|
+
self_types: val[5],
|
171
|
+
members: val[6],
|
116
172
|
annotations: val[0],
|
117
173
|
location: location,
|
118
174
|
comment: leading_comment(val[0].first&.location || location)
|
@@ -120,9 +176,9 @@ rule
|
|
120
176
|
}
|
121
177
|
|
122
178
|
colon_module_self_types:
|
123
|
-
{ result = [] }
|
179
|
+
{ result = LocatedValue.new(value: [], location: nil) }
|
124
180
|
| kCOLON module_self_types {
|
125
|
-
result = val[1]
|
181
|
+
result = LocatedValue.new(value: val[1], location: val[0].location)
|
126
182
|
}
|
127
183
|
|
128
184
|
module_self_types:
|
@@ -138,6 +194,10 @@ rule
|
|
138
194
|
name = val[0].value
|
139
195
|
args = val[2]
|
140
196
|
location = val[0].location + val[3].location
|
197
|
+
location = location.with_children(
|
198
|
+
required: { name: val[0].location },
|
199
|
+
optional: { args: val[1].location + val[3].location }
|
200
|
+
)
|
141
201
|
|
142
202
|
case
|
143
203
|
when name.class?
|
@@ -151,7 +211,10 @@ rule
|
|
151
211
|
| qualified_name {
|
152
212
|
name = val[0].value
|
153
213
|
args = []
|
154
|
-
location = val[0].location
|
214
|
+
location = val[0].location.with_children(
|
215
|
+
required: { name: val[0].location },
|
216
|
+
optional: { args: nil }
|
217
|
+
)
|
155
218
|
|
156
219
|
case
|
157
220
|
when name.class?
|
@@ -186,35 +249,61 @@ rule
|
|
186
249
|
| signature
|
187
250
|
|
188
251
|
attribute_kind:
|
189
|
-
{ result = :instance }
|
190
|
-
| kSELF kDOT { result = :singleton }
|
252
|
+
{ result = LocatedValue.new(value: :instance, location: nil) }
|
253
|
+
| kSELF kDOT { result = LocatedValue.new(value: :singleton, location: val[0].location + val[1].location) }
|
191
254
|
|
192
255
|
attribute_member:
|
193
256
|
annotations kATTRREADER attribute_kind keyword type {
|
194
257
|
location = val[1].location + val[4].location
|
258
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
259
|
+
location = location.with_children(
|
260
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
261
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
262
|
+
)
|
195
263
|
result = Members::AttrReader.new(name: val[3].value,
|
196
264
|
ivar_name: nil,
|
197
265
|
type: val[4],
|
198
|
-
kind: val[2],
|
266
|
+
kind: val[2].value,
|
199
267
|
annotations: val[0],
|
200
268
|
location: location,
|
201
269
|
comment: leading_comment(val[0].first&.location || location))
|
202
270
|
}
|
203
271
|
| annotations kATTRREADER attribute_kind method_name attr_var_opt kCOLON type {
|
204
272
|
location = val[1].location + val[6].location
|
273
|
+
ivar_loc = val[4]&.location
|
274
|
+
case name_value = val[4]&.value
|
275
|
+
when LocatedValue
|
276
|
+
ivar_name = name_value.value
|
277
|
+
ivar_name_loc = name_value.location
|
278
|
+
when false
|
279
|
+
ivar_name = false
|
280
|
+
ivar_name_loc = nil
|
281
|
+
else
|
282
|
+
ivar_name = nil
|
283
|
+
ivar_loc = nil
|
284
|
+
end
|
285
|
+
location = location.with_children(
|
286
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
287
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
288
|
+
)
|
205
289
|
result = Members::AttrReader.new(name: val[3].value.to_sym,
|
206
|
-
ivar_name:
|
290
|
+
ivar_name: ivar_name,
|
207
291
|
type: val[6],
|
208
|
-
kind: val[2],
|
292
|
+
kind: val[2].value,
|
209
293
|
annotations: val[0],
|
210
294
|
location: location,
|
211
295
|
comment: leading_comment(val[0].first&.location || location))
|
212
296
|
}
|
213
297
|
| annotations kATTRWRITER attribute_kind keyword type {
|
214
298
|
location = val[1].location + val[4].location
|
299
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
300
|
+
location = location.with_children(
|
301
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
302
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
303
|
+
)
|
215
304
|
result = Members::AttrWriter.new(name: val[3].value,
|
216
305
|
ivar_name: nil,
|
217
|
-
kind: val[2],
|
306
|
+
kind: val[2].value,
|
218
307
|
type: val[4],
|
219
308
|
annotations: val[0],
|
220
309
|
location: location,
|
@@ -222,9 +311,26 @@ rule
|
|
222
311
|
}
|
223
312
|
| annotations kATTRWRITER attribute_kind method_name attr_var_opt kCOLON type {
|
224
313
|
location = val[1].location + val[6].location
|
314
|
+
ivar_loc = val[4]&.location
|
315
|
+
case name_value = val[4]&.value
|
316
|
+
when LocatedValue
|
317
|
+
ivar_name = name_value.value
|
318
|
+
ivar_name_loc = name_value.location
|
319
|
+
when false
|
320
|
+
ivar_name = false
|
321
|
+
ivar_name_loc = nil
|
322
|
+
else
|
323
|
+
ivar_name = nil
|
324
|
+
ivar_loc = nil
|
325
|
+
end
|
326
|
+
location = location.with_children(
|
327
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
328
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
329
|
+
)
|
330
|
+
|
225
331
|
result = Members::AttrWriter.new(name: val[3].value.to_sym,
|
226
|
-
ivar_name:
|
227
|
-
kind: val[2],
|
332
|
+
ivar_name: ivar_name,
|
333
|
+
kind: val[2].value,
|
228
334
|
type: val[6],
|
229
335
|
annotations: val[0],
|
230
336
|
location: location,
|
@@ -232,9 +338,15 @@ rule
|
|
232
338
|
}
|
233
339
|
| annotations kATTRACCESSOR attribute_kind keyword type {
|
234
340
|
location = val[1].location + val[4].location
|
341
|
+
name_loc, colon_loc = split_kw_loc(val[3].location)
|
342
|
+
location = location.with_children(
|
343
|
+
required: { keyword: val[1].location, name: name_loc, colon: colon_loc },
|
344
|
+
optional: { ivar: nil, ivar_name: nil, kind: val[2].location }
|
345
|
+
)
|
346
|
+
|
235
347
|
result = Members::AttrAccessor.new(name: val[3].value,
|
236
348
|
ivar_name: nil,
|
237
|
-
kind: val[2],
|
349
|
+
kind: val[2].value,
|
238
350
|
type: val[4],
|
239
351
|
annotations: val[0],
|
240
352
|
location: location,
|
@@ -242,9 +354,26 @@ rule
|
|
242
354
|
}
|
243
355
|
| annotations kATTRACCESSOR attribute_kind method_name attr_var_opt kCOLON type {
|
244
356
|
location = val[1].location + val[6].location
|
357
|
+
ivar_loc = val[4]&.location
|
358
|
+
case name_value = val[4]&.value
|
359
|
+
when LocatedValue
|
360
|
+
ivar_name = name_value.value
|
361
|
+
ivar_name_loc = name_value.location
|
362
|
+
when false
|
363
|
+
ivar_name = false
|
364
|
+
ivar_name_loc = nil
|
365
|
+
else
|
366
|
+
ivar_name = nil
|
367
|
+
ivar_loc = nil
|
368
|
+
end
|
369
|
+
location = location.with_children(
|
370
|
+
required: { keyword: val[1].location, name: val[3].location, colon: val[5].location },
|
371
|
+
optional: { ivar: ivar_loc, ivar_name: ivar_name_loc, kind: val[2].location }
|
372
|
+
)
|
373
|
+
|
245
374
|
result = Members::AttrAccessor.new(name: val[3].value.to_sym,
|
246
|
-
ivar_name:
|
247
|
-
kind: val[2],
|
375
|
+
ivar_name: ivar_name,
|
376
|
+
kind: val[2].value,
|
248
377
|
type: val[6],
|
249
378
|
annotations: val[0],
|
250
379
|
location: location,
|
@@ -253,12 +382,21 @@ rule
|
|
253
382
|
|
254
383
|
attr_var_opt:
|
255
384
|
{ result = nil }
|
256
|
-
| kLPAREN kRPAREN { result = false }
|
257
|
-
| kLPAREN tIVAR kRPAREN {
|
385
|
+
| kLPAREN kRPAREN { result = LocatedValue.new(value: false, location: val[0].location + val[1].location) }
|
386
|
+
| kLPAREN tIVAR kRPAREN {
|
387
|
+
result = LocatedValue.new(
|
388
|
+
value: val[1],
|
389
|
+
location: val[0].location + val[2].location
|
390
|
+
)
|
391
|
+
}
|
258
392
|
|
259
393
|
var_type_member:
|
260
394
|
tIVAR kCOLON type {
|
261
|
-
location = val[0].location + val[2].location
|
395
|
+
location = (val[0].location + val[2].location).with_children(
|
396
|
+
required: { name: val[0].location, colon: val[1].location },
|
397
|
+
optional: { kind: nil }
|
398
|
+
)
|
399
|
+
|
262
400
|
result = Members::InstanceVariable.new(
|
263
401
|
name: val[0].value,
|
264
402
|
type: val[2],
|
@@ -277,7 +415,11 @@ rule
|
|
277
415
|
)
|
278
416
|
end
|
279
417
|
|
280
|
-
location = val[0].location + val[2].location
|
418
|
+
location = (val[0].location + val[2].location).with_children(
|
419
|
+
required: { name: val[0].location, colon: val[1].location },
|
420
|
+
optional: { kind: nil }
|
421
|
+
)
|
422
|
+
|
281
423
|
result = Members::ClassVariable.new(
|
282
424
|
name: val[0].value,
|
283
425
|
type: type,
|
@@ -296,7 +438,11 @@ rule
|
|
296
438
|
)
|
297
439
|
end
|
298
440
|
|
299
|
-
location = val[0].location + val[4].location
|
441
|
+
location = (val[0].location + val[4].location).with_children(
|
442
|
+
required: { name: val[2].location, colon: val[3].location },
|
443
|
+
optional: { kind: val[0].location + val[1].location }
|
444
|
+
)
|
445
|
+
|
300
446
|
result = Members::ClassInstanceVariable.new(
|
301
447
|
name: val[2].value,
|
302
448
|
type: type,
|
@@ -310,6 +456,10 @@ rule
|
|
310
456
|
reset_variable_scope
|
311
457
|
|
312
458
|
location = val[1].location + val[6].location
|
459
|
+
location = location.with_children(
|
460
|
+
required: { keyword: val[1].location, name: val[3].location, end: val[6].location },
|
461
|
+
optional: { type_params: val[4]&.location }
|
462
|
+
)
|
313
463
|
result = Declarations::Interface.new(
|
314
464
|
name: val[3].value,
|
315
465
|
type_params: val[4]&.value || Declarations::ModuleTypeParams.empty,
|
@@ -352,7 +502,12 @@ rule
|
|
352
502
|
if val[2].value.alias?
|
353
503
|
raise SemanticsError.new("Should include module or interface", subject: val[2].value, location: val[2].location)
|
354
504
|
end
|
355
|
-
|
505
|
+
|
506
|
+
location = (val[1].location + val[2].location).with_children(
|
507
|
+
required: { keyword: val[1].location, name: val[2].location },
|
508
|
+
optional: { args: nil }
|
509
|
+
)
|
510
|
+
|
356
511
|
result = Members::Include.new(name: val[2].value,
|
357
512
|
args: [],
|
358
513
|
annotations: val[0],
|
@@ -363,7 +518,12 @@ rule
|
|
363
518
|
if val[2].value.alias?
|
364
519
|
raise SemanticsError.new("Should include module or interface", subject: val[2].value, location: val[2].location)
|
365
520
|
end
|
366
|
-
|
521
|
+
|
522
|
+
location = (val[1].location + val[5].location).with_children(
|
523
|
+
required: { keyword: val[1].location, name: val[2].location },
|
524
|
+
optional: { args: val[3].location + val[5].location }
|
525
|
+
)
|
526
|
+
|
367
527
|
result = Members::Include.new(name: val[2].value,
|
368
528
|
args: val[4],
|
369
529
|
annotations: val[0],
|
@@ -376,7 +536,12 @@ rule
|
|
376
536
|
if val[2].value.alias?
|
377
537
|
raise SemanticsError.new("Should extend module or interface", subject: val[2].value, location: val[2].location)
|
378
538
|
end
|
379
|
-
|
539
|
+
|
540
|
+
location = (val[1].location + val[2].location).with_children(
|
541
|
+
required: { keyword: val[1].location, name: val[2].location },
|
542
|
+
optional: { args: nil }
|
543
|
+
)
|
544
|
+
|
380
545
|
result = Members::Extend.new(name: val[2].value,
|
381
546
|
args: [],
|
382
547
|
annotations: val[0],
|
@@ -387,7 +552,12 @@ rule
|
|
387
552
|
if val[2].value.alias?
|
388
553
|
raise SemanticsError.new("Should extend module or interface", subject: val[2].value, location: val[2].location)
|
389
554
|
end
|
390
|
-
|
555
|
+
|
556
|
+
location = (val[1].location + val[5].location).with_children(
|
557
|
+
required: { keyword: val[1].location, name: val[2].location },
|
558
|
+
optional: { args: val[3].location + val[5].location }
|
559
|
+
)
|
560
|
+
|
391
561
|
result = Members::Extend.new(name: val[2].value,
|
392
562
|
args: val[4],
|
393
563
|
annotations: val[0],
|
@@ -400,7 +570,12 @@ rule
|
|
400
570
|
unless val[2].value.class?
|
401
571
|
raise SemanticsError.new("Should prepend module", subject: val[2].value, location: val[2].location)
|
402
572
|
end
|
403
|
-
|
573
|
+
|
574
|
+
location = (val[1].location + val[2].location).with_children(
|
575
|
+
required: { keyword: val[1].location, name: val[2].location },
|
576
|
+
optional: { args: nil }
|
577
|
+
)
|
578
|
+
|
404
579
|
result = Members::Prepend.new(name: val[2].value,
|
405
580
|
args: [],
|
406
581
|
annotations: val[0],
|
@@ -411,7 +586,12 @@ rule
|
|
411
586
|
unless val[2].value.class?
|
412
587
|
raise SemanticsError.new("Should prepend module", subject: val[2].value, location: val[2].location)
|
413
588
|
end
|
414
|
-
|
589
|
+
|
590
|
+
location = (val[1].location + val[5].location).with_children(
|
591
|
+
required: { keyword: val[1].location, name: val[2].location },
|
592
|
+
optional: { args: val[3].location + val[5].location }
|
593
|
+
)
|
594
|
+
|
415
595
|
result = Members::Prepend.new(name: val[2].value,
|
416
596
|
args: val[4],
|
417
597
|
annotations: val[0],
|
@@ -430,9 +610,20 @@ rule
|
|
430
610
|
annotations attributes overload kDEF method_kind def_name method_types {
|
431
611
|
location = val[3].location + val[6].last.location
|
432
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
|
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,44 +1233,101 @@ 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:
|
1008
|
-
| tLIDENT | tINTERFACEIDENT | tQUOTEDIDENT
|
1330
|
+
| tLIDENT | tINTERFACEIDENT | tQUOTEDIDENT | tUNDERSCOREIDENT | tPARAMNAME
|
1009
1331
|
|
1010
1332
|
qualified_name:
|
1011
1333
|
namespace simple_name {
|
@@ -1392,12 +1714,16 @@ def next_token
|
|
1392
1714
|
new_token(:tIVAR, input.matched.to_sym)
|
1393
1715
|
when input.scan(/@@[a-zA-Z_]\w*/)
|
1394
1716
|
new_token(:tCLASSVAR, input.matched.to_sym)
|
1395
|
-
when input.scan(/_[
|
1717
|
+
when input.scan(/_[A-Z]\w*\b/)
|
1396
1718
|
new_token(:tINTERFACEIDENT)
|
1397
1719
|
when input.scan(/[A-Z]\w*\b/)
|
1398
1720
|
new_token(:tUIDENT)
|
1399
|
-
when input.scan(/[a-
|
1721
|
+
when input.scan(/[a-z]\w*\b/)
|
1400
1722
|
new_token(:tLIDENT)
|
1723
|
+
when input.scan(/_[a-z]\w*\b/)
|
1724
|
+
new_token(:tUNDERSCOREIDENT)
|
1725
|
+
when input.scan(/_[\w_]*\b/)
|
1726
|
+
new_token(:tPARAMNAME)
|
1401
1727
|
when input.scan(/"(\\"|[^"])*"/)
|
1402
1728
|
s = input.matched.yield_self {|s| s[1, s.length - 2] }
|
1403
1729
|
.gsub(DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE) do |match|
|
@@ -1431,6 +1757,16 @@ def on_error(token_id, error_value, value_stack)
|
|
1431
1757
|
raise SyntaxError.new(token_str: token_to_str(token_id), error_value: error_value, value_stack: value_stack)
|
1432
1758
|
end
|
1433
1759
|
|
1760
|
+
def split_kw_loc(loc)
|
1761
|
+
buf = loc.buffer
|
1762
|
+
start_pos = loc.start_pos
|
1763
|
+
end_pos = loc.end_pos
|
1764
|
+
[
|
1765
|
+
Location.new(buffer: buf, start_pos: start_pos, end_pos: end_pos - 1),
|
1766
|
+
Location.new(buffer: buf, start_pos: end_pos - 1, end_pos: end_pos)
|
1767
|
+
]
|
1768
|
+
end
|
1769
|
+
|
1434
1770
|
class SyntaxError < ParsingError
|
1435
1771
|
attr_reader :token_str, :error_value, :value_stack
|
1436
1772
|
|