Sha256: a240060d2e33779b6af7104b9447a75b0d2b35c85cf87a2aa4f1fcce1dafb4c7
Contents?: true
Size: 1.86 KB
Versions: 1
Compression:
Stored size: 1.86 KB
Contents
require 'ruby_parser' class LineNumbers def initialize(contents) rp = RubyParser.new file_sexp = rp.parse(contents) @locations = {} 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 end end def in_method? line_number !!@locations.detect do |method_name, line_number_range| line_number_range.include?(line_number) end end 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 return nil unless found_method_and_range found_method_and_range.first end private 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 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 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 def hide_methods_from_next_round(sexp) sexp.find_and_replace_all(:defn, :ignore_me) sexp.find_and_replace_all(:defs, :ignore_me) end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
metric_fu-2.0.0 | lib/base/line_numbers.rb |