tapioca 0.4.26 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +14 -14
  3. data/README.md +2 -2
  4. data/Rakefile +5 -7
  5. data/exe/tapioca +2 -2
  6. data/lib/tapioca/cli.rb +256 -2
  7. data/lib/tapioca/compilers/dsl/aasm.rb +122 -0
  8. data/lib/tapioca/compilers/dsl/action_controller_helpers.rb +52 -12
  9. data/lib/tapioca/compilers/dsl/action_mailer.rb +6 -9
  10. data/lib/tapioca/compilers/dsl/active_job.rb +8 -12
  11. data/lib/tapioca/compilers/dsl/active_model_attributes.rb +131 -0
  12. data/lib/tapioca/compilers/dsl/active_record_associations.rb +33 -54
  13. data/lib/tapioca/compilers/dsl/active_record_columns.rb +10 -105
  14. data/lib/tapioca/compilers/dsl/active_record_enum.rb +8 -10
  15. data/lib/tapioca/compilers/dsl/active_record_scope.rb +7 -10
  16. data/lib/tapioca/compilers/dsl/active_record_typed_store.rb +5 -8
  17. data/lib/tapioca/compilers/dsl/active_resource.rb +9 -37
  18. data/lib/tapioca/compilers/dsl/active_storage.rb +98 -0
  19. data/lib/tapioca/compilers/dsl/active_support_concern.rb +108 -0
  20. data/lib/tapioca/compilers/dsl/active_support_current_attributes.rb +13 -8
  21. data/lib/tapioca/compilers/dsl/base.rb +96 -82
  22. data/lib/tapioca/compilers/dsl/config.rb +111 -0
  23. data/lib/tapioca/compilers/dsl/frozen_record.rb +5 -7
  24. data/lib/tapioca/compilers/dsl/identity_cache.rb +66 -29
  25. data/lib/tapioca/compilers/dsl/protobuf.rb +19 -69
  26. data/lib/tapioca/compilers/dsl/sidekiq_worker.rb +25 -12
  27. data/lib/tapioca/compilers/dsl/smart_properties.rb +19 -31
  28. data/lib/tapioca/compilers/dsl/state_machines.rb +56 -78
  29. data/lib/tapioca/compilers/dsl/url_helpers.rb +7 -10
  30. data/lib/tapioca/compilers/dsl_compiler.rb +22 -38
  31. data/lib/tapioca/compilers/requires_compiler.rb +2 -2
  32. data/lib/tapioca/compilers/sorbet.rb +26 -5
  33. data/lib/tapioca/compilers/symbol_table/symbol_generator.rb +138 -153
  34. data/lib/tapioca/compilers/symbol_table/symbol_loader.rb +4 -4
  35. data/lib/tapioca/compilers/todos_compiler.rb +1 -1
  36. data/lib/tapioca/config.rb +2 -0
  37. data/lib/tapioca/config_builder.rb +4 -2
  38. data/lib/tapioca/constant_locator.rb +6 -8
  39. data/lib/tapioca/gemfile.rb +2 -4
  40. data/lib/tapioca/generator.rb +124 -40
  41. data/lib/tapioca/generic_type_registry.rb +25 -98
  42. data/lib/tapioca/helpers/active_record_column_type_helper.rb +98 -0
  43. data/lib/tapioca/internal.rb +1 -9
  44. data/lib/tapioca/loader.rb +11 -31
  45. data/lib/tapioca/rbi_ext/model.rb +122 -0
  46. data/lib/tapioca/reflection.rb +131 -0
  47. data/lib/tapioca/sorbet_ext/fixed_hash_patch.rb +1 -1
  48. data/lib/tapioca/sorbet_ext/generic_name_patch.rb +72 -4
  49. data/lib/tapioca/sorbet_ext/name_patch.rb +1 -1
  50. data/lib/tapioca/version.rb +1 -1
  51. data/lib/tapioca.rb +2 -0
  52. metadata +34 -22
  53. data/lib/tapioca/cli/main.rb +0 -146
  54. data/lib/tapioca/core_ext/class.rb +0 -28
  55. data/lib/tapioca/core_ext/string.rb +0 -18
  56. data/lib/tapioca/rbi/model.rb +0 -405
  57. data/lib/tapioca/rbi/printer.rb +0 -410
  58. data/lib/tapioca/rbi/rewriters/group_nodes.rb +0 -106
  59. data/lib/tapioca/rbi/rewriters/nest_non_public_methods.rb +0 -65
  60. data/lib/tapioca/rbi/rewriters/nest_singleton_methods.rb +0 -42
  61. data/lib/tapioca/rbi/rewriters/sort_nodes.rb +0 -86
  62. data/lib/tapioca/rbi/visitor.rb +0 -21
@@ -1,18 +0,0 @@
1
- # typed: strict
2
- # frozen_string_literal: true
3
-
4
- class String
5
- extend T::Sig
6
-
7
- sig { returns(String) }
8
- def underscore
9
- return self unless /[A-Z-]|::/.match?(self)
10
-
11
- word = to_s.gsub("::", "/")
12
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
13
- word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
14
- word.tr!("-", "_")
15
- word.downcase!
16
- word
17
- end
18
- end
@@ -1,405 +0,0 @@
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
@@ -1,410 +0,0 @@
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