class MetricFu::LineNumbers
Public Class Methods
new(contents)
click to toggle source
# File lib/base/line_numbers.rb, line 5 def initialize(contents) rp = RubyParser.new @locations = {} file_sexp = rp.parse(contents) case file_sexp[0] when :class process_class(file_sexp) when :module process_module(file_sexp) when :block file_sexp.each_of_type(:class) { |sexp| process_class(sexp) } else puts "Unexpected sexp_type #{file_sexp[0].inspect}" end rescue Exception => e #catch errors for files ruby_parser fails on puts "RUBY PARSE FAILURE: #{e.class}\t#{e.message}\t#{file_sexp.inspect}\t#{contents.inspect}\t#{e.backtrace}" @locations end
Public Instance Methods
in_method?(line_number)
click to toggle source
# File lib/base/line_numbers.rb, line 25 def in_method? line_number !!@locations.detect do |method_name, line_number_range| line_number_range.include?(line_number) end end
method_at_line(line_number)
click to toggle source
# File lib/base/line_numbers.rb, line 31 def method_at_line line_number found_method_and_range = @locations.detect do |method_name, line_number_range| line_number_range.include?(line_number) end if found_method_and_range found_method_and_range.first else nil end end
start_line_for_method(method)
click to toggle source
# File lib/base/line_numbers.rb, line 42 def start_line_for_method(method) return nil unless @locations.has_key?(method) @locations[method].first end
Private Instance Methods
hide_methods_from_next_round(sexp)
click to toggle source
# File lib/base/line_numbers.rb, line 73 def hide_methods_from_next_round(sexp) sexp.find_and_replace_all(:defn, :ignore_me) sexp.find_and_replace_all(:defs, :ignore_me) end
process_class(sexp, module_name=nil)
click to toggle source
# File lib/base/line_numbers.rb, line 58 def process_class(sexp, module_name=nil) class_name = sexp[1] process_class_self_blocks(sexp, class_name) module_name_string = module_name ? "#{module_name}::" : nil sexp.each_of_type(:defn) { |s| @locations["#{module_name_string}#{class_name}##{s[1]}"] = (s.line)..(s.last.line) } sexp.each_of_type(:defs) { |s| @locations["#{module_name_string}#{class_name}::#{s[2]}"] = (s.line)..(s.last.line) } end
process_class_self_blocks(sexp, class_name)
click to toggle source
# File lib/base/line_numbers.rb, line 66 def process_class_self_blocks(sexp, class_name) sexp.each_of_type(:sclass) do |sexp_in_class_self_block| sexp_in_class_self_block.each_of_type(:defn) { |s| @locations["#{class_name}::#{s[1]}"] = (s.line)..(s.last.line) } hide_methods_from_next_round(sexp_in_class_self_block) end end
process_module(sexp)
click to toggle source
# File lib/base/line_numbers.rb, line 49 def process_module(sexp) module_name = sexp[1] sexp.each_of_type(:class) do |sexp| process_class(sexp, module_name) hide_methods_from_next_round(sexp) end process_class(sexp) end