View difference between Paste ID: Bp5e4quJ and 5sNGkFRE
SHOW: | | - or go back to the newest paste.
1
require 'pp'
2
3
def parse_class_info(instruction_sequence)
4
  classes = []
5
6-
  find_classes = proc do |instructions, parent, index|
6+
  find_classes = proc do |instructions, parent, index, parent_class|
7
    next unless instructions.is_a? Array
8
    if instructions[0] == :defineclass
9
      _, class_name, class_info = instructions
10-
      info = { type: class_info[5][/\<([^:]+)/, 1], name: class_name }
10+
      class_name = :"#{parent_class}::#{class_name}" if parent_class
11
      info = { type: class_info[5][/\<([^:]+)/, 1].to_sym, name: class_name }
12-
      instruction, argument = parent[index - 3]
12+
13-
      info[:super_class] = argument if instruction == :getconstant
13+
      if index
14
        instruction, argument = parent[index - 3]
15-
      class_body.each {|instruction| find_classes.(instruction, class_body) }
15+
        info[:super_class] = argument if instruction == :getconstant
16
      end
17-
      instructions.each_with_index {|instruction, i| find_classes.(instruction, instructions, i) }
17+
18
      class_body.each {|instruction| find_classes.(instruction, class_body, nil, class_name) }
19
    else
20
      instructions.each_with_index {|instruction, i| find_classes.(instruction, instructions, i, parent_class) }
21
    end
22
  end
23
24
  find_classes.(instruction_sequence.to_a, nil)
25
26
  classes
27
end
28
29
file_contents = <<-RUBY
30
class TestModule < SuperClass
31
  foo
32-
  bar
32+
33
34
module TestMod
35
  class TestClass < Super
36
    class AnotherNestedClass
37
    end
38
  end
39
end
40-
pp parse_class_info RubyVM::InstructionSequence.compile(file_contents)
40+
41
class TestClass2
42
  foo_bar
43
end
44
RUBY
45
46
pp parse_class_info RubyVM::InstructionSequence.compile(file_contents)
47
48
#[{:type=>:class, :name=>:TestModule, :super_class=>:SuperClass},
49
# {:type=>:module, :name=>:TestMod},
50
# {:type=>:class, :name=>:"TestMod::TestClass"},
51
# {:type=>:class, :name=>:"TestMod::TestClass::AnotherNestedClass"},
52
# {:type=>:class, :name=>:TestClass2}]