rbs 1.1.1 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby.yml +5 -1
- data/.gitignore +2 -0
- data/CHANGELOG.md +81 -0
- data/README.md +1 -1
- data/Rakefile +11 -0
- data/Steepfile +1 -0
- data/core/array.rbs +2 -2
- data/core/basic_object.rbs +1 -1
- data/core/enumerable.rbs +1 -1
- data/core/hash.rbs +13 -5
- data/core/io.rbs +4 -4
- data/core/kernel.rbs +2 -2
- data/core/marshal.rbs +4 -3
- data/core/module.rbs +1 -1
- data/core/numeric.rbs +10 -0
- data/core/proc.rbs +1 -1
- data/core/random.rbs +4 -2
- data/core/range.rbs +2 -2
- data/core/struct.rbs +3 -2
- data/core/thread.rbs +1 -1
- data/docs/CONTRIBUTING.md +5 -3
- data/docs/rbs_by_example.md +328 -0
- data/docs/sigs.md +21 -2
- data/docs/stdlib.md +1 -1
- data/docs/syntax.md +11 -14
- data/lib/rbs.rb +1 -0
- data/lib/rbs/ast/annotation.rb +2 -2
- data/lib/rbs/ast/comment.rb +2 -2
- data/lib/rbs/ast/declarations.rb +37 -22
- data/lib/rbs/ast/members.rb +26 -26
- data/lib/rbs/cli.rb +3 -0
- data/lib/rbs/constant_table.rb +4 -1
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder.rb +16 -18
- data/lib/rbs/definition_builder/ancestor_builder.rb +10 -2
- data/lib/rbs/definition_builder/method_builder.rb +4 -2
- data/lib/rbs/errors.rb +36 -0
- data/lib/rbs/location.rb +106 -2
- data/lib/rbs/locator.rb +205 -0
- data/lib/rbs/method_type.rb +2 -2
- data/lib/rbs/parser.rb +1315 -962
- data/lib/rbs/parser.y +411 -75
- data/lib/rbs/prototype/rb.rb +7 -3
- data/lib/rbs/prototype/runtime.rb +118 -42
- data/lib/rbs/test/hook.rb +8 -2
- data/lib/rbs/type_name.rb +2 -3
- data/lib/rbs/type_name_resolver.rb +1 -1
- data/lib/rbs/types.rb +36 -34
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +4 -2
- data/rbs.gemspec +1 -1
- data/sig/ancestor_builder.rbs +2 -0
- data/sig/annotation.rbs +1 -1
- data/sig/cli.rbs +31 -21
- data/sig/comment.rbs +1 -1
- data/sig/declarations.rbs +106 -21
- data/sig/environment.rbs +2 -2
- data/sig/errors.rbs +15 -0
- data/sig/location.rbs +84 -3
- data/sig/locator.rbs +44 -0
- data/sig/members.rbs +76 -12
- data/sig/method_builder.rbs +1 -1
- data/sig/method_types.rbs +1 -1
- data/sig/namespace.rbs +1 -1
- data/sig/polyfill.rbs +4 -17
- data/sig/rbs.rbs +8 -4
- data/sig/typename.rbs +1 -1
- data/sig/types.rbs +60 -19
- data/sig/util.rbs +0 -4
- data/sig/writer.rbs +8 -2
- data/stdlib/dbm/0/dbm.rbs +43 -30
- data/stdlib/mutex_m/0/mutex_m.rbs +1 -1
- data/stdlib/net-http/0/net-http.rbs +1846 -0
- data/stdlib/optparse/0/optparse.rbs +1214 -0
- data/stdlib/resolv/0/resolv.rbs +1504 -0
- data/stdlib/rubygems/0/requirement.rbs +84 -2
- data/stdlib/rubygems/0/version.rbs +2 -1
- data/stdlib/shellwords/0/shellwords.rbs +252 -0
- data/stdlib/socket/0/addrinfo.rbs +469 -0
- data/stdlib/socket/0/basic_socket.rbs +503 -0
- data/stdlib/socket/0/ip_socket.rbs +72 -0
- data/stdlib/socket/0/socket.rbs +2687 -0
- data/stdlib/socket/0/tcp_server.rbs +177 -0
- data/stdlib/socket/0/tcp_socket.rbs +35 -0
- data/stdlib/socket/0/udp_socket.rbs +111 -0
- data/stdlib/socket/0/unix_server.rbs +154 -0
- data/stdlib/socket/0/unix_socket.rbs +132 -0
- data/stdlib/timeout/0/timeout.rbs +5 -0
- data/steep/Gemfile.lock +19 -16
- metadata +18 -11
- data/bin/annotate-with-rdoc +0 -153
- data/bin/console +0 -14
- data/bin/query-rdoc +0 -103
- data/bin/rbs-prof +0 -9
- data/bin/run_in_md.rb +0 -49
- data/bin/setup +0 -8
- data/bin/sort +0 -89
- data/bin/steep +0 -4
- data/bin/test_runner.rb +0 -29
@@ -746,6 +746,20 @@ module RBS
|
|
746
746
|
end
|
747
747
|
)
|
748
748
|
end
|
749
|
+
|
750
|
+
defs = method.defs.map do |defn|
|
751
|
+
defn.update(
|
752
|
+
type: sub.empty? ? defn.type : defn.type.sub(sub),
|
753
|
+
implemented_in: case implemented_in
|
754
|
+
when :keep
|
755
|
+
defn.implemented_in
|
756
|
+
when nil
|
757
|
+
nil
|
758
|
+
else
|
759
|
+
implemented_in
|
760
|
+
end
|
761
|
+
)
|
762
|
+
end
|
749
763
|
end
|
750
764
|
|
751
765
|
super_method = methods[name]
|
@@ -760,26 +774,10 @@ module RBS
|
|
760
774
|
end
|
761
775
|
|
762
776
|
def try_cache(type_name, cache:, key: type_name)
|
763
|
-
# @type var cc: Hash[untyped, Definition |
|
777
|
+
# @type var cc: Hash[untyped, Definition | nil]
|
764
778
|
cc = _ = cache
|
765
|
-
cached = cc[key]
|
766
779
|
|
767
|
-
|
768
|
-
when Definition
|
769
|
-
cached
|
770
|
-
when false
|
771
|
-
raise
|
772
|
-
when nil
|
773
|
-
cc[key] = false
|
774
|
-
begin
|
775
|
-
cc[key] = yield
|
776
|
-
rescue => ex
|
777
|
-
cc.delete(key)
|
778
|
-
raise ex
|
779
|
-
end
|
780
|
-
else
|
781
|
-
raise
|
782
|
-
end
|
780
|
+
cc[key] ||= yield
|
783
781
|
end
|
784
782
|
|
785
783
|
def expand_alias(type_name)
|
@@ -237,6 +237,7 @@ module RBS
|
|
237
237
|
end
|
238
238
|
|
239
239
|
mixin_ancestors(entry,
|
240
|
+
type_name,
|
240
241
|
included_modules: ancestors.included_modules,
|
241
242
|
included_interfaces: ancestors.included_interfaces,
|
242
243
|
prepended_modules: ancestors.prepended_modules,
|
@@ -284,6 +285,7 @@ module RBS
|
|
284
285
|
end
|
285
286
|
|
286
287
|
mixin_ancestors(entry,
|
288
|
+
type_name,
|
287
289
|
included_modules: nil,
|
288
290
|
included_interfaces: nil,
|
289
291
|
prepended_modules: nil,
|
@@ -301,6 +303,7 @@ module RBS
|
|
301
303
|
|
302
304
|
OneAncestors.interface(type_name: type_name, params: params).tap do |ancestors|
|
303
305
|
mixin_ancestors0(entry.decl,
|
306
|
+
type_name,
|
304
307
|
align_params: nil,
|
305
308
|
included_modules: nil,
|
306
309
|
included_interfaces: ancestors.included_interfaces,
|
@@ -311,7 +314,7 @@ module RBS
|
|
311
314
|
end
|
312
315
|
end
|
313
316
|
|
314
|
-
def mixin_ancestors0(decl, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
|
317
|
+
def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
|
315
318
|
decl.each_mixin do |member|
|
316
319
|
case member
|
317
320
|
when AST::Members::Include
|
@@ -321,6 +324,7 @@ module RBS
|
|
321
324
|
|
322
325
|
case
|
323
326
|
when member.name.class? && included_modules
|
327
|
+
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
324
328
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
325
329
|
included_modules << ancestor
|
326
330
|
when member.name.interface? && included_interfaces
|
@@ -330,6 +334,7 @@ module RBS
|
|
330
334
|
|
331
335
|
when AST::Members::Prepend
|
332
336
|
if prepended_modules
|
337
|
+
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
333
338
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
334
339
|
|
335
340
|
module_name = member.name
|
@@ -345,6 +350,7 @@ module RBS
|
|
345
350
|
|
346
351
|
case
|
347
352
|
when member.name.class? && extended_modules
|
353
|
+
MixinClassError.check!(type_name: type_name, env: env, member: member)
|
348
354
|
NoMixinFoundError.check!(member.name, env: env, member: member)
|
349
355
|
extended_modules << ancestor
|
350
356
|
when member.name.interface? && extended_interfaces
|
@@ -355,7 +361,7 @@ module RBS
|
|
355
361
|
end
|
356
362
|
end
|
357
363
|
|
358
|
-
def mixin_ancestors(entry, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
|
364
|
+
def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
|
359
365
|
entry.decls.each do |d|
|
360
366
|
decl = d.decl
|
361
367
|
|
@@ -365,6 +371,7 @@ module RBS
|
|
365
371
|
)
|
366
372
|
|
367
373
|
mixin_ancestors0(decl,
|
374
|
+
type_name,
|
368
375
|
align_params: align_params,
|
369
376
|
included_modules: included_modules,
|
370
377
|
included_interfaces: included_interfaces,
|
@@ -508,6 +515,7 @@ module RBS
|
|
508
515
|
included_interfaces = one_ancestors.included_interfaces or raise
|
509
516
|
included_interfaces.each do |a|
|
510
517
|
included_ancestors = interface_ancestors(a.name, building_ancestors: building_ancestors)
|
518
|
+
|
511
519
|
ancestors.unshift(*included_ancestors.apply(a.args, location: entry.decl.location))
|
512
520
|
end
|
513
521
|
|
@@ -2,9 +2,11 @@ module RBS
|
|
2
2
|
class DefinitionBuilder
|
3
3
|
class MethodBuilder
|
4
4
|
class Methods
|
5
|
-
Definition = Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true) do
|
5
|
+
Definition = _ = Struct.new(:name, :type, :originals, :overloads, :accessibilities, keyword_init: true) do
|
6
|
+
# @implements Definition
|
7
|
+
|
6
8
|
def original
|
7
|
-
originals
|
9
|
+
originals.first
|
8
10
|
end
|
9
11
|
|
10
12
|
def accessibility
|
data/lib/rbs/errors.rb
CHANGED
@@ -350,4 +350,40 @@ module RBS
|
|
350
350
|
original.location
|
351
351
|
end
|
352
352
|
end
|
353
|
+
|
354
|
+
class MixinClassError < DefinitionError
|
355
|
+
attr_reader :type_name
|
356
|
+
attr_reader :member
|
357
|
+
|
358
|
+
def initialize(type_name:, member:)
|
359
|
+
@type_name = type_name
|
360
|
+
@member = member
|
361
|
+
|
362
|
+
super "#{Location.to_string member.location}: Cannot #{mixin_name} a class `#{member.name}` in the definition of `#{type_name}`"
|
363
|
+
end
|
364
|
+
|
365
|
+
def location
|
366
|
+
member.location
|
367
|
+
end
|
368
|
+
|
369
|
+
def self.check!(type_name:, env:, member:)
|
370
|
+
case env.class_decls[member.name]
|
371
|
+
when Environment::ClassEntry
|
372
|
+
raise new(type_name: type_name, member: member)
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
376
|
+
private
|
377
|
+
|
378
|
+
def mixin_name
|
379
|
+
case member
|
380
|
+
when AST::Members::Prepend
|
381
|
+
"prepend"
|
382
|
+
when AST::Members::Include
|
383
|
+
"include"
|
384
|
+
when AST::Members::Extend
|
385
|
+
"extend"
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
353
389
|
end
|
data/lib/rbs/location.rb
CHANGED
@@ -42,6 +42,10 @@ module RBS
|
|
42
42
|
@end_loc ||= buffer.pos_to_loc(end_pos)
|
43
43
|
end
|
44
44
|
|
45
|
+
def range
|
46
|
+
start_pos...end_pos
|
47
|
+
end
|
48
|
+
|
45
49
|
def source
|
46
50
|
@source ||= buffer.content[start_pos...end_pos] or raise
|
47
51
|
end
|
@@ -94,7 +98,7 @@ module RBS
|
|
94
98
|
loc.start_pos == end_pos
|
95
99
|
end
|
96
100
|
|
97
|
-
def to_json(
|
101
|
+
def to_json(state = _ = nil)
|
98
102
|
{
|
99
103
|
start: {
|
100
104
|
line: start_line,
|
@@ -107,7 +111,107 @@ module RBS
|
|
107
111
|
buffer: {
|
108
112
|
name: name&.to_s
|
109
113
|
}
|
110
|
-
}.to_json(
|
114
|
+
}.to_json(state)
|
115
|
+
end
|
116
|
+
|
117
|
+
def with_children(required: {}, optional: {})
|
118
|
+
# @type var required: Hash[Symbol, Range[Integer] | Location]
|
119
|
+
# @type var optional: Hash[Symbol, Range[Integer] | Location | nil]
|
120
|
+
|
121
|
+
this = WithChildren.new(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
|
122
|
+
|
123
|
+
req = required.transform_values do |value|
|
124
|
+
case value
|
125
|
+
when Location
|
126
|
+
value.range
|
127
|
+
else
|
128
|
+
value
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
opt = optional.transform_values do |value|
|
133
|
+
case value
|
134
|
+
when Location
|
135
|
+
value.range
|
136
|
+
else
|
137
|
+
value
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
this.required_children.merge!(req)
|
142
|
+
this.optional_children.merge!(opt)
|
143
|
+
|
144
|
+
this
|
145
|
+
end
|
146
|
+
|
147
|
+
class WithChildren < Location
|
148
|
+
attr_reader :required_children, :optional_children
|
149
|
+
|
150
|
+
def initialize(buffer:, start_pos:, end_pos:)
|
151
|
+
super(buffer: buffer, start_pos: start_pos, end_pos: end_pos)
|
152
|
+
|
153
|
+
@optional_children = {}
|
154
|
+
@required_children = {}
|
155
|
+
end
|
156
|
+
|
157
|
+
def initialize_copy(from)
|
158
|
+
required_children.merge!(from.required_children)
|
159
|
+
optional_children.merge!(from.optional_children)
|
160
|
+
self
|
161
|
+
end
|
162
|
+
|
163
|
+
def [](key)
|
164
|
+
case
|
165
|
+
when required_children.key?(_ = key)
|
166
|
+
range = required_children[_ = key]
|
167
|
+
Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
|
168
|
+
when optional_children.key?(_ = key)
|
169
|
+
range = required_children[_ = key] || optional_children[_ = key]
|
170
|
+
if range
|
171
|
+
Location.new(buffer: buffer, start_pos: range.begin, end_pos: range.end)
|
172
|
+
end
|
173
|
+
else
|
174
|
+
raise "Unknown key given: `#{key}`"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def merge_required(hash)
|
179
|
+
this = dup
|
180
|
+
|
181
|
+
h = hash.transform_values do |value|
|
182
|
+
case value
|
183
|
+
when Range
|
184
|
+
value
|
185
|
+
when Location
|
186
|
+
value.range
|
187
|
+
else
|
188
|
+
raise
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
this.required_children.merge!(h)
|
193
|
+
|
194
|
+
this
|
195
|
+
end
|
196
|
+
|
197
|
+
def merge_optional(hash)
|
198
|
+
this = dup
|
199
|
+
|
200
|
+
h = hash.transform_values do |value|
|
201
|
+
case value
|
202
|
+
when Range
|
203
|
+
value
|
204
|
+
when Location
|
205
|
+
value.range
|
206
|
+
else
|
207
|
+
nil
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
this.optional_children.merge!(h)
|
212
|
+
|
213
|
+
this
|
214
|
+
end
|
111
215
|
end
|
112
216
|
end
|
113
217
|
end
|
data/lib/rbs/locator.rb
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
module RBS
|
2
|
+
class Locator
|
3
|
+
attr_reader :decls
|
4
|
+
|
5
|
+
def initialize(decls:)
|
6
|
+
@decls = decls
|
7
|
+
end
|
8
|
+
|
9
|
+
def buffer
|
10
|
+
decls[0].location&.buffer or raise
|
11
|
+
end
|
12
|
+
|
13
|
+
def find(line:, column:)
|
14
|
+
pos = buffer.loc_to_pos([line, column])
|
15
|
+
|
16
|
+
decls.each do |decl|
|
17
|
+
array = []
|
18
|
+
find_in_decl(pos, decl: decl, array: array) and return array
|
19
|
+
end
|
20
|
+
|
21
|
+
[]
|
22
|
+
end
|
23
|
+
|
24
|
+
def find2(line:, column:)
|
25
|
+
path = find(line: line, column: column)
|
26
|
+
|
27
|
+
return if path.empty?
|
28
|
+
|
29
|
+
hd, *tl = path
|
30
|
+
if hd.is_a?(Symbol)
|
31
|
+
[hd, tl]
|
32
|
+
else
|
33
|
+
[nil, path]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def find_in_decl(pos, decl:, array:)
|
38
|
+
if test_loc(pos, location: decl.location)
|
39
|
+
array.unshift(decl)
|
40
|
+
|
41
|
+
case decl
|
42
|
+
when AST::Declarations::Class
|
43
|
+
decl.type_params.each do |param|
|
44
|
+
if test_loc(pos, location: param.location)
|
45
|
+
array.unshift(param)
|
46
|
+
find_in_loc(pos, array: array, location: param.location)
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
if super_class = decl.super_class
|
52
|
+
if test_loc(pos, location: super_class.location)
|
53
|
+
array.unshift(super_class)
|
54
|
+
find_in_loc(pos, array: array, location: super_class.location)
|
55
|
+
return true
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
decl.each_decl do |decl_|
|
60
|
+
find_in_decl(pos, decl: decl_, array: array) and return true
|
61
|
+
end
|
62
|
+
|
63
|
+
decl.each_member do |member|
|
64
|
+
find_in_member(pos, array: array, member: member) and return true
|
65
|
+
end
|
66
|
+
|
67
|
+
when AST::Declarations::Module
|
68
|
+
decl.type_params.each do |param|
|
69
|
+
if test_loc(pos, location: param.location)
|
70
|
+
array.unshift(param)
|
71
|
+
find_in_loc(pos, array: array, location: param.location)
|
72
|
+
return true
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
decl.self_types.each do |self_type|
|
77
|
+
if test_loc(pos, location: self_type.location)
|
78
|
+
array.unshift(self_type)
|
79
|
+
find_in_loc(pos, array: array, location: self_type.location)
|
80
|
+
return true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
decl.each_decl do |decl_|
|
85
|
+
find_in_decl(pos, decl: decl_, array: array) and return true
|
86
|
+
end
|
87
|
+
|
88
|
+
decl.each_member do |member|
|
89
|
+
find_in_member(pos, array: array, member: member) and return true
|
90
|
+
end
|
91
|
+
|
92
|
+
when AST::Declarations::Interface
|
93
|
+
decl.type_params.each do |param|
|
94
|
+
if test_loc(pos, location: param.location)
|
95
|
+
array.unshift(param)
|
96
|
+
find_in_loc(pos, array: array, location: param.location)
|
97
|
+
return true
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
decl.members.each do |member|
|
102
|
+
find_in_member(pos, array: array, member: member) and return true
|
103
|
+
end
|
104
|
+
|
105
|
+
when AST::Declarations::Constant, AST::Declarations::Global
|
106
|
+
find_in_type(pos, array: array, type: decl.type) and return true
|
107
|
+
|
108
|
+
when AST::Declarations::Alias
|
109
|
+
find_in_type(pos, array: array, type: decl.type) and return true
|
110
|
+
end
|
111
|
+
|
112
|
+
find_in_loc(pos, location: decl.location, array: array)
|
113
|
+
|
114
|
+
true
|
115
|
+
else
|
116
|
+
false
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_in_member(pos, member:, array:)
|
121
|
+
if test_loc(pos, location: member.location)
|
122
|
+
array.unshift(member)
|
123
|
+
|
124
|
+
case member
|
125
|
+
when AST::Members::MethodDefinition
|
126
|
+
member.types.each do |method_type|
|
127
|
+
find_in_method_type(pos, array: array, method_type: method_type) and return true
|
128
|
+
end
|
129
|
+
when AST::Members::InstanceVariable, AST::Members::ClassInstanceVariable, AST::Members::ClassVariable
|
130
|
+
find_in_type(pos, array: array, type: member.type) and return true
|
131
|
+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
132
|
+
find_in_type(pos, array: array, type: member.type) and return true
|
133
|
+
end
|
134
|
+
|
135
|
+
find_in_loc(pos, location: member.location, array: array)
|
136
|
+
|
137
|
+
true
|
138
|
+
else
|
139
|
+
false
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def find_in_method_type(pos, method_type:, array:)
|
144
|
+
if test_loc(pos, location: method_type.location)
|
145
|
+
array.unshift(method_type)
|
146
|
+
|
147
|
+
method_type.each_type do |type|
|
148
|
+
find_in_type(pos, array: array, type: type) and break
|
149
|
+
end
|
150
|
+
|
151
|
+
true
|
152
|
+
else
|
153
|
+
false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
def find_in_type(pos, type:, array:)
|
158
|
+
if test_loc(pos, location: type.location)
|
159
|
+
array.unshift(type)
|
160
|
+
|
161
|
+
type.each_type do |type_|
|
162
|
+
find_in_type(pos, array: array, type: type_) and return true
|
163
|
+
end
|
164
|
+
|
165
|
+
find_in_loc(pos, array: array, location: type.location)
|
166
|
+
|
167
|
+
true
|
168
|
+
else
|
169
|
+
false
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def find_in_loc(pos, location:, array:)
|
174
|
+
if test_loc(pos, location: location)
|
175
|
+
if location.is_a?(Location::WithChildren)
|
176
|
+
location.optional_children.each do |key, range|
|
177
|
+
if range === pos
|
178
|
+
array.unshift(key)
|
179
|
+
return true
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
location.required_children.each do |key, range|
|
184
|
+
if range === pos
|
185
|
+
array.unshift(key)
|
186
|
+
return true
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
true
|
192
|
+
else
|
193
|
+
false
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_loc(pos, location:)
|
198
|
+
if location
|
199
|
+
location.range === pos
|
200
|
+
else
|
201
|
+
false
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|