Class: Churn::LocationMapping

Inherits:
SexpProcessor
  • Object
show all
Defined in:
lib/churn/location_mapping.rb

Overview

Given a ruby file, map the klass and methods to a range of line numbers The klass and method to line numbers mappings, are stored in this is based off github.com/seattlerb/ruby_parser which seems to have some known line number bugs perhaps look at and move more to the style of line numbers from metric_fu github.com/metricfu/metric_fu/blob/master/lib/data_structures/line_numbers.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLocationMapping

Returns a new instance of LocationMapping.



13
14
15
16
17
18
19
20
# File 'lib/churn/location_mapping.rb', line 13

def initialize()
  super
  @klasses_collection  = {}
  @methods_collection  = {}
  @parser              = RubyParser.new
  self.auto_shift_type = true
  self.require_empty = false
end

Instance Attribute Details

#klasses_collectionObject (readonly)

Returns the value of attribute klasses_collection.



11
12
13
# File 'lib/churn/location_mapping.rb', line 11

def klasses_collection
  @klasses_collection
end

#methods_collectionObject (readonly)

Returns the value of attribute methods_collection.



11
12
13
# File 'lib/churn/location_mapping.rb', line 11

def methods_collection
  @methods_collection
end

Instance Method Details

#analyze_list(exp) ⇒ Object



46
47
48
49
# File 'lib/churn/location_mapping.rb', line 46

def analyze_list exp
  process exp.shift until exp.empty?
  exp
end

#deep_last_line(exp) ⇒ Object



40
41
42
43
44
# File 'lib/churn/location_mapping.rb', line 40

def deep_last_line(exp)
  lines = []
  exp.deep_each{|x| lines << x.line }
  lines.max + 1
end

#get_info(file) ⇒ Object



22
23
24
25
# File 'lib/churn/location_mapping.rb', line 22

def get_info(file)
  ast = @parser.process(File.read(file), file)
  process ast
end

#process_class(exp) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/churn/location_mapping.rb', line 27

def process_class(exp)
  name           = exp.shift
  start_line     = exp.line
  last_line      = deep_last_line(exp)
  name           = name if name.is_a?(Symbol)
  name           = name.values.value if name.is_a?(Sexp) #deals with cases like class Test::Unit::TestCase
  @current_class = name
  @klasses_collection[name.to_s] = [] unless @klasses_collection.include?(name)
  @klasses_collection[name.to_s] << (start_line..last_line)
  analyze_list exp
  s()
end

#process_defn(exp) ⇒ Object



51
52
53
54
55
56
57
58
59
# File 'lib/churn/location_mapping.rb', line 51

def process_defn(exp)
  name        = exp.shift
  start_line  = exp.line
  last_line   = deep_last_line(exp)
  full_name   = "#{@current_class}##{name}"
  @methods_collection[full_name] = [] unless @methods_collection.include?(full_name)
  @methods_collection[full_name] << (start_line..last_line)
  return s(:defn, name, process(exp.shift), process(exp.shift))
end