Method: RawParseTree#parse_tree
- Defined in:
- lib/parse_tree.rb
#parse_tree(*klasses) ⇒ Object
Main driver for ParseTree. Returns an array of arrays containing the parse tree for klasses
.
Structure:
[[:class, classname, superclassname, [:defn :method1, ...], ...], ...]
NOTE: v1.0 - v1.1 had the signature (klass, meth=nil). This wasn’t used much at all and since parse_tree_for_method already existed, it was deemed more useful to expand this method to do multiple classes.
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |
# File 'lib/parse_tree.rb', line 99 def parse_tree(*klasses) result = [] klasses.each do |klass| klassname = klass.name rescue '' # HACK klass.name should never be nil # Tempfile's DelegateClass(File) seems to # cause this klassname = "UnnamedClass_#{klass.object_id}" if klassname.empty? klassname = klassname.to_sym code = if Class === klass then sc = klass.superclass sc_name = ((sc.nil? or sc.name.empty?) ? "nil" : sc.name).intern [:class, klassname, [:const, sc_name]] else [:module, klassname] end method_names = [] method_names += klass.instance_methods false method_names += klass.private_instance_methods false # protected methods are included in instance_methods, go figure! method_names.sort.each do |m| r = parse_tree_for_method(klass, m.to_sym) code << r end mods = klass.modules mods -= mods.map { |mod| mod.modules }.flatten mods.each do |mod| # TODO: add a test for this damnit code << process("include #{mod}") end klass.singleton_methods(false).sort.each do |m| code << parse_tree_for_method(klass, m.to_sym, true) end result << code end return result end |