rbs 1.1.1 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|