Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'pp'
- def parse_class_info(instruction_sequence)
- classes = []
- find_classes = proc do |instructions, parent, index, parent_class|
- next unless instructions.is_a? Array
- if instructions[0] == :defineclass
- _, class_name, class_info = instructions
- class_name = :"#{parent_class}::#{class_name}" if parent_class
- info = { type: class_info[5][/\<([^:]+)/, 1].to_sym, name: class_name }
- class_body = class_info[13]
- if index
- instruction, argument = parent[index - 3]
- info[:super_class] = argument if instruction == :getconstant
- end
- classes << info
- class_body.each {|instruction| find_classes.(instruction, class_body, nil, class_name) }
- else
- instructions.each_with_index {|instruction, i| find_classes.(instruction, instructions, i, parent_class) }
- end
- end
- find_classes.(instruction_sequence.to_a, nil)
- classes
- end
- file_contents = <<-RUBY
- class TestModule < SuperClass
- foo
- end
- module TestMod
- class TestClass < Super
- class AnotherNestedClass
- end
- end
- end
- class TestClass2
- foo_bar
- end
- RUBY
- pp parse_class_info RubyVM::InstructionSequence.compile(file_contents)
- #[{:type=>:class, :name=>:TestModule, :super_class=>:SuperClass},
- # {:type=>:module, :name=>:TestMod},
- # {:type=>:class, :name=>:"TestMod::TestClass"},
- # {:type=>:class, :name=>:"TestMod::TestClass::AnotherNestedClass"},
- # {:type=>:class, :name=>:TestClass2}]
Advertisement
Add Comment
Please, Sign In to add comment