tapioca 0.4.17 → 0.4.22

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "tapioca"
5
+ require "tapioca/loader"
6
+ require "tapioca/constant_locator"
7
+ require "tapioca/generic_type_registry"
8
+ require "tapioca/sorbet_ext/generic_name_patch"
9
+ require "tapioca/config"
10
+ require "tapioca/config_builder"
11
+ require "tapioca/generator"
12
+ require "tapioca/cli"
13
+ require "tapioca/cli/main"
14
+ require "tapioca/gemfile"
15
+ require "tapioca/rbi/model"
16
+ require "tapioca/rbi/visitor"
17
+ require "tapioca/rbi/rewriters/nest_singleton_methods"
18
+ require "tapioca/rbi/rewriters/nest_non_public_methods"
19
+ require "tapioca/rbi/rewriters/group_nodes"
20
+ require "tapioca/rbi/rewriters/sort_nodes"
21
+ require "tapioca/rbi/printer"
22
+ require "tapioca/compilers/sorbet"
23
+ require "tapioca/compilers/requires_compiler"
24
+ require "tapioca/compilers/symbol_table_compiler"
25
+ require "tapioca/compilers/symbol_table/symbol_generator"
26
+ require "tapioca/compilers/symbol_table/symbol_loader"
27
+ require "tapioca/compilers/todos_compiler"
28
+ require "tapioca/compilers/dsl_compiler"
@@ -0,0 +1,405 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Tapioca
5
+ module RBI
6
+ class Node
7
+ extend T::Sig
8
+ extend T::Helpers
9
+
10
+ abstract!
11
+
12
+ sig { returns(T.nilable(Tree)) }
13
+ attr_accessor :parent_tree
14
+
15
+ sig { void }
16
+ def initialize
17
+ @parent_tree = nil
18
+ end
19
+
20
+ sig { void }
21
+ def detach
22
+ tree = parent_tree
23
+ return unless tree
24
+ tree.nodes.delete(self)
25
+ self.parent_tree = nil
26
+ end
27
+ end
28
+
29
+ class Tree < Node
30
+ extend T::Sig
31
+
32
+ sig { returns(T::Array[Node]) }
33
+ attr_reader :nodes
34
+
35
+ sig { void }
36
+ def initialize
37
+ super()
38
+ @nodes = T.let([], T::Array[Node])
39
+ end
40
+
41
+ sig { params(node: Node).void }
42
+ def <<(node)
43
+ node.parent_tree = self
44
+ @nodes << node
45
+ end
46
+
47
+ sig { returns(T::Boolean) }
48
+ def empty?
49
+ nodes.empty?
50
+ end
51
+ end
52
+
53
+ # Scopes
54
+
55
+ class Scope < Tree
56
+ extend T::Helpers
57
+
58
+ abstract!
59
+ end
60
+
61
+ class Module < Scope
62
+ extend T::Sig
63
+
64
+ sig { returns(String) }
65
+ attr_accessor :name
66
+
67
+ sig { params(name: String).void }
68
+ def initialize(name)
69
+ super()
70
+ @name = name
71
+ end
72
+ end
73
+
74
+ class Class < Scope
75
+ extend T::Sig
76
+
77
+ sig { returns(String) }
78
+ attr_accessor :name
79
+
80
+ sig { returns(T.nilable(String)) }
81
+ attr_accessor :superclass_name
82
+
83
+ sig { params(name: String, superclass_name: T.nilable(String)).void }
84
+ def initialize(name, superclass_name: nil)
85
+ super()
86
+ @name = name
87
+ @superclass_name = superclass_name
88
+ end
89
+ end
90
+
91
+ class SingletonClass < Scope
92
+ extend T::Sig
93
+
94
+ sig { void }
95
+ def initialize
96
+ super()
97
+ end
98
+ end
99
+
100
+ # Consts
101
+
102
+ class Const < Node
103
+ extend T::Sig
104
+
105
+ sig { returns(String) }
106
+ attr_reader :name, :value
107
+
108
+ sig { params(name: String, value: String).void }
109
+ def initialize(name, value)
110
+ super()
111
+ @name = name
112
+ @value = value
113
+ end
114
+ end
115
+
116
+ # Methods and args
117
+
118
+ class Method < Node
119
+ extend T::Sig
120
+
121
+ sig { returns(String) }
122
+ attr_accessor :name
123
+
124
+ sig { returns(T::Array[Param]) }
125
+ attr_reader :params
126
+
127
+ sig { returns(T::Boolean) }
128
+ attr_accessor :is_singleton
129
+
130
+ sig { returns(Visibility) }
131
+ attr_accessor :visibility
132
+
133
+ sig { returns(T::Array[Sig]) }
134
+ attr_accessor :sigs
135
+
136
+ sig do
137
+ params(
138
+ name: String,
139
+ params: T::Array[Param],
140
+ is_singleton: T::Boolean,
141
+ visibility: Visibility,
142
+ sigs: T::Array[Sig]
143
+ ).void
144
+ end
145
+ def initialize(name, params: [], is_singleton: false, visibility: Visibility::Public, sigs: [])
146
+ super()
147
+ @name = name
148
+ @params = params
149
+ @is_singleton = is_singleton
150
+ @visibility = visibility
151
+ @sigs = sigs
152
+ end
153
+
154
+ sig { params(param: Param).void }
155
+ def <<(param)
156
+ @params << param
157
+ end
158
+ end
159
+
160
+ class Param < Node
161
+ extend T::Sig
162
+
163
+ sig { returns(String) }
164
+ attr_reader :name
165
+
166
+ sig { params(name: String).void }
167
+ def initialize(name)
168
+ super()
169
+ @name = name
170
+ end
171
+ end
172
+
173
+ class OptParam < Param
174
+ extend T::Sig
175
+
176
+ sig { returns(String) }
177
+ attr_reader :value
178
+
179
+ sig { params(name: String, value: String).void }
180
+ def initialize(name, value)
181
+ super(name)
182
+ @value = value
183
+ end
184
+ end
185
+
186
+ class RestParam < Param; end
187
+ class KwParam < Param; end
188
+ class KwOptParam < OptParam; end
189
+ class KwRestParam < Param; end
190
+ class BlockParam < Param; end
191
+
192
+ # Mixins
193
+
194
+ class Mixin < Node
195
+ extend T::Sig
196
+ extend T::Helpers
197
+
198
+ abstract!
199
+
200
+ sig { returns(String) }
201
+ attr_reader :name
202
+
203
+ sig { params(name: String).void }
204
+ def initialize(name)
205
+ super()
206
+ @name = name
207
+ end
208
+ end
209
+
210
+ class Include < Mixin; end
211
+ class Extend < Mixin; end
212
+
213
+ # Visibility
214
+
215
+ class Visibility < Node
216
+ extend T::Sig
217
+ extend T::Helpers
218
+
219
+ abstract!
220
+
221
+ sig { returns(Symbol) }
222
+ attr_reader :visibility
223
+
224
+ sig { params(visibility: Symbol).void }
225
+ def initialize(visibility)
226
+ super()
227
+ @visibility = visibility
228
+ end
229
+
230
+ sig { returns(T::Boolean) }
231
+ def public?
232
+ visibility == :public
233
+ end
234
+
235
+ Public = T.let(Visibility.new(:public), Visibility)
236
+ Protected = T.let(Visibility.new(:protected), Visibility)
237
+ Private = T.let(Visibility.new(:private), Visibility)
238
+ end
239
+
240
+ # Sorbet's sigs
241
+
242
+ class Sig < Node
243
+ extend T::Sig
244
+
245
+ sig { returns(T::Array[SigParam]) }
246
+ attr_reader :params
247
+
248
+ sig { returns(T.nilable(String)) }
249
+ attr_accessor :return_type
250
+
251
+ sig { returns(T::Boolean) }
252
+ attr_accessor :is_abstract, :is_override, :is_overridable
253
+
254
+ sig { returns(T::Array[String]) }
255
+ attr_reader :type_params
256
+
257
+ sig do
258
+ params(
259
+ params: T::Array[SigParam],
260
+ return_type: T.nilable(String),
261
+ is_abstract: T::Boolean,
262
+ is_override: T::Boolean,
263
+ is_overridable: T::Boolean,
264
+ type_params: T::Array[String]
265
+ ).void
266
+ end
267
+ def initialize(
268
+ params: [],
269
+ return_type: nil,
270
+ is_abstract: false,
271
+ is_override: false,
272
+ is_overridable: false,
273
+ type_params: []
274
+ )
275
+ super()
276
+ @params = params
277
+ @return_type = return_type
278
+ @is_abstract = is_abstract
279
+ @is_override = is_override
280
+ @is_overridable = is_overridable
281
+ @type_params = type_params
282
+ end
283
+
284
+ sig { params(param: SigParam).void }
285
+ def <<(param)
286
+ @params << param
287
+ end
288
+ end
289
+
290
+ class SigParam < Node
291
+ extend T::Sig
292
+
293
+ sig { returns(String) }
294
+ attr_reader :name, :type
295
+
296
+ sig { params(name: String, type: String).void }
297
+ def initialize(name, type)
298
+ super()
299
+ @name = name
300
+ @type = type
301
+ end
302
+ end
303
+
304
+ # Sorbet's T::Struct
305
+
306
+ class TStruct < Class
307
+ extend T::Sig
308
+
309
+ sig { params(name: String).void }
310
+ def initialize(name)
311
+ super(name, superclass_name: "::T::Struct")
312
+ end
313
+ end
314
+
315
+ class TStructField < Node
316
+ extend T::Sig
317
+ extend T::Helpers
318
+
319
+ abstract!
320
+
321
+ sig { returns(String) }
322
+ attr_accessor :name, :type
323
+
324
+ sig { returns(T.nilable(String)) }
325
+ attr_accessor :default
326
+
327
+ sig do
328
+ params(
329
+ name: String,
330
+ type: String,
331
+ default: T.nilable(String)
332
+ ).void
333
+ end
334
+ def initialize(name, type, default: nil)
335
+ super()
336
+ @name = name
337
+ @type = type
338
+ @default = default
339
+ end
340
+ end
341
+
342
+ class TStructProp < TStructField; end
343
+ class TStructConst < TStructField; end
344
+
345
+ # Sorbet's T::Enum
346
+
347
+ class TEnum < Class
348
+ extend T::Sig
349
+
350
+ sig { params(name: String).void }
351
+ def initialize(name)
352
+ super(name, superclass_name: "::T::Enum")
353
+ end
354
+ end
355
+
356
+ class TEnumBlock < Node
357
+ extend T::Sig
358
+
359
+ sig { returns(T::Array[String]) }
360
+ attr_reader :names
361
+
362
+ sig { params(names: T::Array[String]).void }
363
+ def initialize(names = [])
364
+ super()
365
+ @names = names
366
+ end
367
+
368
+ sig { returns(T::Boolean) }
369
+ def empty?
370
+ names.empty?
371
+ end
372
+ end
373
+
374
+ # Sorbet's misc.
375
+
376
+ class Helper < Node
377
+ extend T::Helpers
378
+
379
+ sig { returns(String) }
380
+ attr_reader :name
381
+
382
+ sig { params(name: String).void }
383
+ def initialize(name)
384
+ super()
385
+ @name = name
386
+ end
387
+ end
388
+
389
+ class TypeMember < Node
390
+ extend T::Sig
391
+
392
+ sig { returns(String) }
393
+ attr_reader :name, :value
394
+
395
+ sig { params(name: String, value: String).void }
396
+ def initialize(name, value)
397
+ super()
398
+ @name = name
399
+ @value = value
400
+ end
401
+ end
402
+
403
+ class MixesInClassMethods < Mixin; end
404
+ end
405
+ end
@@ -0,0 +1,410 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Tapioca
5
+ module RBI
6
+ class Printer < Visitor
7
+ extend T::Sig
8
+
9
+ sig { returns(T::Boolean) }
10
+ attr_accessor :in_visibility_group
11
+
12
+ sig { returns(T.nilable(Node)) }
13
+ attr_reader :previous_node
14
+
15
+ sig { params(out: T.any(IO, StringIO), indent: Integer).void }
16
+ def initialize(out: $stdout, indent: 0)
17
+ super()
18
+ @out = out
19
+ @current_indent = indent
20
+ @in_visibility_group = T.let(false, T::Boolean)
21
+ @previous_node = T.let(nil, T.nilable(Node))
22
+ end
23
+
24
+ # Printing
25
+
26
+ sig { void }
27
+ def indent
28
+ @current_indent += 2
29
+ end
30
+
31
+ sig { void }
32
+ def dedent
33
+ @current_indent -= 2
34
+ end
35
+
36
+ # Print a string without indentation nor `\n` at the end.
37
+ sig { params(string: String).void }
38
+ def print(string)
39
+ @out.print(string)
40
+ end
41
+
42
+ # Print a string without indentation but with a `\n` at the end.
43
+ sig { params(string: T.nilable(String)).void }
44
+ def printn(string = nil)
45
+ print(string) if string
46
+ print("\n")
47
+ end
48
+
49
+ # Print a string with indentation but without a `\n` at the end.
50
+ sig { params(string: T.nilable(String)).void }
51
+ def printt(string = nil)
52
+ print(" " * @current_indent)
53
+ print(string) if string
54
+ end
55
+
56
+ # Print a string with indentation and `\n` at the end.
57
+ sig { params(string: String).void }
58
+ def printl(string)
59
+ printt
60
+ printn(string)
61
+ end
62
+
63
+ sig { override.params(node: T.nilable(Node)).void }
64
+ def visit(node)
65
+ return unless node
66
+ node.accept_printer(self)
67
+ end
68
+
69
+ sig { override.params(nodes: T::Array[Node]).void }
70
+ def visit_all(nodes)
71
+ previous_node = @previous_node
72
+ @previous_node = nil
73
+ nodes.each do |node|
74
+ visit(node)
75
+ @previous_node = node
76
+ end
77
+ @previous_node = previous_node
78
+ end
79
+ end
80
+
81
+ class Node
82
+ extend T::Sig
83
+
84
+ sig { abstract.params(v: Printer).void }
85
+ def accept_printer(v); end
86
+
87
+ sig { params(out: T.any(IO, StringIO), indent: Integer).void }
88
+ def print(out: $stdout, indent: 0)
89
+ p = Printer.new(out: out, indent: indent)
90
+ p.visit(self)
91
+ end
92
+
93
+ sig { params(indent: Integer).returns(String) }
94
+ def string(indent: 0)
95
+ out = StringIO.new
96
+ print(out: out, indent: indent)
97
+ out.string
98
+ end
99
+
100
+ sig { returns(T::Boolean) }
101
+ def oneline?
102
+ true
103
+ end
104
+ end
105
+
106
+ class Tree
107
+ extend T::Sig
108
+
109
+ sig { override.params(v: Printer).void }
110
+ def accept_printer(v)
111
+ v.visit_all(nodes)
112
+ end
113
+
114
+ sig { override.returns(T::Boolean) }
115
+ def oneline?
116
+ empty?
117
+ end
118
+ end
119
+
120
+ class Scope
121
+ extend T::Sig
122
+
123
+ sig { override.params(v: Printer).void }
124
+ def accept_printer(v)
125
+ previous_node = v.previous_node
126
+ v.printn if previous_node && (!previous_node.oneline? || !oneline?)
127
+
128
+ case self
129
+ when Module
130
+ v.printt("module #{name}")
131
+ when Class
132
+ v.printt("class #{name}")
133
+ superclass = superclass_name
134
+ v.print(" < #{superclass}") if superclass
135
+ when SingletonClass
136
+ v.printt("class << self")
137
+ end
138
+ if empty?
139
+ v.printn("; end")
140
+ else
141
+ v.printn
142
+ v.indent
143
+ v.visit_all(nodes)
144
+ v.dedent
145
+ v.printl("end")
146
+ end
147
+ end
148
+ end
149
+
150
+ class Const
151
+ extend T::Sig
152
+
153
+ sig { override.params(v: Printer).void }
154
+ def accept_printer(v)
155
+ previous_node = v.previous_node
156
+ v.printn if previous_node && (!previous_node.oneline? || !oneline?)
157
+
158
+ v.printl("#{name} = #{value}")
159
+ end
160
+ end
161
+
162
+ class Method
163
+ extend T::Sig
164
+
165
+ sig { override.params(v: Printer).void }
166
+ def accept_printer(v)
167
+ previous_node = v.previous_node
168
+ v.printn if previous_node && (!previous_node.oneline? || !oneline?)
169
+
170
+ v.visit_all(sigs)
171
+ v.printt
172
+ unless v.in_visibility_group || visibility == Visibility::Public
173
+ v.print(visibility.visibility.to_s)
174
+ v.print(" ")
175
+ end
176
+ v.print("def ")
177
+ v.print("self.") if is_singleton
178
+ v.print(name)
179
+ unless params.empty?
180
+ v.print("(")
181
+ params.each_with_index do |param, index|
182
+ v.print(", ") if index > 0
183
+ v.visit(param)
184
+ end
185
+ v.print(")")
186
+ end
187
+ v.print("; end")
188
+ v.printn
189
+ end
190
+
191
+ sig { override.returns(T::Boolean) }
192
+ def oneline?
193
+ sigs.empty?
194
+ end
195
+ end
196
+
197
+ class Param
198
+ extend T::Sig
199
+
200
+ sig { override.params(v: Printer).void }
201
+ def accept_printer(v)
202
+ v.print(name.to_s)
203
+ end
204
+ end
205
+
206
+ class OptParam
207
+ extend T::Sig
208
+
209
+ sig { override.params(v: Printer).void }
210
+ def accept_printer(v)
211
+ v.print("#{name} = #{value}")
212
+ end
213
+ end
214
+
215
+ class RestParam
216
+ extend T::Sig
217
+
218
+ sig { override.params(v: Printer).void }
219
+ def accept_printer(v)
220
+ v.print("*#{name}")
221
+ end
222
+ end
223
+
224
+ class KwParam
225
+ extend T::Sig
226
+
227
+ sig { override.params(v: Printer).void }
228
+ def accept_printer(v)
229
+ v.print("#{name}:")
230
+ end
231
+ end
232
+
233
+ class KwOptParam
234
+ extend T::Sig
235
+
236
+ sig { override.params(v: Printer).void }
237
+ def accept_printer(v)
238
+ v.print("#{name}: #{value}")
239
+ end
240
+ end
241
+
242
+ class KwRestParam
243
+ extend T::Sig
244
+
245
+ sig { override.params(v: Printer).void }
246
+ def accept_printer(v)
247
+ v.print("**#{name}")
248
+ end
249
+ end
250
+
251
+ class BlockParam
252
+ extend T::Sig
253
+
254
+ sig { override.params(v: Printer).void }
255
+ def accept_printer(v)
256
+ v.print("&#{name}")
257
+ end
258
+ end
259
+
260
+ class Mixin
261
+ extend T::Sig
262
+
263
+ sig { override.params(v: Printer).void }
264
+ def accept_printer(v)
265
+ case self
266
+ when Include
267
+ v.printt("include")
268
+ when Extend
269
+ v.printt("extend")
270
+ when MixesInClassMethods
271
+ v.printt("mixes_in_class_methods")
272
+ end
273
+ v.printn(" #{name}")
274
+ end
275
+ end
276
+
277
+ class Visibility
278
+ extend T::Sig
279
+
280
+ sig { override.params(v: Printer).void }
281
+ def accept_printer(v)
282
+ v.printl(visibility.to_s)
283
+ end
284
+ end
285
+
286
+ class Sig
287
+ extend T::Sig
288
+
289
+ sig { override.params(v: Printer).void }
290
+ def accept_printer(v)
291
+ v.printt("sig { ")
292
+ v.print("abstract.") if is_abstract
293
+ v.print("override.") if is_override
294
+ v.print("overridable.") if is_overridable
295
+ unless type_params.empty?
296
+ v.print("type_parameters(")
297
+ type_params.each_with_index do |param, index|
298
+ v.print(":#{param}")
299
+ v.print(", ") if index < type_params.length - 1
300
+ end
301
+ v.print(").")
302
+ end
303
+ unless params.empty?
304
+ v.print("params(")
305
+ params.each_with_index do |param, index|
306
+ v.visit(param)
307
+ v.print(", ") if index < params.length - 1
308
+ end
309
+ v.print(").")
310
+ end
311
+ if return_type && return_type != "void"
312
+ v.print("returns(#{return_type})")
313
+ else
314
+ v.print("void")
315
+ end
316
+ v.printn(" }")
317
+ end
318
+ end
319
+
320
+ class SigParam
321
+ extend T::Sig
322
+
323
+ sig { override.params(v: Printer).void }
324
+ def accept_printer(v)
325
+ v.print("#{name}: #{type}")
326
+ end
327
+ end
328
+
329
+ class TStructField
330
+ extend T::Sig
331
+
332
+ sig { override.params(v: Printer).void }
333
+ def accept_printer(v)
334
+ case self
335
+ when TStructProp
336
+ v.printt("prop")
337
+ when TStructConst
338
+ v.printt("const")
339
+ end
340
+ v.print(" :#{name}, #{type}")
341
+ default = self.default
342
+ v.print(", default: #{default}") if default
343
+ v.printn
344
+ end
345
+ end
346
+
347
+ class TEnumBlock
348
+ extend T::Sig
349
+
350
+ sig { override.params(v: Printer).void }
351
+ def accept_printer(v)
352
+ v.printl("enums do")
353
+ v.indent
354
+ names.each do |name|
355
+ v.printl("#{name} = new")
356
+ end
357
+ v.dedent
358
+ v.printl("end")
359
+ end
360
+ end
361
+
362
+ class TypeMember
363
+ extend T::Sig
364
+
365
+ sig { override.params(v: Printer).void }
366
+ def accept_printer(v)
367
+ previous_node = v.previous_node
368
+ v.printn if previous_node && (!previous_node.oneline? || !oneline?)
369
+
370
+ v.printl("#{name} = #{value}")
371
+ end
372
+ end
373
+
374
+ class Helper
375
+ extend T::Sig
376
+
377
+ sig { override.params(v: Printer).void }
378
+ def accept_printer(v)
379
+ v.printl("#{name}!")
380
+ end
381
+ end
382
+
383
+ class Group
384
+ extend T::Sig
385
+
386
+ sig { override.params(v: Printer).void }
387
+ def accept_printer(v)
388
+ v.printn unless v.previous_node.nil?
389
+ v.visit_all(nodes)
390
+ end
391
+ end
392
+
393
+ class VisibilityGroup
394
+ extend T::Sig
395
+
396
+ sig { override.params(v: Printer).void }
397
+ def accept_printer(v)
398
+ v.in_visibility_group = true
399
+ v.printn unless v.previous_node.nil?
400
+ case visibility
401
+ when Visibility::Protected, Visibility::Private
402
+ v.visit(visibility)
403
+ v.printn
404
+ end
405
+ v.visit_all(nodes)
406
+ v.in_visibility_group = false
407
+ end
408
+ end
409
+ end
410
+ end