rbs 0.19.0 → 0.20.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 +8 -0
- data/core/hash.rbs +1 -3
- data/core/time.rbs +0 -12
- data/lib/rbs/ast/members.rb +9 -3
- data/lib/rbs/definition_builder.rb +80 -61
- data/lib/rbs/environment.rb +3 -0
- data/lib/rbs/method_type.rb +1 -31
- data/lib/rbs/parser.rb +966 -906
- data/lib/rbs/parser.y +95 -55
- data/lib/rbs/prototype/rb.rb +13 -2
- data/lib/rbs/prototype/rbi.rb +5 -5
- data/lib/rbs/prototype/runtime.rb +1 -1
- data/lib/rbs/test/hook.rb +5 -2
- data/lib/rbs/types.rb +63 -6
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +9 -1
- data/schema/members.json +5 -1
- data/sig/definition_builder.rbs +3 -0
- data/sig/members.rbs +4 -1
- data/sig/method_types.rbs +3 -16
- data/sig/types.rbs +17 -1
- data/stdlib/dbm/0/dbm.rbs +0 -2
- data/stdlib/tsort/0/tsort.rbs +8 -0
- data/steep/Gemfile.lock +7 -7
- metadata +3 -3
data/lib/rbs/parser.y
CHANGED
@@ -20,7 +20,7 @@ class RBS::Parser
|
|
20
20
|
nonassoc kARROW
|
21
21
|
preclow
|
22
22
|
|
23
|
-
expect
|
23
|
+
expect 5
|
24
24
|
|
25
25
|
rule
|
26
26
|
|
@@ -202,57 +202,67 @@ rule
|
|
202
202
|
| alias_member
|
203
203
|
| signature
|
204
204
|
|
205
|
+
attribute_kind:
|
206
|
+
{ result = :instance }
|
207
|
+
| kSELF kDOT { result = :singleton }
|
208
|
+
|
205
209
|
attribute_member:
|
206
|
-
annotations kATTRREADER keyword type {
|
207
|
-
location = val[1].location + val[
|
208
|
-
result = Members::AttrReader.new(name: val[
|
210
|
+
annotations kATTRREADER attribute_kind keyword type {
|
211
|
+
location = val[1].location + val[4].location
|
212
|
+
result = Members::AttrReader.new(name: val[3].value,
|
209
213
|
ivar_name: nil,
|
210
|
-
type: val[
|
214
|
+
type: val[4],
|
215
|
+
kind: val[2],
|
211
216
|
annotations: val[0],
|
212
217
|
location: location,
|
213
218
|
comment: leading_comment(val[0].first&.location || location))
|
214
219
|
}
|
215
|
-
| annotations kATTRREADER method_name attr_var_opt kCOLON type {
|
216
|
-
location = val[1].location + val[
|
217
|
-
result = Members::AttrReader.new(name: val[
|
218
|
-
ivar_name: val[
|
219
|
-
type: val[
|
220
|
+
| annotations kATTRREADER attribute_kind method_name attr_var_opt kCOLON type {
|
221
|
+
location = val[1].location + val[6].location
|
222
|
+
result = Members::AttrReader.new(name: val[3].value.to_sym,
|
223
|
+
ivar_name: val[4],
|
224
|
+
type: val[6],
|
225
|
+
kind: val[2],
|
220
226
|
annotations: val[0],
|
221
227
|
location: location,
|
222
228
|
comment: leading_comment(val[0].first&.location || location))
|
223
229
|
}
|
224
|
-
| annotations kATTRWRITER keyword type {
|
225
|
-
location = val[1].location + val[
|
226
|
-
result = Members::AttrWriter.new(name: val[
|
230
|
+
| annotations kATTRWRITER attribute_kind keyword type {
|
231
|
+
location = val[1].location + val[4].location
|
232
|
+
result = Members::AttrWriter.new(name: val[3].value,
|
227
233
|
ivar_name: nil,
|
228
|
-
|
234
|
+
kind: val[2],
|
235
|
+
type: val[4],
|
229
236
|
annotations: val[0],
|
230
237
|
location: location,
|
231
238
|
comment: leading_comment(val[0].first&.location || location))
|
232
239
|
}
|
233
|
-
| annotations kATTRWRITER method_name attr_var_opt kCOLON type {
|
234
|
-
location = val[1].location + val[
|
235
|
-
result = Members::AttrWriter.new(name: val[
|
236
|
-
ivar_name: val[
|
237
|
-
|
240
|
+
| annotations kATTRWRITER attribute_kind method_name attr_var_opt kCOLON type {
|
241
|
+
location = val[1].location + val[6].location
|
242
|
+
result = Members::AttrWriter.new(name: val[3].value.to_sym,
|
243
|
+
ivar_name: val[4],
|
244
|
+
kind: val[2],
|
245
|
+
type: val[6],
|
238
246
|
annotations: val[0],
|
239
247
|
location: location,
|
240
248
|
comment: leading_comment(val[0].first&.location || location))
|
241
249
|
}
|
242
|
-
| annotations kATTRACCESSOR keyword type {
|
243
|
-
location = val[1].location + val[
|
244
|
-
result = Members::AttrAccessor.new(name: val[
|
250
|
+
| annotations kATTRACCESSOR attribute_kind keyword type {
|
251
|
+
location = val[1].location + val[4].location
|
252
|
+
result = Members::AttrAccessor.new(name: val[3].value,
|
245
253
|
ivar_name: nil,
|
246
|
-
|
254
|
+
kind: val[2],
|
255
|
+
type: val[4],
|
247
256
|
annotations: val[0],
|
248
257
|
location: location,
|
249
258
|
comment: leading_comment(val[0].first&.location || location))
|
250
259
|
}
|
251
|
-
| annotations kATTRACCESSOR method_name attr_var_opt kCOLON type {
|
252
|
-
location = val[1].location + val[
|
253
|
-
result = Members::AttrAccessor.new(name: val[
|
254
|
-
ivar_name: val[
|
255
|
-
|
260
|
+
| annotations kATTRACCESSOR attribute_kind method_name attr_var_opt kCOLON type {
|
261
|
+
location = val[1].location + val[6].location
|
262
|
+
result = Members::AttrAccessor.new(name: val[3].value.to_sym,
|
263
|
+
ivar_name: val[4],
|
264
|
+
kind: val[2],
|
265
|
+
type: val[6],
|
256
266
|
annotations: val[0],
|
257
267
|
location: location,
|
258
268
|
comment: leading_comment(val[0].first&.location || location))
|
@@ -474,26 +484,13 @@ rule
|
|
474
484
|
}
|
475
485
|
|
476
486
|
method_type:
|
477
|
-
start_merged_scope type_params
|
487
|
+
start_merged_scope type_params proc_type {
|
478
488
|
reset_variable_scope
|
479
489
|
|
480
|
-
location = (val[1] || val[2]
|
490
|
+
location = (val[1] || val[2]).location + val[2].location
|
481
491
|
type_params = val[1]&.value || []
|
482
492
|
|
483
|
-
|
484
|
-
|
485
|
-
type = Types::Function.new(
|
486
|
-
required_positionals: params[0],
|
487
|
-
optional_positionals: params[1],
|
488
|
-
rest_positionals: params[2],
|
489
|
-
trailing_positionals: params[3],
|
490
|
-
required_keywords: params[4],
|
491
|
-
optional_keywords: params[5],
|
492
|
-
rest_keywords: params[6],
|
493
|
-
return_type: val[5]
|
494
|
-
)
|
495
|
-
|
496
|
-
block = val[3]&.value
|
493
|
+
type, block = val[2].value
|
497
494
|
|
498
495
|
result = MethodType.new(type_params: type_params,
|
499
496
|
type: type,
|
@@ -507,14 +504,13 @@ rule
|
|
507
504
|
result = LocatedValue.new(value: val[1], location: val[0].location + val[2].location)
|
508
505
|
}
|
509
506
|
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
block = MethodType::Block.new(type: val[1].value, required: true)
|
507
|
+
block:
|
508
|
+
kLBRACE simple_function_type kRBRACE {
|
509
|
+
block = Types::Block.new(type: val[1].value, required: true)
|
514
510
|
result = LocatedValue.new(value: block, location: val[0].location + val[2].location)
|
515
511
|
}
|
516
|
-
| kQUESTION kLBRACE
|
517
|
-
block =
|
512
|
+
| kQUESTION kLBRACE simple_function_type kRBRACE {
|
513
|
+
block = Types::Block.new(type: val[2].value, required: false)
|
518
514
|
result = LocatedValue.new(value: block, location: val[0].location + val[3].location)
|
519
515
|
}
|
520
516
|
|
@@ -797,8 +793,9 @@ rule
|
|
797
793
|
result = Types::ClassSingleton.new(name: val[2].value,
|
798
794
|
location: val[0].location + val[3].location)
|
799
795
|
}
|
800
|
-
| kHAT
|
801
|
-
|
796
|
+
| kHAT proc_type {
|
797
|
+
type, block = val[1].value
|
798
|
+
result = Types::Proc.new(type: type, block: block, location: val[0].location + val[1].location)
|
802
799
|
}
|
803
800
|
| simple_type kQUESTION {
|
804
801
|
result = Types::Optional.new(type: val[0], location: val[0].location + val[1].location)
|
@@ -851,7 +848,32 @@ rule
|
|
851
848
|
|
852
849
|
keyword: tLKEYWORD | tUKEYWORD | tLKEYWORD_Q_E | tUKEYWORD_Q_E
|
853
850
|
|
854
|
-
|
851
|
+
proc_type:
|
852
|
+
params_opt block kARROW simple_type {
|
853
|
+
location = (val[0] || val[1] || val[2]).location + val[3].location
|
854
|
+
|
855
|
+
params = val[0]&.value || [[], [], nil, [], {}, {}, nil]
|
856
|
+
|
857
|
+
type = Types::Function.new(
|
858
|
+
required_positionals: params[0],
|
859
|
+
optional_positionals: params[1],
|
860
|
+
rest_positionals: params[2],
|
861
|
+
trailing_positionals: params[3],
|
862
|
+
required_keywords: params[4],
|
863
|
+
optional_keywords: params[5],
|
864
|
+
rest_keywords: params[6],
|
865
|
+
return_type: val[3]
|
866
|
+
)
|
867
|
+
|
868
|
+
block = val[1].value
|
869
|
+
|
870
|
+
result = LocatedValue.new(value: [type, block], location: location)
|
871
|
+
}
|
872
|
+
| simple_function_type {
|
873
|
+
result = LocatedValue.new(value: [val[0].value, nil], location: val[0].location)
|
874
|
+
}
|
875
|
+
|
876
|
+
simple_function_type:
|
855
877
|
kLPAREN params kRPAREN kARROW simple_type {
|
856
878
|
location = val[0].location + val[4].location
|
857
879
|
type = Types::Function.new(
|
@@ -883,7 +905,7 @@ rule
|
|
883
905
|
result = LocatedValue.new(value: type, location: location)
|
884
906
|
}
|
885
907
|
|
886
|
-
|
908
|
+
params:
|
887
909
|
required_positional kCOMMA params {
|
888
910
|
result = val[2]
|
889
911
|
result[0].unshift(val[0])
|
@@ -1294,6 +1316,10 @@ ANNOTATION_RE = Regexp.union(/%a\{.*?\}/,
|
|
1294
1316
|
/%a\(.*?\)/,
|
1295
1317
|
/%a\<.*?\>/,
|
1296
1318
|
/%a\|.*?\|/)
|
1319
|
+
|
1320
|
+
escape_sequences = %w[a b e f n r s t v "].map { |l| "\\\\#{l}" }
|
1321
|
+
DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE = /(#{escape_sequences.join("|")})/
|
1322
|
+
|
1297
1323
|
def next_token
|
1298
1324
|
if @type
|
1299
1325
|
type = @type
|
@@ -1373,7 +1399,21 @@ def next_token
|
|
1373
1399
|
when input.scan(/[a-z_]\w*\b/)
|
1374
1400
|
new_token(:tLIDENT)
|
1375
1401
|
when input.scan(/"(\\"|[^"])*"/)
|
1376
|
-
s = input.matched.yield_self {|s| s[1, s.length - 2] }
|
1402
|
+
s = input.matched.yield_self {|s| s[1, s.length - 2] }
|
1403
|
+
.gsub(DBL_QUOTE_STR_ESCAPE_SEQUENCES_RE) do |match|
|
1404
|
+
case match
|
1405
|
+
when '\\a' then "\a"
|
1406
|
+
when '\\b' then "\b"
|
1407
|
+
when '\\e' then "\e"
|
1408
|
+
when '\\f' then "\f"
|
1409
|
+
when '\\n' then "\n"
|
1410
|
+
when '\\r' then "\r"
|
1411
|
+
when '\\s' then "\s"
|
1412
|
+
when '\\t' then "\t"
|
1413
|
+
when '\\v' then "\v"
|
1414
|
+
when '\\"' then '"'
|
1415
|
+
end
|
1416
|
+
end
|
1377
1417
|
new_token(:tSTRING, s)
|
1378
1418
|
when input.scan(/'(\\'|[^'])*'/)
|
1379
1419
|
s = input.matched.yield_self {|s| s[1, s.length - 2] }.gsub(/\\'/, "'")
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -15,6 +15,14 @@ module RBS
|
|
15
15
|
:instance
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
def attribute_kind
|
20
|
+
if singleton
|
21
|
+
:singleton
|
22
|
+
else
|
23
|
+
:instance
|
24
|
+
end
|
25
|
+
end
|
18
26
|
end
|
19
27
|
|
20
28
|
attr_reader :source_decls
|
@@ -202,6 +210,7 @@ module RBS
|
|
202
210
|
name: name,
|
203
211
|
ivar_name: nil,
|
204
212
|
type: Types::Bases::Any.new(location: nil),
|
213
|
+
kind: context.attribute_kind,
|
205
214
|
location: nil,
|
206
215
|
comment: comments[node.first_lineno - 1],
|
207
216
|
annotations: []
|
@@ -215,6 +224,7 @@ module RBS
|
|
215
224
|
name: name,
|
216
225
|
ivar_name: nil,
|
217
226
|
type: Types::Bases::Any.new(location: nil),
|
227
|
+
kind: context.attribute_kind,
|
218
228
|
location: nil,
|
219
229
|
comment: comments[node.first_lineno - 1],
|
220
230
|
annotations: []
|
@@ -228,6 +238,7 @@ module RBS
|
|
228
238
|
name: name,
|
229
239
|
ivar_name: nil,
|
230
240
|
type: Types::Bases::Any.new(location: nil),
|
241
|
+
kind: context.attribute_kind,
|
231
242
|
location: nil,
|
232
243
|
comment: comments[node.first_lineno - 1],
|
233
244
|
annotations: []
|
@@ -549,7 +560,7 @@ module RBS
|
|
549
560
|
method_block = nil
|
550
561
|
|
551
562
|
if block
|
552
|
-
method_block =
|
563
|
+
method_block = Types::Block.new(
|
553
564
|
required: true,
|
554
565
|
type: Types::Function.empty(untyped)
|
555
566
|
)
|
@@ -557,7 +568,7 @@ module RBS
|
|
557
568
|
|
558
569
|
if body_node
|
559
570
|
if (yields = any_node?(body_node) {|n| n.type == :YIELD })
|
560
|
-
method_block =
|
571
|
+
method_block = Types::Block.new(
|
561
572
|
required: true,
|
562
573
|
type: Types::Function.empty(untyped)
|
563
574
|
)
|
data/lib/rbs/prototype/rbi.rb
CHANGED
@@ -387,19 +387,19 @@ module RBS
|
|
387
387
|
if block
|
388
388
|
if (type = vars[block])
|
389
389
|
if type.is_a?(Types::Proc)
|
390
|
-
method_block =
|
390
|
+
method_block = Types::Block.new(required: true, type: type.type)
|
391
391
|
elsif type.is_a?(Types::Bases::Any)
|
392
|
-
method_block =
|
392
|
+
method_block = Types::Block.new(
|
393
393
|
required: true,
|
394
394
|
type: Types::Function.empty(Types::Bases::Any.new(location: nil))
|
395
395
|
)
|
396
396
|
# Handle an optional block like `T.nilable(T.proc.void)`.
|
397
397
|
elsif type.is_a?(Types::Optional) && type.type.is_a?(Types::Proc)
|
398
|
-
method_block =
|
398
|
+
method_block = Types::Block.new(required: false, type: type.type.type)
|
399
399
|
else
|
400
400
|
STDERR.puts "Unexpected block type: #{type}"
|
401
401
|
PP.pp args_node, STDERR
|
402
|
-
method_block =
|
402
|
+
method_block = Types::Block.new(
|
403
403
|
required: true,
|
404
404
|
type: Types::Function.empty(Types::Bases::Any.new(location: nil))
|
405
405
|
)
|
@@ -485,7 +485,7 @@ module RBS
|
|
485
485
|
Types::Tuple.new(types: types, location: nil)
|
486
486
|
else
|
487
487
|
if proc_type?(type_node)
|
488
|
-
Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, location: nil)
|
488
|
+
Types::Proc.new(type: method_type(nil, type_node, variables: variables).type, block: nil, location: nil)
|
489
489
|
else
|
490
490
|
STDERR.puts "Unexpected type_node:"
|
491
491
|
PP.pp type_node, STDERR
|
@@ -103,7 +103,7 @@ module RBS
|
|
103
103
|
when :keyrest
|
104
104
|
rest_keywords = Types::Function::Param.new(name: nil, type: untyped)
|
105
105
|
when :block
|
106
|
-
block =
|
106
|
+
block = Types::Block.new(
|
107
107
|
type: Types::Function.empty(untyped).update(rest_positionals: Types::Function::Param.new(name: nil, type: untyped)),
|
108
108
|
required: true
|
109
109
|
)
|
data/lib/rbs/test/hook.rb
CHANGED
@@ -81,7 +81,8 @@ def #{with_name}(*args, &block)
|
|
81
81
|
|
82
82
|
if block_given?
|
83
83
|
receiver = self
|
84
|
-
|
84
|
+
|
85
|
+
wrapped_block = proc do |*block_args|
|
85
86
|
return_from_block = false
|
86
87
|
|
87
88
|
begin
|
@@ -117,7 +118,9 @@ def #{with_name}(*args, &block)
|
|
117
118
|
end
|
118
119
|
|
119
120
|
block_result
|
120
|
-
end
|
121
|
+
end.ruby2_keywords
|
122
|
+
|
123
|
+
result = __send__(:"#{without_name}", *args, &wrapped_block)
|
121
124
|
else
|
122
125
|
result = __send__(:"#{without_name}", *args)
|
123
126
|
end
|
data/lib/rbs/types.rb
CHANGED
@@ -947,44 +947,100 @@ module RBS
|
|
947
947
|
end
|
948
948
|
end
|
949
949
|
|
950
|
+
class Block
|
951
|
+
attr_reader :type
|
952
|
+
attr_reader :required
|
953
|
+
|
954
|
+
def initialize(type:, required:)
|
955
|
+
@type = type
|
956
|
+
@required = required
|
957
|
+
end
|
958
|
+
|
959
|
+
def ==(other)
|
960
|
+
other.is_a?(Block) &&
|
961
|
+
other.type == type &&
|
962
|
+
other.required == required
|
963
|
+
end
|
964
|
+
|
965
|
+
def to_json(*a)
|
966
|
+
{
|
967
|
+
type: type,
|
968
|
+
required: required
|
969
|
+
}.to_json(*a)
|
970
|
+
end
|
971
|
+
|
972
|
+
def sub(s)
|
973
|
+
self.class.new(
|
974
|
+
type: type.sub(s),
|
975
|
+
required: required
|
976
|
+
)
|
977
|
+
end
|
978
|
+
|
979
|
+
def map_type(&block)
|
980
|
+
Block.new(
|
981
|
+
required: required,
|
982
|
+
type: type.map_type(&block)
|
983
|
+
)
|
984
|
+
end
|
985
|
+
end
|
986
|
+
|
950
987
|
class Proc
|
951
988
|
attr_reader :type
|
989
|
+
attr_reader :block
|
952
990
|
attr_reader :location
|
953
991
|
|
954
|
-
def initialize(location:, type:)
|
992
|
+
def initialize(location:, type:, block:)
|
955
993
|
@type = type
|
994
|
+
@block = block
|
956
995
|
@location = location
|
957
996
|
end
|
958
997
|
|
959
998
|
def ==(other)
|
960
|
-
other.is_a?(Proc) && other.type == type
|
999
|
+
other.is_a?(Proc) && other.type == type && other.block == block
|
961
1000
|
end
|
962
1001
|
|
963
1002
|
alias eql? ==
|
964
1003
|
|
965
1004
|
def hash
|
966
|
-
self.class.hash ^ type.hash
|
1005
|
+
self.class.hash ^ type.hash ^ block.hash
|
967
1006
|
end
|
968
1007
|
|
969
1008
|
def free_variables(set = Set[])
|
970
1009
|
type.free_variables(set)
|
1010
|
+
block&.type&.free_variables(set)
|
1011
|
+
set
|
971
1012
|
end
|
972
1013
|
|
973
1014
|
def to_json(*a)
|
974
|
-
{
|
1015
|
+
{
|
1016
|
+
class: :proc,
|
1017
|
+
type: type,
|
1018
|
+
block: block,
|
1019
|
+
location: location
|
1020
|
+
}.to_json(*a)
|
975
1021
|
end
|
976
1022
|
|
977
1023
|
def sub(s)
|
978
|
-
self.class.new(type: type.sub(s), location: location)
|
1024
|
+
self.class.new(type: type.sub(s), block: block&.sub(s), location: location)
|
979
1025
|
end
|
980
1026
|
|
981
1027
|
def to_s(level = 0)
|
982
|
-
|
1028
|
+
case
|
1029
|
+
when b = block
|
1030
|
+
if b.required
|
1031
|
+
"^(#{type.param_to_s}) { (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
|
1032
|
+
else
|
1033
|
+
"^(#{type.param_to_s}) ?{ (#{b.type.param_to_s}) -> #{b.type.return_to_s} } -> #{type.return_to_s}"
|
1034
|
+
end
|
1035
|
+
else
|
1036
|
+
"^(#{type.param_to_s}) -> #{type.return_to_s}"
|
1037
|
+
end
|
983
1038
|
end
|
984
1039
|
|
985
1040
|
def each_type(&block)
|
986
1041
|
if block
|
987
1042
|
type.each_type(&block)
|
1043
|
+
self.block&.type&.each_type(&block)
|
988
1044
|
else
|
989
1045
|
enum_for :each_type
|
990
1046
|
end
|
@@ -993,6 +1049,7 @@ module RBS
|
|
993
1049
|
def map_type_name(&block)
|
994
1050
|
Proc.new(
|
995
1051
|
type: type.map_type_name(&block),
|
1052
|
+
block: self.block&.map_type {|type| type.map_type_name(&block) },
|
996
1053
|
location: location
|
997
1054
|
)
|
998
1055
|
end
|