rbs 2.5.1 → 2.6.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/comments.yml +1 -1
- data/.github/workflows/ruby.yml +3 -3
- data/CHANGELOG.md +44 -0
- data/Gemfile.lock +5 -5
- data/Rakefile +6 -38
- data/Steepfile +6 -2
- data/core/constants.rbs +1 -1
- data/core/env.rbs +1 -1323
- data/core/global_variables.rbs +1 -1
- data/core/hash.rbs +3 -3
- data/core/kernel.rbs +2 -2
- data/core/random.rbs +5 -220
- data/core/rational.rbs +3 -3
- data/core/rbs/unnamed/argf.rbs +965 -0
- data/core/rbs/unnamed/env_class.rbs +1325 -0
- data/core/rbs/unnamed/random.rbs +270 -0
- data/core/regexp.rbs +2 -3
- data/docs/CONTRIBUTING.md +2 -2
- data/ext/rbs_extension/lexer.c +1343 -1353
- data/ext/rbs_extension/lexer.re +2 -2
- data/ext/rbs_extension/rbs_extension.h +1 -1
- data/ext/rbs_extension/unescape.c +17 -10
- data/lib/rbs/ast/members.rb +6 -3
- data/lib/rbs/cli.rb +2 -0
- data/lib/rbs/factory.rb +2 -0
- data/lib/rbs/prototype/helpers.rb +1 -5
- data/lib/rbs/prototype/rb.rb +105 -56
- data/lib/rbs/prototype/rbi.rb +65 -30
- data/lib/rbs/prototype/runtime.rb +4 -3
- data/lib/rbs/test/setup_helper.rb +6 -1
- data/lib/rbs/version.rb +1 -1
- data/schema/members.json +4 -1
- data/sig/collection/config.rbs +3 -0
- data/sig/factory.rbs +5 -0
- data/sig/prototype/helpers.rbs +23 -0
- data/sig/prototype/rb.rbs +84 -0
- data/sig/prototype/rbi.rbs +73 -0
- data/sig/shims/abstract_syntax_tree.rbs +25 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/pp.rbs +3 -0
- data/sig/shims/ripper.rbs +8 -0
- data/stdlib/cgi/0/manifest.yaml +2 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/etc/0/etc.rbs +745 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/manifest.yaml +2 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +49 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +16 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +545 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +16 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +258 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +60 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +42 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +6 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +54 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +17 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +51 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +131 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +125 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +76 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +76 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +10 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +5 -0
- data/stdlib/minitest/0/minitest.rbs +966 -0
- data/stdlib/rubygems/0/errors.rbs +113 -0
- metadata +54 -4
- data/lib/rbs/char_scanner.rb +0 -20
data/ext/rbs_extension/lexer.re
CHANGED
@@ -94,8 +94,8 @@ start:
|
|
94
94
|
"untyped" { return next_token(state, kUNTYPED); }
|
95
95
|
"void" { return next_token(state, kVOID); }
|
96
96
|
|
97
|
-
dqstring = ["] ("\\"["] | [^"
|
98
|
-
sqstring = ['] ("\\"['] | [^'\x00])* ['];
|
97
|
+
dqstring = ["] ("\\"[abefnrstv"\\] | [^"\\\x00])* ["];
|
98
|
+
sqstring = ['] ("\\"['\\] | [^'\x00])* ['];
|
99
99
|
|
100
100
|
dqstring { return next_token(state, tDQSTRING); }
|
101
101
|
sqstring { return next_token(state, tSQSTRING); }
|
@@ -15,7 +15,7 @@
|
|
15
15
|
* '\\n' => "\n"
|
16
16
|
*
|
17
17
|
* */
|
18
|
-
void rbs_unescape_string(VALUE string);
|
18
|
+
void rbs_unescape_string(VALUE string, bool dq_string);
|
19
19
|
|
20
20
|
/**
|
21
21
|
* Receives `parserstate` and `range`, which represents a string token or symbol token, and returns a string VALUE.
|
@@ -1,16 +1,23 @@
|
|
1
1
|
#include "rbs_extension.h"
|
2
2
|
|
3
|
-
static VALUE
|
3
|
+
static VALUE DQ_REGEXP = 0;
|
4
|
+
static VALUE SQ_REGEXP = 0;
|
4
5
|
static VALUE HASH = 0;
|
5
6
|
|
6
|
-
static const char *
|
7
|
+
static const char *dq_regexp_str = "\\\\[abefnrstv\"\\\\]";
|
8
|
+
static const char *sq_regexp_str = "\\\\[\'\\\\]";
|
7
9
|
|
8
10
|
static ID gsub = 0;
|
9
11
|
|
10
|
-
void rbs_unescape_string(VALUE string) {
|
11
|
-
if (!
|
12
|
-
|
13
|
-
rb_global_variable(&
|
12
|
+
void rbs_unescape_string(VALUE string, bool dq_string) {
|
13
|
+
if (!DQ_REGEXP) {
|
14
|
+
DQ_REGEXP = rb_reg_new(dq_regexp_str, strlen(dq_regexp_str), 0);
|
15
|
+
rb_global_variable(&DQ_REGEXP);
|
16
|
+
}
|
17
|
+
|
18
|
+
if (!SQ_REGEXP) {
|
19
|
+
SQ_REGEXP = rb_reg_new(sq_regexp_str, strlen(sq_regexp_str), 0);
|
20
|
+
rb_global_variable(&SQ_REGEXP);
|
14
21
|
}
|
15
22
|
|
16
23
|
if (!gsub) {
|
@@ -30,9 +37,11 @@ void rbs_unescape_string(VALUE string) {
|
|
30
37
|
rb_hash_aset(HASH, rb_str_new_literal("\\t"), rb_str_new_literal("\t"));
|
31
38
|
rb_hash_aset(HASH, rb_str_new_literal("\\v"), rb_str_new_literal("\v"));
|
32
39
|
rb_hash_aset(HASH, rb_str_new_literal("\\\""), rb_str_new_literal("\""));
|
40
|
+
rb_hash_aset(HASH, rb_str_new_literal("\\\'"), rb_str_new_literal("'"));
|
41
|
+
rb_hash_aset(HASH, rb_str_new_literal("\\\\"), rb_str_new_literal("\\"));
|
33
42
|
}
|
34
43
|
|
35
|
-
rb_funcall(string, gsub, 2,
|
44
|
+
rb_funcall(string, gsub, 2, dq_string ? DQ_REGEXP : SQ_REGEXP, HASH);
|
36
45
|
}
|
37
46
|
|
38
47
|
VALUE rbs_unquote_string(parserstate *state, range rg, int offset_bytes) {
|
@@ -56,9 +65,7 @@ VALUE rbs_unquote_string(parserstate *state, range rg, int offset_bytes) {
|
|
56
65
|
char *buffer = RSTRING_PTR(state->lexstate->string) + rg.start.byte_pos + offset_bytes;
|
57
66
|
VALUE str = rb_enc_str_new(buffer, byte_length, enc);
|
58
67
|
|
59
|
-
|
60
|
-
rbs_unescape_string(str);
|
61
|
-
}
|
68
|
+
rbs_unescape_string(str, first_char == '\"');
|
62
69
|
|
63
70
|
return str;
|
64
71
|
}
|
data/lib/rbs/ast/members.rb
CHANGED
@@ -282,7 +282,8 @@ module RBS
|
|
282
282
|
kind: kind,
|
283
283
|
annotations: annotations,
|
284
284
|
location: location,
|
285
|
-
comment: comment
|
285
|
+
comment: comment,
|
286
|
+
visibility: visibility
|
286
287
|
}.to_json(state)
|
287
288
|
end
|
288
289
|
end
|
@@ -299,7 +300,8 @@ module RBS
|
|
299
300
|
kind: kind,
|
300
301
|
annotations: annotations,
|
301
302
|
location: location,
|
302
|
-
comment: comment
|
303
|
+
comment: comment,
|
304
|
+
visibility: visibility
|
303
305
|
}.to_json(state)
|
304
306
|
end
|
305
307
|
end
|
@@ -316,7 +318,8 @@ module RBS
|
|
316
318
|
kind: kind,
|
317
319
|
annotations: annotations,
|
318
320
|
location: location,
|
319
|
-
comment: comment
|
321
|
+
comment: comment,
|
322
|
+
visibility: visibility
|
320
323
|
}.to_json(state)
|
321
324
|
end
|
322
325
|
end
|
data/lib/rbs/cli.rb
CHANGED
data/lib/rbs/factory.rb
CHANGED
@@ -12,10 +12,7 @@ module RBS
|
|
12
12
|
|
13
13
|
if block
|
14
14
|
method_block = Types::Block.new(
|
15
|
-
|
16
|
-
# In this case the block looks optional in most cases, so it marks optional.
|
17
|
-
# In other cases, we can't determine which is required or optional, so it marks required.
|
18
|
-
required: block != :&,
|
15
|
+
required: false,
|
19
16
|
type: Types::Function.empty(untyped)
|
20
17
|
)
|
21
18
|
end
|
@@ -76,7 +73,6 @@ module RBS
|
|
76
73
|
end
|
77
74
|
end
|
78
75
|
|
79
|
-
|
80
76
|
def any_node?(node, nodes: [], &block)
|
81
77
|
if yield(node)
|
82
78
|
nodes << node
|
data/lib/rbs/prototype/rb.rb
CHANGED
@@ -3,7 +3,9 @@ module RBS
|
|
3
3
|
class RB
|
4
4
|
include Helpers
|
5
5
|
|
6
|
-
Context = Struct.new(:module_function, :singleton, :namespace, keyword_init: true) do
|
6
|
+
Context = _ = Struct.new(:module_function, :singleton, :namespace, keyword_init: true) do
|
7
|
+
# @implements Context
|
8
|
+
|
7
9
|
def self.initial(namespace: Namespace.root)
|
8
10
|
self.new(module_function: false, singleton: false, namespace: namespace)
|
9
11
|
end
|
@@ -35,9 +37,12 @@ module RBS
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def decls
|
40
|
+
# @type var decls: Array[AST::Declarations::t]
|
38
41
|
decls = []
|
39
42
|
|
40
|
-
|
43
|
+
# @type var top_decls: Array[AST::Declarations::t]
|
44
|
+
# @type var top_members: Array[AST::Members::t]
|
45
|
+
top_decls, top_members = _ = source_decls.partition {|decl| decl.is_a?(AST::Declarations::Base) }
|
41
46
|
|
42
47
|
decls.push(*top_decls)
|
43
48
|
|
@@ -58,11 +63,18 @@ module RBS
|
|
58
63
|
end
|
59
64
|
|
60
65
|
def parse(string)
|
66
|
+
# @type var comments: Hash[Integer, AST::Comment]
|
61
67
|
comments = Ripper.lex(string).yield_self do |tokens|
|
68
|
+
code_lines = {}
|
62
69
|
tokens.each.with_object({}) do |token, hash|
|
63
|
-
|
70
|
+
case token[1]
|
71
|
+
when :on_sp, :on_ignored_nl
|
72
|
+
# skip
|
73
|
+
when :on_comment
|
64
74
|
line = token[0][0]
|
65
|
-
|
75
|
+
# skip like `module Foo # :nodoc:`
|
76
|
+
next if code_lines[line]
|
77
|
+
body = token[2][2..-1] or raise
|
66
78
|
|
67
79
|
body = "\n" if body.empty?
|
68
80
|
|
@@ -74,6 +86,8 @@ module RBS
|
|
74
86
|
else
|
75
87
|
hash[line] = comment
|
76
88
|
end
|
89
|
+
else
|
90
|
+
code_lines[token[0][0]] = true
|
77
91
|
end
|
78
92
|
end
|
79
93
|
end
|
@@ -84,15 +98,18 @@ module RBS
|
|
84
98
|
def process(node, decls:, comments:, context:)
|
85
99
|
case node.type
|
86
100
|
when :CLASS
|
87
|
-
class_name,
|
88
|
-
super_class_name = const_to_name(
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
101
|
+
class_name, super_class_node, *class_body = node.children
|
102
|
+
super_class_name = const_to_name(super_class_node, context: context)
|
103
|
+
super_class =
|
104
|
+
if super_class_name
|
105
|
+
AST::Declarations::Class::Super.new(name: super_class_name, args: [], location: nil)
|
106
|
+
else
|
107
|
+
# Give up detect super class e.g. `class Foo < Struct.new(:bar)`
|
108
|
+
nil
|
109
|
+
end
|
93
110
|
kls = AST::Declarations::Class.new(
|
94
|
-
name: const_to_name(class_name),
|
95
|
-
super_class: super_class
|
111
|
+
name: const_to_name!(class_name),
|
112
|
+
super_class: super_class,
|
96
113
|
type_params: [],
|
97
114
|
members: [],
|
98
115
|
annotations: [],
|
@@ -112,7 +129,7 @@ module RBS
|
|
112
129
|
module_name, *module_body = node.children
|
113
130
|
|
114
131
|
mod = AST::Declarations::Module.new(
|
115
|
-
name: const_to_name(module_name),
|
132
|
+
name: const_to_name!(module_name),
|
116
133
|
type_params: [],
|
117
134
|
self_types: [],
|
118
135
|
members: [],
|
@@ -144,34 +161,36 @@ module RBS
|
|
144
161
|
decls << accessibility
|
145
162
|
|
146
163
|
when :DEFN, :DEFS
|
147
|
-
|
148
|
-
def_name, def_body = node.children
|
149
|
-
kind = context.method_kind
|
150
|
-
else
|
151
|
-
_, def_name, def_body = node.children
|
152
|
-
kind = :singleton
|
153
|
-
end
|
164
|
+
# @type var kind: Context::method_kind
|
154
165
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
kind: kind,
|
170
|
-
comment: comments[node.first_lineno - 1],
|
171
|
-
overload: false
|
166
|
+
if node.type == :DEFN
|
167
|
+
def_name, def_body = node.children
|
168
|
+
kind = context.method_kind
|
169
|
+
else
|
170
|
+
_, def_name, def_body = node.children
|
171
|
+
kind = :singleton
|
172
|
+
end
|
173
|
+
|
174
|
+
types = [
|
175
|
+
MethodType.new(
|
176
|
+
type_params: [],
|
177
|
+
type: function_type_from_body(def_body, def_name),
|
178
|
+
block: block_from_body(def_body),
|
179
|
+
location: nil
|
172
180
|
)
|
181
|
+
]
|
182
|
+
|
183
|
+
member = AST::Members::MethodDefinition.new(
|
184
|
+
name: def_name,
|
185
|
+
location: nil,
|
186
|
+
annotations: [],
|
187
|
+
types: types,
|
188
|
+
kind: kind,
|
189
|
+
comment: comments[node.first_lineno - 1],
|
190
|
+
overload: false
|
191
|
+
)
|
173
192
|
|
174
|
-
|
193
|
+
decls.push member unless decls.include?(member)
|
175
194
|
|
176
195
|
when :ALIAS
|
177
196
|
new_name, old_name = node.children.map { |c| literal_to_symbol(c) }
|
@@ -192,7 +211,7 @@ module RBS
|
|
192
211
|
case node.children[0]
|
193
212
|
when :include
|
194
213
|
args.each do |arg|
|
195
|
-
if (name = const_to_name(arg))
|
214
|
+
if (name = const_to_name(arg, context: context))
|
196
215
|
decls << AST::Members::Include.new(
|
197
216
|
name: name,
|
198
217
|
args: [],
|
@@ -204,7 +223,7 @@ module RBS
|
|
204
223
|
end
|
205
224
|
when :prepend
|
206
225
|
args.each do |arg|
|
207
|
-
if (name = const_to_name(arg))
|
226
|
+
if (name = const_to_name(arg, context: context))
|
208
227
|
decls << AST::Members::Prepend.new(
|
209
228
|
name: name,
|
210
229
|
args: [],
|
@@ -286,8 +305,10 @@ module RBS
|
|
286
305
|
module_func_context = context.dup.tap { |ctx| ctx.module_function = true }
|
287
306
|
args.each do |arg|
|
288
307
|
if arg && (name = literal_to_symbol(arg))
|
289
|
-
if i = find_def_index_by_name(decls, name)
|
290
|
-
|
308
|
+
if (i, defn = find_def_index_by_name(decls, name))
|
309
|
+
if defn.is_a?(AST::Members::MethodDefinition)
|
310
|
+
decls[i] = defn.update(kind: :singleton_instance)
|
311
|
+
end
|
291
312
|
end
|
292
313
|
elsif arg
|
293
314
|
process arg, decls: decls, comments: comments, context: module_func_context
|
@@ -301,7 +322,7 @@ module RBS
|
|
301
322
|
else
|
302
323
|
args.each do |arg|
|
303
324
|
if arg && (name = literal_to_symbol(arg))
|
304
|
-
if i = find_def_index_by_name(decls, name)
|
325
|
+
if (i, _ = find_def_index_by_name(decls, name))
|
305
326
|
current = current_accessibility(decls, i)
|
306
327
|
if current != accessibility
|
307
328
|
decls.insert(i + 1, current)
|
@@ -335,7 +356,7 @@ module RBS
|
|
335
356
|
when node.children[0].is_a?(Symbol)
|
336
357
|
TypeName.new(name: node.children[0], namespace: Namespace.empty)
|
337
358
|
else
|
338
|
-
const_to_name(node.children[0])
|
359
|
+
const_to_name!(node.children[0])
|
339
360
|
end
|
340
361
|
|
341
362
|
value_node = node.children.last
|
@@ -363,13 +384,13 @@ module RBS
|
|
363
384
|
end
|
364
385
|
end
|
365
386
|
|
366
|
-
def const_to_name(node
|
367
|
-
case node
|
387
|
+
def const_to_name!(node)
|
388
|
+
case node.type
|
368
389
|
when :CONST
|
369
390
|
TypeName.new(name: node.children[0], namespace: Namespace.empty)
|
370
391
|
when :COLON2
|
371
392
|
if node.children[0]
|
372
|
-
namespace = const_to_name(node.children[0]).to_namespace
|
393
|
+
namespace = const_to_name!(node.children[0]).to_namespace
|
373
394
|
else
|
374
395
|
namespace = Namespace.empty
|
375
396
|
end
|
@@ -377,8 +398,19 @@ module RBS
|
|
377
398
|
TypeName.new(name: node.children[1], namespace: namespace)
|
378
399
|
when :COLON3
|
379
400
|
TypeName.new(name: node.children[0], namespace: Namespace.root)
|
380
|
-
|
381
|
-
|
401
|
+
else
|
402
|
+
raise
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
406
|
+
def const_to_name(node, context:)
|
407
|
+
if node
|
408
|
+
case node.type
|
409
|
+
when :SELF
|
410
|
+
context.namespace.to_type_name
|
411
|
+
when :CONST, :COLON2, :COLON3
|
412
|
+
const_to_name!(node)
|
413
|
+
end
|
382
414
|
end
|
383
415
|
end
|
384
416
|
|
@@ -561,6 +593,8 @@ module RBS
|
|
561
593
|
value_type = types_to_union_type(value_types)
|
562
594
|
BuiltinNames::Hash.instance_type(key_type, value_type)
|
563
595
|
end
|
596
|
+
when :SELF
|
597
|
+
Types::Bases::Self.new(location: nil)
|
564
598
|
when :CALL
|
565
599
|
receiver, method_name, * = node.children
|
566
600
|
case method_name
|
@@ -578,7 +612,9 @@ module RBS
|
|
578
612
|
return untyped if types.empty?
|
579
613
|
|
580
614
|
uniq = types.uniq
|
581
|
-
|
615
|
+
if uniq.size == 1
|
616
|
+
return uniq.first || raise
|
617
|
+
end
|
582
618
|
|
583
619
|
Types::Union.new(types: uniq, location: nil)
|
584
620
|
end
|
@@ -597,7 +633,7 @@ module RBS
|
|
597
633
|
end.uniq
|
598
634
|
|
599
635
|
if types.size == 1
|
600
|
-
types.first
|
636
|
+
types.first or raise
|
601
637
|
else
|
602
638
|
untyped
|
603
639
|
end
|
@@ -647,11 +683,17 @@ module RBS
|
|
647
683
|
end
|
648
684
|
|
649
685
|
def current_accessibility(decls, index = decls.size)
|
650
|
-
|
651
|
-
|
686
|
+
slice = decls.slice(0, index) or raise
|
687
|
+
idx = slice.rindex { |decl| decl == private || decl == public }
|
688
|
+
if idx
|
689
|
+
_ = decls[idx]
|
690
|
+
else
|
691
|
+
public
|
692
|
+
end
|
652
693
|
end
|
653
694
|
|
654
695
|
def remove_unnecessary_accessibility_methods!(decls)
|
696
|
+
# @type var current: decl
|
655
697
|
current = public
|
656
698
|
idx = 0
|
657
699
|
|
@@ -673,7 +715,7 @@ module RBS
|
|
673
715
|
idx += 1
|
674
716
|
end
|
675
717
|
|
676
|
-
decls.pop while decls.last && is_accessibility?(decls.last)
|
718
|
+
decls.pop while decls.last && is_accessibility?(decls.last || raise)
|
677
719
|
end
|
678
720
|
|
679
721
|
def is_accessibility?(decl)
|
@@ -681,14 +723,21 @@ module RBS
|
|
681
723
|
end
|
682
724
|
|
683
725
|
def find_def_index_by_name(decls, name)
|
684
|
-
decls.find_index do |decl|
|
726
|
+
index = decls.find_index do |decl|
|
685
727
|
case decl
|
686
728
|
when AST::Members::MethodDefinition, AST::Members::AttrReader
|
687
729
|
decl.name == name
|
688
730
|
when AST::Members::AttrWriter
|
689
|
-
|
731
|
+
:"#{decl.name}=" == name
|
690
732
|
end
|
691
733
|
end
|
734
|
+
|
735
|
+
if index
|
736
|
+
[
|
737
|
+
index,
|
738
|
+
_ = decls[index]
|
739
|
+
]
|
740
|
+
end
|
692
741
|
end
|
693
742
|
end
|
694
743
|
end
|