rbs 0.16.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/.github/workflows/ruby.yml +1 -1
- data/CHANGELOG.md +30 -0
- data/README.md +1 -1
- data/Rakefile +12 -1
- data/core/array.rbs +1 -1
- data/core/builtin.rbs +2 -2
- data/core/dir.rbs +1 -1
- data/core/enumerable.rbs +41 -40
- data/core/enumerator.rbs +5 -5
- data/core/file.rbs +0 -4
- data/core/hash.rbs +9 -11
- data/core/io.rbs +1 -1
- data/core/object_space.rbs +98 -0
- data/core/range.rbs +1 -1
- data/core/struct.rbs +1 -1
- data/core/time.rbs +0 -12
- data/lib/rbs/ast/members.rb +9 -3
- data/lib/rbs/definition.rb +9 -4
- data/lib/rbs/definition_builder.rb +123 -71
- data/lib/rbs/environment.rb +3 -0
- data/lib/rbs/environment_loader.rb +1 -1
- data/lib/rbs/environment_walker.rb +70 -35
- data/lib/rbs/method_type.rb +1 -31
- data/lib/rbs/parser.rb +944 -879
- data/lib/rbs/parser.y +110 -63
- data/lib/rbs/prototype/rb.rb +163 -23
- data/lib/rbs/prototype/rbi.rb +5 -5
- data/lib/rbs/prototype/runtime.rb +2 -1
- data/lib/rbs/test/hook.rb +30 -17
- data/lib/rbs/test/type_check.rb +6 -1
- 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.rbs +8 -3
- data/sig/definition_builder.rbs +6 -2
- data/sig/members.rbs +4 -1
- data/sig/method_types.rbs +3 -16
- data/sig/types.rbs +17 -1
- data/stdlib/csv/0/csv.rbs +3 -3
- data/stdlib/dbm/0/dbm.rbs +1 -3
- data/stdlib/monitor/0/monitor.rbs +119 -0
- data/stdlib/prime/0/prime.rbs +1 -1
- data/stdlib/set/0/set.rbs +10 -10
- data/stdlib/singleton/0/singleton.rbs +111 -0
- data/stdlib/tsort/0/cyclic.rbs +4 -0
- data/stdlib/tsort/0/interfaces.rbs +19 -0
- data/stdlib/tsort/0/tsort.rbs +371 -0
- data/stdlib/yaml/0/dbm.rbs +221 -0
- data/stdlib/yaml/0/store.rbs +53 -0
- data/steep/Gemfile.lock +12 -12
- metadata +11 -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])
|
@@ -1168,14 +1190,21 @@ end
|
|
1168
1190
|
|
1169
1191
|
def new_token(type, value = input.matched)
|
1170
1192
|
charpos = charpos(input)
|
1171
|
-
|
1172
|
-
|
1193
|
+
matched = input.matched
|
1194
|
+
|
1195
|
+
if matched
|
1196
|
+
start_index = charpos - matched.size
|
1197
|
+
end_index = charpos
|
1173
1198
|
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
1199
|
+
location = RBS::Location.new(buffer: buffer,
|
1200
|
+
start_pos: start_index,
|
1201
|
+
end_pos: end_index)
|
1177
1202
|
|
1178
|
-
|
1203
|
+
[type, LocatedValue.new(location: location, value: value)]
|
1204
|
+
else
|
1205
|
+
# scanner hasn't matched yet
|
1206
|
+
[false, nil]
|
1207
|
+
end
|
1179
1208
|
end
|
1180
1209
|
|
1181
1210
|
def charpos(scanner)
|
@@ -1287,6 +1316,10 @@ ANNOTATION_RE = Regexp.union(/%a\{.*?\}/,
|
|
1287
1316
|
/%a\(.*?\)/,
|
1288
1317
|
/%a\<.*?\>/,
|
1289
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
|
+
|
1290
1323
|
def next_token
|
1291
1324
|
if @type
|
1292
1325
|
type = @type
|
@@ -1294,10 +1327,10 @@ def next_token
|
|
1294
1327
|
return [:"type_#{type}", nil]
|
1295
1328
|
end
|
1296
1329
|
|
1297
|
-
return if @eof
|
1330
|
+
return new_token(false, '') if @eof
|
1298
1331
|
|
1299
1332
|
while true
|
1300
|
-
return if input.eos?
|
1333
|
+
return new_token(false, '') if input.eos?
|
1301
1334
|
|
1302
1335
|
case
|
1303
1336
|
when input.scan(/\s+/)
|
@@ -1366,7 +1399,21 @@ def next_token
|
|
1366
1399
|
when input.scan(/[a-z_]\w*\b/)
|
1367
1400
|
new_token(:tLIDENT)
|
1368
1401
|
when input.scan(/"(\\"|[^"])*"/)
|
1369
|
-
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
|
1370
1417
|
new_token(:tSTRING, s)
|
1371
1418
|
when input.scan(/'(\\'|[^'])*'/)
|
1372
1419
|
s = input.matched.yield_self {|s| s[1, s.length - 2] }.gsub(/\\'/, "'")
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
module RBS
|
2
2
|
module Prototype
|
3
3
|
class RB
|
4
|
+
Context = Struct.new(:module_function, :singleton, :namespace, keyword_init: true) do
|
5
|
+
def self.initial(namespace: Namespace.root)
|
6
|
+
self.new(module_function: false, singleton: false, namespace: namespace)
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_kind
|
10
|
+
if singleton
|
11
|
+
:singleton
|
12
|
+
elsif module_function
|
13
|
+
:singleton_instance
|
14
|
+
else
|
15
|
+
:instance
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def attribute_kind
|
20
|
+
if singleton
|
21
|
+
:singleton
|
22
|
+
else
|
23
|
+
:instance
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
4
28
|
attr_reader :source_decls
|
5
29
|
attr_reader :toplevel_members
|
6
30
|
|
@@ -52,10 +76,10 @@ module RBS
|
|
52
76
|
end
|
53
77
|
end
|
54
78
|
|
55
|
-
process RubyVM::AbstractSyntaxTree.parse(string), decls: source_decls, comments: comments,
|
79
|
+
process RubyVM::AbstractSyntaxTree.parse(string), decls: source_decls, comments: comments, context: Context.initial
|
56
80
|
end
|
57
81
|
|
58
|
-
def process(node, decls:, comments:,
|
82
|
+
def process(node, decls:, comments:, context:)
|
59
83
|
case node.type
|
60
84
|
when :CLASS
|
61
85
|
class_name, super_class, *class_body = node.children
|
@@ -71,9 +95,11 @@ module RBS
|
|
71
95
|
|
72
96
|
decls.push kls
|
73
97
|
|
98
|
+
new_ctx = Context.initial(namespace: context.namespace + kls.name.to_namespace)
|
74
99
|
each_node class_body do |child|
|
75
|
-
process child, decls: kls.members, comments: comments,
|
100
|
+
process child, decls: kls.members, comments: comments, context: new_ctx
|
76
101
|
end
|
102
|
+
remove_unnecessary_accessibility_methods! kls.members
|
77
103
|
|
78
104
|
when :MODULE
|
79
105
|
module_name, *module_body = node.children
|
@@ -90,9 +116,11 @@ module RBS
|
|
90
116
|
|
91
117
|
decls.push mod
|
92
118
|
|
119
|
+
new_ctx = Context.initial(namespace: context.namespace + mod.name.to_namespace)
|
93
120
|
each_node module_body do |child|
|
94
|
-
process child, decls: mod.members, comments: comments,
|
121
|
+
process child, decls: mod.members, comments: comments, context: new_ctx
|
95
122
|
end
|
123
|
+
remove_unnecessary_accessibility_methods! mod.members
|
96
124
|
|
97
125
|
when :SCLASS
|
98
126
|
this, body = node.children
|
@@ -101,14 +129,13 @@ module RBS
|
|
101
129
|
RBS.logger.warn "`class <<` syntax with not-self may be compiled to incorrect code: #{this}"
|
102
130
|
end
|
103
131
|
|
104
|
-
|
105
|
-
|
106
|
-
end
|
132
|
+
ctx = Context.initial.tap { |ctx| ctx.singleton = true }
|
133
|
+
process_children(body, decls: decls, comments: comments, context: ctx)
|
107
134
|
|
108
135
|
when :DEFN, :DEFS
|
109
136
|
if node.type == :DEFN
|
110
137
|
def_name, def_body = node.children
|
111
|
-
kind =
|
138
|
+
kind = context.method_kind
|
112
139
|
else
|
113
140
|
_, def_name, def_body = node.children
|
114
141
|
kind = :singleton
|
@@ -140,14 +167,14 @@ module RBS
|
|
140
167
|
member = AST::Members::Alias.new(
|
141
168
|
new_name: new_name,
|
142
169
|
old_name: old_name,
|
143
|
-
kind: singleton ? :singleton : :instance,
|
170
|
+
kind: context.singleton ? :singleton : :instance,
|
144
171
|
annotations: [],
|
145
172
|
location: nil,
|
146
173
|
comment: comments[node.first_lineno - 1],
|
147
174
|
)
|
148
175
|
decls.push member unless decls.include?(member)
|
149
176
|
|
150
|
-
when :FCALL
|
177
|
+
when :FCALL, :VCALL
|
151
178
|
# Inside method definition cannot reach here.
|
152
179
|
args = node.children[1]&.children || []
|
153
180
|
|
@@ -166,7 +193,7 @@ module RBS
|
|
166
193
|
end
|
167
194
|
when :extend
|
168
195
|
args.each do |arg|
|
169
|
-
if (name = const_to_name(arg))
|
196
|
+
if (name = const_to_name(arg, context: context))
|
170
197
|
decls << AST::Members::Extend.new(
|
171
198
|
name: name,
|
172
199
|
args: [],
|
@@ -183,6 +210,7 @@ module RBS
|
|
183
210
|
name: name,
|
184
211
|
ivar_name: nil,
|
185
212
|
type: Types::Bases::Any.new(location: nil),
|
213
|
+
kind: context.attribute_kind,
|
186
214
|
location: nil,
|
187
215
|
comment: comments[node.first_lineno - 1],
|
188
216
|
annotations: []
|
@@ -196,6 +224,7 @@ module RBS
|
|
196
224
|
name: name,
|
197
225
|
ivar_name: nil,
|
198
226
|
type: Types::Bases::Any.new(location: nil),
|
227
|
+
kind: context.attribute_kind,
|
199
228
|
location: nil,
|
200
229
|
comment: comments[node.first_lineno - 1],
|
201
230
|
annotations: []
|
@@ -209,6 +238,7 @@ module RBS
|
|
209
238
|
name: name,
|
210
239
|
ivar_name: nil,
|
211
240
|
type: Types::Bases::Any.new(location: nil),
|
241
|
+
kind: context.attribute_kind,
|
212
242
|
location: nil,
|
213
243
|
comment: comments[node.first_lineno - 1],
|
214
244
|
annotations: []
|
@@ -220,16 +250,61 @@ module RBS
|
|
220
250
|
decls << AST::Members::Alias.new(
|
221
251
|
new_name: new_name,
|
222
252
|
old_name: old_name,
|
223
|
-
kind: singleton ? :singleton : :instance,
|
253
|
+
kind: context.singleton ? :singleton : :instance,
|
224
254
|
annotations: [],
|
225
255
|
location: nil,
|
226
256
|
comment: comments[node.first_lineno - 1],
|
227
257
|
)
|
228
258
|
end
|
259
|
+
when :module_function
|
260
|
+
if args.empty?
|
261
|
+
context.module_function = true
|
262
|
+
else
|
263
|
+
module_func_context = context.dup.tap { |ctx| ctx.module_function = true }
|
264
|
+
args.each do |arg|
|
265
|
+
if arg && (name = literal_to_symbol(arg))
|
266
|
+
if i = find_def_index_by_name(decls, name)
|
267
|
+
decls[i] = decls[i].update(kind: :singleton_instance)
|
268
|
+
end
|
269
|
+
elsif arg
|
270
|
+
process arg, decls: decls, comments: comments, context: module_func_context
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
when :public, :private
|
275
|
+
accessibility = __send__(node.children[0])
|
276
|
+
if args.empty?
|
277
|
+
decls << accessibility
|
278
|
+
else
|
279
|
+
args.each do |arg|
|
280
|
+
if arg && (name = literal_to_symbol(arg))
|
281
|
+
if i = find_def_index_by_name(decls, name)
|
282
|
+
current = current_accessibility(decls, i)
|
283
|
+
if current != accessibility
|
284
|
+
decls.insert(i + 1, current)
|
285
|
+
decls.insert(i, accessibility)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# For `private def foo` syntax
|
292
|
+
current = current_accessibility(decls)
|
293
|
+
decls << accessibility
|
294
|
+
process_children(node, decls: decls, comments: comments, context: context)
|
295
|
+
decls << current
|
296
|
+
end
|
297
|
+
else
|
298
|
+
process_children(node, decls: decls, comments: comments, context: context)
|
229
299
|
end
|
230
300
|
|
231
|
-
|
232
|
-
|
301
|
+
when :ITER
|
302
|
+
method_name = node.children.first.children.first
|
303
|
+
case method_name
|
304
|
+
when :refine
|
305
|
+
# ignore
|
306
|
+
else
|
307
|
+
process_children(node, decls: decls, comments: comments, context: context)
|
233
308
|
end
|
234
309
|
|
235
310
|
when :CDECL
|
@@ -248,13 +323,17 @@ module RBS
|
|
248
323
|
)
|
249
324
|
|
250
325
|
else
|
251
|
-
|
252
|
-
process child, decls: decls, comments: comments, singleton: singleton
|
253
|
-
end
|
326
|
+
process_children(node, decls: decls, comments: comments, context: context)
|
254
327
|
end
|
255
328
|
end
|
256
329
|
|
257
|
-
def
|
330
|
+
def process_children(node, decls:, comments:, context:)
|
331
|
+
each_child node do |child|
|
332
|
+
process child, decls: decls, comments: comments, context: context
|
333
|
+
end
|
334
|
+
end
|
335
|
+
|
336
|
+
def const_to_name(node, context: nil)
|
258
337
|
case node&.type
|
259
338
|
when :CONST
|
260
339
|
TypeName.new(name: node.children[0], namespace: Namespace.empty)
|
@@ -268,6 +347,8 @@ module RBS
|
|
268
347
|
TypeName.new(name: node.children[1], namespace: namespace)
|
269
348
|
when :COLON3
|
270
349
|
TypeName.new(name: node.children[0], namespace: Namespace.root)
|
350
|
+
when :SELF
|
351
|
+
context&.then { |c| c.namespace.to_type_name }
|
271
352
|
end
|
272
353
|
end
|
273
354
|
|
@@ -411,7 +492,8 @@ module RBS
|
|
411
492
|
when :HASH
|
412
493
|
list = node.children[0]
|
413
494
|
if list
|
414
|
-
children = list.children
|
495
|
+
children = list.children
|
496
|
+
children.pop
|
415
497
|
else
|
416
498
|
children = []
|
417
499
|
end
|
@@ -419,8 +501,13 @@ module RBS
|
|
419
501
|
key_types = []
|
420
502
|
value_types = []
|
421
503
|
children.each_slice(2) do |k, v|
|
422
|
-
|
423
|
-
|
504
|
+
if k
|
505
|
+
key_types << literal_to_type(k)
|
506
|
+
value_types << literal_to_type(v)
|
507
|
+
else
|
508
|
+
key_types << untyped
|
509
|
+
value_types << untyped
|
510
|
+
end
|
424
511
|
end
|
425
512
|
|
426
513
|
if !key_types.empty? && key_types.all? { |t| t.is_a?(Types::Literal) }
|
@@ -473,7 +560,7 @@ module RBS
|
|
473
560
|
method_block = nil
|
474
561
|
|
475
562
|
if block
|
476
|
-
method_block =
|
563
|
+
method_block = Types::Block.new(
|
477
564
|
required: true,
|
478
565
|
type: Types::Function.empty(untyped)
|
479
566
|
)
|
@@ -481,7 +568,7 @@ module RBS
|
|
481
568
|
|
482
569
|
if body_node
|
483
570
|
if (yields = any_node?(body_node) {|n| n.type == :YIELD })
|
484
|
-
method_block =
|
571
|
+
method_block = Types::Block.new(
|
485
572
|
required: true,
|
486
573
|
type: Types::Function.empty(untyped)
|
487
574
|
)
|
@@ -580,6 +667,59 @@ module RBS
|
|
580
667
|
def untyped
|
581
668
|
@untyped ||= Types::Bases::Any.new(location: nil)
|
582
669
|
end
|
670
|
+
|
671
|
+
def private
|
672
|
+
@private ||= AST::Members::Private.new(location: nil)
|
673
|
+
end
|
674
|
+
|
675
|
+
def public
|
676
|
+
@public ||= AST::Members::Public.new(location: nil)
|
677
|
+
end
|
678
|
+
|
679
|
+
def current_accessibility(decls, index = decls.size)
|
680
|
+
idx = decls.slice(0, index).rindex { |decl| decl == private || decl == public }
|
681
|
+
(idx && decls[idx]) || public
|
682
|
+
end
|
683
|
+
|
684
|
+
def remove_unnecessary_accessibility_methods!(decls)
|
685
|
+
current = public
|
686
|
+
idx = 0
|
687
|
+
|
688
|
+
loop do
|
689
|
+
decl = decls[idx] or break
|
690
|
+
if current == decl
|
691
|
+
decls.delete_at(idx)
|
692
|
+
next
|
693
|
+
end
|
694
|
+
|
695
|
+
if 0 < idx && is_accessibility?(decls[idx - 1]) && is_accessibility?(decl)
|
696
|
+
decls.delete_at(idx - 1)
|
697
|
+
idx -= 1
|
698
|
+
current = current_accessibility(decls, idx)
|
699
|
+
next
|
700
|
+
end
|
701
|
+
|
702
|
+
current = decl if is_accessibility?(decl)
|
703
|
+
idx += 1
|
704
|
+
end
|
705
|
+
|
706
|
+
decls.pop while decls.last && is_accessibility?(decls.last)
|
707
|
+
end
|
708
|
+
|
709
|
+
def is_accessibility?(decl)
|
710
|
+
decl == public || decl == private
|
711
|
+
end
|
712
|
+
|
713
|
+
def find_def_index_by_name(decls, name)
|
714
|
+
decls.find_index do |decl|
|
715
|
+
case decl
|
716
|
+
when AST::Members::MethodDefinition, AST::Members::AttrReader
|
717
|
+
decl.name == name
|
718
|
+
when AST::Members::AttrWriter
|
719
|
+
decl.name == :"#{name}="
|
720
|
+
end
|
721
|
+
end
|
722
|
+
end
|
583
723
|
end
|
584
724
|
end
|
585
725
|
end
|