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