rbs-inline 0.4.0 → 0.5.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/README.md +8 -5
- data/Rakefile +12 -0
- data/lib/rbs/inline/annotation_parser/tokenizer.rb +361 -0
- data/lib/rbs/inline/annotation_parser.rb +548 -326
- data/lib/rbs/inline/ast/annotations.rb +427 -138
- data/lib/rbs/inline/ast/comment_lines.rb +17 -20
- data/lib/rbs/inline/ast/declarations.rb +64 -28
- data/lib/rbs/inline/ast/members.rb +129 -115
- data/lib/rbs/inline/ast/tree.rb +37 -22
- data/lib/rbs/inline/cli.rb +12 -12
- data/lib/rbs/inline/node_utils.rb +1 -1
- data/lib/rbs/inline/parser.rb +134 -65
- data/lib/rbs/inline/version.rb +1 -1
- data/lib/rbs/inline/writer.rb +195 -118
- data/lib/rbs/inline.rb +1 -0
- data/sig/generated/rbs/inline/annotation_parser/tokenizer.rbs +221 -0
- data/sig/generated/rbs/inline/annotation_parser.rbs +148 -92
- data/sig/generated/rbs/inline/ast/annotations.rbs +141 -37
- data/sig/generated/rbs/inline/ast/comment_lines.rbs +8 -4
- data/sig/generated/rbs/inline/ast/declarations.rbs +26 -10
- data/sig/generated/rbs/inline/ast/members.rbs +26 -15
- data/sig/generated/rbs/inline/ast/tree.rbs +23 -17
- data/sig/generated/rbs/inline/cli.rbs +3 -3
- data/sig/generated/rbs/inline/node_utils.rbs +1 -1
- data/sig/generated/rbs/inline/parser.rbs +35 -18
- data/sig/generated/rbs/inline/writer.rbs +54 -22
- metadata +4 -2
@@ -12,26 +12,108 @@ module RBS
|
|
12
12
|
# | Generic
|
13
13
|
# | ModuleSelf
|
14
14
|
# | Skip
|
15
|
-
# |
|
15
|
+
# | MethodTypeAssertion | TypeAssertion | SyntaxErrorAssertion | Dot3Assertion
|
16
16
|
# | Application
|
17
17
|
# | RBSAnnotation
|
18
18
|
# | Override
|
19
19
|
# | IvarType
|
20
|
-
# | Yields
|
21
20
|
# | Embedded
|
21
|
+
# | Method
|
22
|
+
# | SplatParamType
|
23
|
+
# | DoubleSplatParamType
|
24
|
+
# | BlockType
|
25
|
+
# | ModuleDecl
|
26
|
+
# | ClassDecl
|
22
27
|
# # | Def
|
23
28
|
# # | AttrReader | AttrWriter | AttrAccessor
|
24
29
|
# # | Include | Extend | Prepend
|
25
30
|
# # | Alias
|
26
31
|
|
32
|
+
module Utils
|
33
|
+
# @rbs (Tree) -> RBS::AST::TypeParam?
|
34
|
+
def translate_type_param(tree)
|
35
|
+
unchecked = tree.nth_token?(0) != nil
|
36
|
+
inout =
|
37
|
+
case tree.nth_token?(1)&.[](0)
|
38
|
+
when nil
|
39
|
+
:invariant
|
40
|
+
when :kIN
|
41
|
+
:contravariant
|
42
|
+
when :kOUT
|
43
|
+
:covariant
|
44
|
+
end #: RBS::AST::TypeParam::variance
|
45
|
+
|
46
|
+
name = tree.nth_token?(2)&.last
|
47
|
+
|
48
|
+
if bound = tree.nth_tree?(3)
|
49
|
+
if type = bound.nth_type?(1)
|
50
|
+
case type
|
51
|
+
when Types::ClassSingleton, Types::ClassInstance, Types::Interface
|
52
|
+
upper_bound = type
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
if name
|
58
|
+
RBS::AST::TypeParam.new(
|
59
|
+
name: name.to_sym,
|
60
|
+
variance: inout,
|
61
|
+
upper_bound: upper_bound,
|
62
|
+
location: nil
|
63
|
+
).unchecked!(unchecked)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# @rbs (Types::t) -> RBS::AST::Declarations::Class::Super?
|
68
|
+
def translate_super_class(type)
|
69
|
+
case type
|
70
|
+
when Types::ClassInstance
|
71
|
+
RBS::AST::Declarations::Class::Super.new(
|
72
|
+
name: type.name,
|
73
|
+
args: type.args,
|
74
|
+
location: nil
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Assumes the tree is generated through `#parse_module_name`
|
80
|
+
#
|
81
|
+
# Returns a type name, or `nil` if the tree is something invalid.
|
82
|
+
#
|
83
|
+
# @param tree -- A tree object that is generated through `#parse_module_name`
|
84
|
+
#
|
85
|
+
# @rbs (AST::Tree) -> TypeName?
|
86
|
+
def translate_type_name(tree)
|
87
|
+
tokens = tree.non_trivia_trees
|
88
|
+
|
89
|
+
absolute = tokens.shift
|
90
|
+
path = [] #: Array[Symbol]
|
91
|
+
|
92
|
+
tokens.each_slice(2) do |name, colon2|
|
93
|
+
if colon2
|
94
|
+
name or return nil
|
95
|
+
name.is_a?(Array) or return nil
|
96
|
+
|
97
|
+
path << name[1].to_sym
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
last_token = tokens.pop
|
102
|
+
last_token.is_a?(Array) or return nil
|
103
|
+
name = last_token[1].to_sym
|
104
|
+
|
105
|
+
namespace = Namespace.new(path: path, absolute: absolute ? true : false)
|
106
|
+
TypeName.new(namespace: namespace, name: name)
|
107
|
+
end
|
108
|
+
end
|
27
109
|
|
28
110
|
class Base
|
29
|
-
attr_reader :source
|
30
|
-
attr_reader :tree
|
111
|
+
attr_reader :source #: CommentLines
|
112
|
+
attr_reader :tree #: Tree
|
31
113
|
|
32
114
|
# @rbs tree: Tree
|
33
115
|
# @rbs source: CommentLines
|
34
|
-
# @rbs
|
116
|
+
# @rbs return: void
|
35
117
|
def initialize(tree, source)
|
36
118
|
@tree = tree
|
37
119
|
@source = source
|
@@ -39,11 +121,11 @@ module RBS
|
|
39
121
|
end
|
40
122
|
|
41
123
|
class VarType < Base
|
42
|
-
attr_reader :name
|
124
|
+
attr_reader :name #: Symbol
|
43
125
|
|
44
|
-
attr_reader :type
|
126
|
+
attr_reader :type #: Types::t?
|
45
127
|
|
46
|
-
attr_reader :comment
|
128
|
+
attr_reader :comment #: String?
|
47
129
|
|
48
130
|
# @rbs override
|
49
131
|
def initialize(tree, source)
|
@@ -65,7 +147,7 @@ module RBS
|
|
65
147
|
end
|
66
148
|
end
|
67
149
|
|
68
|
-
|
150
|
+
#: () -> bool
|
69
151
|
def complete?
|
70
152
|
if name && type
|
71
153
|
true
|
@@ -75,11 +157,100 @@ module RBS
|
|
75
157
|
end
|
76
158
|
end
|
77
159
|
|
78
|
-
|
160
|
+
class SpecialVarTypeAnnotation < Base
|
161
|
+
attr_reader :name #: Symbol?
|
162
|
+
|
163
|
+
attr_reader :type #: Types::t?
|
164
|
+
|
165
|
+
attr_reader :comment #: String?
|
166
|
+
|
167
|
+
attr_reader :type_source #: String
|
168
|
+
|
169
|
+
# @rbs override
|
170
|
+
def initialize(tree, source)
|
171
|
+
@tree = tree
|
172
|
+
@source = source
|
173
|
+
|
174
|
+
annotation = tree.nth_tree!(1)
|
175
|
+
|
176
|
+
if name = annotation.nth_token?(1)
|
177
|
+
@name = name[1].to_sym
|
178
|
+
end
|
179
|
+
|
180
|
+
if type = annotation.nth_type?(3)
|
181
|
+
@type = type
|
182
|
+
@type_source = type.location&.source || raise
|
183
|
+
else
|
184
|
+
@type = nil
|
185
|
+
@type_source = annotation.nth_tree!(3)&.to_s || raise
|
186
|
+
end
|
187
|
+
|
188
|
+
if comment = annotation.nth_tree(4)
|
189
|
+
@comment = comment.to_s
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# `@rbs *x: T`
|
195
|
+
class SplatParamType < SpecialVarTypeAnnotation
|
196
|
+
end
|
197
|
+
|
198
|
+
# `@rbs` **x: T
|
199
|
+
class DoubleSplatParamType < SpecialVarTypeAnnotation
|
200
|
+
end
|
201
|
+
|
202
|
+
# `@rbs &block: METHOD-TYPE` or `@rbs &block: ? METHOD-TYPE`
|
203
|
+
class BlockType < Base
|
204
|
+
attr_reader :name #: Symbol?
|
205
|
+
|
206
|
+
attr_reader :type #: Types::Block?
|
207
|
+
|
208
|
+
attr_reader :comment #: String?
|
209
|
+
|
210
|
+
attr_reader :type_source #: String
|
211
|
+
|
212
|
+
# @rbs override
|
213
|
+
def initialize(tree, source)
|
214
|
+
@tree = tree
|
215
|
+
@source = source
|
216
|
+
|
217
|
+
annotation = tree.nth_tree!(1)
|
218
|
+
|
219
|
+
if name = annotation.nth_token?(1)
|
220
|
+
@name = name[1].to_sym
|
221
|
+
end
|
222
|
+
|
223
|
+
optional = annotation.nth_token?(3)
|
224
|
+
|
225
|
+
if type_token = annotation.nth_token?(4)
|
226
|
+
block_src = type_token[1]
|
227
|
+
|
228
|
+
proc_type = ::RBS::Parser.parse_type("^" + block_src, require_eof: true) rescue RBS::ParsingError
|
229
|
+
if proc_type.is_a?(Types::Proc)
|
230
|
+
@type = Types::Block.new(
|
231
|
+
type: proc_type.type,
|
232
|
+
required: !optional,
|
233
|
+
self_type: proc_type.self_type
|
234
|
+
)
|
235
|
+
end
|
236
|
+
|
237
|
+
@type_source = block_src
|
238
|
+
else
|
239
|
+
@type = nil
|
240
|
+
@type_source = ""
|
241
|
+
end
|
242
|
+
|
243
|
+
if comment = annotation.nth_tree(5)
|
244
|
+
@comment = comment.to_s
|
245
|
+
end
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
# `@rbs return: T`
|
79
250
|
class ReturnType < Base
|
80
|
-
attr_reader :type
|
251
|
+
attr_reader :type #: Types::t?
|
81
252
|
|
82
|
-
attr_reader :comment
|
253
|
+
attr_reader :comment #: String?
|
83
254
|
|
84
255
|
# @rbs override
|
85
256
|
def initialize(tree, source)
|
@@ -88,16 +259,16 @@ module RBS
|
|
88
259
|
|
89
260
|
return_type_decl = tree.nth_tree!(1)
|
90
261
|
|
91
|
-
if type = return_type_decl.nth_type?(
|
262
|
+
if type = return_type_decl.nth_type?(2)
|
92
263
|
@type = type
|
93
264
|
end
|
94
265
|
|
95
|
-
if comment = return_type_decl.nth_tree(
|
266
|
+
if comment = return_type_decl.nth_tree(3)
|
96
267
|
@comment = comment.to_s
|
97
268
|
end
|
98
269
|
end
|
99
270
|
|
100
|
-
# @rbs
|
271
|
+
# @rbs return: bool
|
101
272
|
def complete?
|
102
273
|
if type
|
103
274
|
true
|
@@ -110,13 +281,13 @@ module RBS
|
|
110
281
|
# `@rbs @foo: T` or `@rbs self.@foo: T`
|
111
282
|
#
|
112
283
|
class IvarType < Base
|
113
|
-
attr_reader :name
|
284
|
+
attr_reader :name #: Symbol
|
114
285
|
|
115
|
-
attr_reader :type
|
286
|
+
attr_reader :type #: Types::t?
|
116
287
|
|
117
|
-
attr_reader :class_instance
|
288
|
+
attr_reader :class_instance #: bool
|
118
289
|
|
119
|
-
attr_reader :comment
|
290
|
+
attr_reader :comment #: String?
|
120
291
|
|
121
292
|
# @rbs override
|
122
293
|
def initialize(tree, source)
|
@@ -134,54 +305,62 @@ module RBS
|
|
134
305
|
end
|
135
306
|
end
|
136
307
|
|
137
|
-
|
138
|
-
|
139
|
-
class Assertion < Base
|
140
|
-
attr_reader :type #:: Types::t | MethodType | nil
|
308
|
+
class MethodTypeAssertion < Base
|
309
|
+
attr_reader :method_type #: MethodType
|
141
310
|
|
311
|
+
# @rbs override
|
142
312
|
def initialize(tree, source)
|
143
313
|
@source = source
|
144
314
|
@tree = tree
|
145
315
|
|
146
|
-
@
|
316
|
+
@method_type = tree.nth_method_type!(1)
|
147
317
|
end
|
148
318
|
|
149
|
-
|
150
|
-
|
151
|
-
if type
|
152
|
-
true
|
153
|
-
else
|
154
|
-
false
|
155
|
-
end
|
319
|
+
def type_source #: String
|
320
|
+
method_type.location&.source || raise
|
156
321
|
end
|
322
|
+
end
|
157
323
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
324
|
+
class TypeAssertion < Base
|
325
|
+
attr_reader :type #: Types::t
|
326
|
+
|
327
|
+
# @rbs override
|
328
|
+
def initialize(tree, source)
|
329
|
+
@source = source
|
330
|
+
@tree = tree
|
331
|
+
|
332
|
+
@type = tree.nth_type!(1)
|
167
333
|
end
|
168
334
|
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
335
|
+
def type_source #: String
|
336
|
+
type.location&.source || raise
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
class SyntaxErrorAssertion < Base
|
341
|
+
attr_reader :error_string #: String
|
342
|
+
|
343
|
+
# @rbs override
|
344
|
+
def initialize(tree, source)
|
345
|
+
@tree = tree
|
346
|
+
@source = source
|
347
|
+
|
348
|
+
@error_string = tree.nth_tree(1).to_s
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
class Dot3Assertion < Base
|
353
|
+
# @rbs override
|
354
|
+
def initialize(tree, source)
|
355
|
+
@tree = tree
|
356
|
+
@source = source
|
178
357
|
end
|
179
358
|
end
|
180
359
|
|
181
360
|
# `#[TYPE, ..., TYPE]`
|
182
361
|
#
|
183
362
|
class Application < Base
|
184
|
-
attr_reader :types
|
363
|
+
attr_reader :types #: Array[Types::t]?
|
185
364
|
|
186
365
|
# @rbs override
|
187
366
|
def initialize(tree, source)
|
@@ -204,63 +383,15 @@ module RBS
|
|
204
383
|
end
|
205
384
|
end
|
206
385
|
|
207
|
-
# @rbs
|
386
|
+
# @rbs return: bool
|
208
387
|
def complete?
|
209
388
|
types ? true : false
|
210
389
|
end
|
211
390
|
end
|
212
391
|
|
213
|
-
# `# @rbs yields () -> void -- Comment`
|
214
|
-
#
|
215
|
-
class Yields < Base
|
216
|
-
# The type of block
|
217
|
-
#
|
218
|
-
# * Types::Block when syntactically correct input is given
|
219
|
-
# * String when syntax error is reported
|
220
|
-
# * `nil` when nothing is given
|
221
|
-
#
|
222
|
-
attr_reader :block_type #:: Types::Block | String | nil
|
223
|
-
|
224
|
-
# The content of the comment or `nil`
|
225
|
-
#
|
226
|
-
attr_reader :comment #:: String?
|
227
|
-
|
228
|
-
# If `[optional]` token is inserted just after `yields` token
|
229
|
-
#
|
230
|
-
# The Types::Block instance has correct `required` attribute based on the `[optional]` token.
|
231
|
-
# This is for the other cases, syntax error or omitted.
|
232
|
-
#
|
233
|
-
attr_reader :optional #:: bool
|
234
|
-
|
235
|
-
# @rbs override
|
236
|
-
def initialize(tree, comments)
|
237
|
-
@tree = tree
|
238
|
-
@source = comments
|
239
|
-
|
240
|
-
yields_tree = tree.nth_tree!(1)
|
241
|
-
@optional = yields_tree.nth_token?(1).is_a?(Array)
|
242
|
-
if block_token = yields_tree.nth_token(2)
|
243
|
-
block_src = block_token[1]
|
244
|
-
proc_src = "^" + block_src
|
245
|
-
proc_type = ::RBS::Parser.parse_type(proc_src, require_eof: true) rescue RBS::ParsingError
|
246
|
-
if proc_type.is_a?(Types::Proc)
|
247
|
-
@block_type = Types::Block.new(
|
248
|
-
type: proc_type.type,
|
249
|
-
required: !optional,
|
250
|
-
self_type: proc_type.self_type
|
251
|
-
)
|
252
|
-
else
|
253
|
-
@block_type = block_src
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
@comment = yields_tree.nth_tree?(3)&.to_s
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
392
|
# `# @rbs %a{a} %a{a} ...`
|
262
393
|
class RBSAnnotation < Base
|
263
|
-
attr_reader :contents
|
394
|
+
attr_reader :contents #: Array[String]
|
264
395
|
|
265
396
|
# @rbs override
|
266
397
|
def initialize(tree, comments)
|
@@ -288,8 +419,8 @@ module RBS
|
|
288
419
|
# `# @rbs inherits T`
|
289
420
|
#
|
290
421
|
class Inherits < Base
|
291
|
-
attr_reader :super_name
|
292
|
-
attr_reader :args
|
422
|
+
attr_reader :super_name #: TypeName?
|
423
|
+
attr_reader :args #: Array[Types::t]?
|
293
424
|
|
294
425
|
# @rbs override
|
295
426
|
def initialize(tree, source)
|
@@ -320,7 +451,7 @@ module RBS
|
|
320
451
|
|
321
452
|
# `# @rbs use [USES]`
|
322
453
|
class Use < Base
|
323
|
-
attr_reader :clauses
|
454
|
+
attr_reader :clauses #: Array[RBS::AST::Directives::Use::clause]
|
324
455
|
|
325
456
|
# @rbs override
|
326
457
|
def initialize(tree, source)
|
@@ -372,9 +503,9 @@ module RBS
|
|
372
503
|
|
373
504
|
# `# @rbs module-self [MODULE_SELF]`
|
374
505
|
class ModuleSelf < Base
|
375
|
-
attr_reader :constraint
|
506
|
+
attr_reader :constraint #: RBS::AST::Declarations::Module::Self?
|
376
507
|
|
377
|
-
attr_reader :comment
|
508
|
+
attr_reader :comment #: String?
|
378
509
|
|
379
510
|
# @rbs override
|
380
511
|
def initialize(tree, source)
|
@@ -410,9 +541,11 @@ module RBS
|
|
410
541
|
class Generic < Base
|
411
542
|
# TypeParam object or `nil` if syntax error
|
412
543
|
#
|
413
|
-
attr_reader :type_param
|
544
|
+
attr_reader :type_param #: RBS::AST::TypeParam?
|
545
|
+
|
546
|
+
attr_reader :comment #: String?
|
414
547
|
|
415
|
-
|
548
|
+
include Utils
|
416
549
|
|
417
550
|
# @rbs override
|
418
551
|
def initialize(tree, source)
|
@@ -420,38 +553,10 @@ module RBS
|
|
420
553
|
@source = source
|
421
554
|
|
422
555
|
generic_tree = tree.nth_tree!(1)
|
423
|
-
unchecked = generic_tree.nth_token?(1) != nil
|
424
|
-
inout =
|
425
|
-
case generic_tree.nth_token?(2)&.[](0)
|
426
|
-
when nil
|
427
|
-
:invariant
|
428
|
-
when :kIN
|
429
|
-
:contravariant
|
430
|
-
when :kOUT
|
431
|
-
:covariant
|
432
|
-
end #: RBS::AST::TypeParam::variance
|
433
|
-
|
434
|
-
name = generic_tree.nth_token?(3)&.last
|
435
556
|
|
436
|
-
|
437
|
-
if type = bound.nth_type?(1)
|
438
|
-
case type
|
439
|
-
when Types::ClassSingleton, Types::ClassInstance, Types::Interface
|
440
|
-
upper_bound = type
|
441
|
-
end
|
442
|
-
end
|
443
|
-
end
|
557
|
+
@type_param = translate_type_param(generic_tree.nth_tree!(1))
|
444
558
|
|
445
|
-
if
|
446
|
-
@type_param = RBS::AST::TypeParam.new(
|
447
|
-
name: name.to_sym,
|
448
|
-
variance: inout,
|
449
|
-
upper_bound: upper_bound,
|
450
|
-
location: nil
|
451
|
-
).unchecked!(unchecked)
|
452
|
-
end
|
453
|
-
|
454
|
-
if comment = generic_tree.nth_tree?(5)
|
559
|
+
if comment = generic_tree.nth_tree?(2)
|
455
560
|
@comment = comment.to_s
|
456
561
|
end
|
457
562
|
end
|
@@ -459,7 +564,7 @@ module RBS
|
|
459
564
|
|
460
565
|
# `# @rbs!` annotation
|
461
566
|
class Embedded < Base
|
462
|
-
attr_reader :content
|
567
|
+
attr_reader :content #: String
|
463
568
|
|
464
569
|
# @rbs override
|
465
570
|
def initialize(tree, source)
|
@@ -469,6 +574,190 @@ module RBS
|
|
469
574
|
@content = tree.nth_token!(1)[1]
|
470
575
|
end
|
471
576
|
end
|
577
|
+
|
578
|
+
# `@rbs METHOD-TYPE``
|
579
|
+
#
|
580
|
+
class Method < Base
|
581
|
+
# @rbs! type method_type = [MethodType, method_type?] | String
|
582
|
+
|
583
|
+
attr_reader :method_types #: method_type?
|
584
|
+
|
585
|
+
# `true` if the method definition is overloading something
|
586
|
+
#
|
587
|
+
attr_reader :overloading #: bool
|
588
|
+
|
589
|
+
attr_reader :type #: MethodType?
|
590
|
+
|
591
|
+
attr_reader :method_type_source #: String
|
592
|
+
|
593
|
+
# @rbs override
|
594
|
+
def initialize(tree, source)
|
595
|
+
@tree = tree
|
596
|
+
@source = source
|
597
|
+
|
598
|
+
overloads = tree.nth_tree!(1)
|
599
|
+
@method_types = construct_method_types(overloads.non_trivia_trees.dup)
|
600
|
+
@overloading = overloads.token?(:kDOT3, at: -1)
|
601
|
+
end
|
602
|
+
|
603
|
+
#: (Array[tree]) -> method_type?
|
604
|
+
def construct_method_types(children)
|
605
|
+
first = children.shift
|
606
|
+
|
607
|
+
case first
|
608
|
+
when MethodType
|
609
|
+
children.shift
|
610
|
+
[
|
611
|
+
first,
|
612
|
+
construct_method_types(children)
|
613
|
+
]
|
614
|
+
when Array
|
615
|
+
# `...`
|
616
|
+
nil
|
617
|
+
when AST::Tree
|
618
|
+
# Syntax error
|
619
|
+
first.to_s
|
620
|
+
end
|
621
|
+
end
|
622
|
+
|
623
|
+
# @rbs () { (MethodType) -> void } -> void
|
624
|
+
# | () -> Enumerator[MethodType, void]
|
625
|
+
def each_method_type
|
626
|
+
if block_given?
|
627
|
+
type = self.method_types
|
628
|
+
|
629
|
+
while true
|
630
|
+
if type.is_a?(Array)
|
631
|
+
yield type[0]
|
632
|
+
type = type[1]
|
633
|
+
else
|
634
|
+
break
|
635
|
+
end
|
636
|
+
end
|
637
|
+
else
|
638
|
+
enum_for :each_method_type
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
# Returns the parsing error overload string
|
643
|
+
#
|
644
|
+
# Returns `nil` if no parsing error found.
|
645
|
+
#
|
646
|
+
def error_source #: String?
|
647
|
+
type = self.method_types
|
648
|
+
|
649
|
+
while true
|
650
|
+
if type.is_a?(Array)
|
651
|
+
type = type[1]
|
652
|
+
else
|
653
|
+
break
|
654
|
+
end
|
655
|
+
end
|
656
|
+
|
657
|
+
if type.is_a?(String)
|
658
|
+
type
|
659
|
+
end
|
660
|
+
end
|
661
|
+
end
|
662
|
+
|
663
|
+
# `@rbs module Foo`
|
664
|
+
class ModuleDecl < Base
|
665
|
+
attr_reader :name #: TypeName?
|
666
|
+
|
667
|
+
attr_reader :type_params #: Array[RBS::AST::TypeParam]
|
668
|
+
|
669
|
+
attr_reader :self_types #: Array[RBS::AST::Declarations::Module::Self]
|
670
|
+
|
671
|
+
include Utils
|
672
|
+
|
673
|
+
# @rbs override
|
674
|
+
def initialize(tree, comments)
|
675
|
+
@tree = tree
|
676
|
+
@source = comments
|
677
|
+
|
678
|
+
decl_tree = tree.nth_tree!(1)
|
679
|
+
|
680
|
+
if type_name = translate_type_name(decl_tree.nth_tree!(1))
|
681
|
+
if type_name.class?
|
682
|
+
@name = type_name
|
683
|
+
end
|
684
|
+
end
|
685
|
+
|
686
|
+
@type_params = []
|
687
|
+
if type_params = decl_tree.nth_tree(2)
|
688
|
+
params = type_params.non_trivia_trees
|
689
|
+
params.shift
|
690
|
+
params.pop
|
691
|
+
params.each_slice(2) do |param, _comma|
|
692
|
+
raise unless param.is_a?(Tree)
|
693
|
+
if type_param = translate_type_param(param)
|
694
|
+
@type_params << type_param
|
695
|
+
end
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
699
|
+
@self_types = []
|
700
|
+
if selfs_tree = decl_tree.nth_tree(3)
|
701
|
+
self_trees = selfs_tree.non_trivia_trees
|
702
|
+
self_trees.shift
|
703
|
+
|
704
|
+
self_trees.each_slice(2) do |type, _comma|
|
705
|
+
case type
|
706
|
+
when Types::ClassInstance, Types::Interface
|
707
|
+
@self_types << RBS::AST::Declarations::Module::Self.new(
|
708
|
+
name: type.name,
|
709
|
+
args: type.args,
|
710
|
+
location: type.location
|
711
|
+
)
|
712
|
+
end
|
713
|
+
end
|
714
|
+
end
|
715
|
+
end
|
716
|
+
end
|
717
|
+
|
718
|
+
# `@rbs class Foo`
|
719
|
+
class ClassDecl < Base
|
720
|
+
attr_reader :name #: TypeName?
|
721
|
+
|
722
|
+
attr_reader :type_params #: Array[RBS::AST::TypeParam]
|
723
|
+
|
724
|
+
attr_reader :super_class #: RBS::AST::Declarations::Class::Super?
|
725
|
+
|
726
|
+
include Utils
|
727
|
+
|
728
|
+
# @rbs override
|
729
|
+
def initialize(tree, comments)
|
730
|
+
@tree = tree
|
731
|
+
@source = comments
|
732
|
+
|
733
|
+
decl_tree = tree.nth_tree!(1)
|
734
|
+
|
735
|
+
if type_name = translate_type_name(decl_tree.nth_tree!(1))
|
736
|
+
if type_name.class?
|
737
|
+
@name = type_name
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
@type_params = []
|
742
|
+
if type_params = decl_tree.nth_tree(2)
|
743
|
+
params = type_params.non_trivia_trees
|
744
|
+
params.shift
|
745
|
+
params.pop
|
746
|
+
params.each_slice(2) do |param, _comma|
|
747
|
+
raise unless param.is_a?(Tree)
|
748
|
+
if type_param = translate_type_param(param)
|
749
|
+
@type_params << type_param
|
750
|
+
end
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
if super_tree = decl_tree.nth_tree(3)
|
755
|
+
if type = super_tree.nth_type?(1)
|
756
|
+
@super_class = translate_super_class(type)
|
757
|
+
end
|
758
|
+
end
|
759
|
+
end
|
760
|
+
end
|
472
761
|
end
|
473
762
|
end
|
474
763
|
end
|