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