47
47
if node . receiver . nil? && node . name == :include && definitions . current_node_type == "class" && !node . arguments . nil? && %i[ constant_read_node constant_path_node ] . include? ( node . arguments . arguments . first . type )
48
48
definitions . add_include_module ( node . arguments . arguments . first . to_source )
49
49
end
50
+ if node . receiver . nil? && node . name == :prepend && definitions . current_node_type == "class" && !node . arguments . nil? && %i[ constant_read_node constant_path_node ] . include? ( node . arguments . arguments . first . type )
51
+ definitions . add_prepend_module ( node . arguments . arguments . first . to_source )
52
+ end
50
53
end
51
54
52
55
add_callback :call_node , at : 'start' do |node |
@@ -135,6 +138,10 @@ def add_include_module(name)
135
138
@node . include_modules . push ( name )
136
139
end
137
140
141
+ def add_prepend_module ( name )
142
+ @node . prepend_modules . push ( name )
143
+ end
144
+
138
145
def add_method ( name )
139
146
method_definition = MethodDefinition . new ( parent : @node , name : name )
140
147
@node . methods . push ( method_definition )
@@ -194,13 +201,15 @@ def setup_ancestors
194
201
end
195
202
if superclass_class
196
203
ancestors << superclass_class . full_name
204
+ ancestors . concat ( superclass_class . prepend_modules ) if superclass_class . prepend_modules
197
205
ancestors . concat ( superclass_class . include_modules ) if superclass_class . include_modules
198
206
superclass = superclass_class . superclass
199
207
else
200
208
ancestors << superclass
201
209
superclass = nil
202
210
end
203
211
end
212
+ ancestors . concat ( klass . prepend_modules ) if klass . prepend_modules
204
213
ancestors . concat ( klass . include_modules ) if klass . include_modules
205
214
klass . ancestors = ancestors
206
215
@@ -277,7 +286,7 @@ def to_h
277
286
end
278
287
279
288
class ClassDefinition < BaseDefinition
280
- attr_reader :parent , :name , :superclass , :modules , :classes , :methods , :static_methods , :constants , :include_modules
289
+ attr_reader :parent , :name , :superclass , :modules , :classes , :methods , :static_methods , :constants , :include_modules , :prepend_modules
281
290
attr_accessor :singleton , :ancestors
282
291
283
292
def initialize ( parent :, name :, superclass :)
@@ -290,6 +299,7 @@ def initialize(parent:, name:, superclass:)
290
299
@static_methods = [ ]
291
300
@constants = [ ]
292
301
@include_modules = [ ]
302
+ @prepend_modules = [ ]
293
303
@ansestors = [ ]
294
304
end
295
305
@@ -303,6 +313,7 @@ def to_h
303
313
static_methods : @static_methods . map ( &:to_h ) ,
304
314
constants : @constants ,
305
315
include_modules : @include_modules ,
316
+ prepend_modules : @prepend_modules ,
306
317
singleton : @singleton &.to_h ,
307
318
ancestors : @ancestors
308
319
}
0 commit comments