class Fasterer::Analyzer

Attributes

file_path[R]
path[R]

Public Class Methods

new(file_path) click to toggle source
# File lib/fasterer/analyzer.rb, line 15
def initialize(file_path)
  @file_path = file_path.to_s
  @file_content = File.read(file_path)
end

Public Instance Methods

errors() click to toggle source
# File lib/fasterer/analyzer.rb, line 25
def errors
  @errors ||= Fasterer::OffenseCollector.new
end
scan() click to toggle source
# File lib/fasterer/analyzer.rb, line 20
def scan
  sexp_tree = Fasterer::Parser.parse(@file_content)
  traverse_sexp_tree(sexp_tree)
end

Private Instance Methods

scan_by_token(token, element) click to toggle source
# File lib/fasterer/analyzer.rb, line 49
def scan_by_token(token, element)
  case token
  when :defn
    scan_method_definitions(element)
  when :call, :iter
    scan_method_calls(element)
  when :for
    scan_for_loop(element)
  when :resbody
    scan_rescue(element)
  end
end
scan_for_loop(element) click to toggle source
# File lib/fasterer/analyzer.rb, line 78
def scan_for_loop(element)
  errors.push(Fasterer::Offense.new(:for_loop_vs_each, element.line))
end
scan_method_calls(element) click to toggle source
# File lib/fasterer/analyzer.rb, line 70
def scan_method_calls(element)
  method_call_scanner = MethodCallScanner.new(element)

  if method_call_scanner.offense_detected?
    errors.push(method_call_scanner.offense)
  end
end
scan_method_definitions(element) click to toggle source
# File lib/fasterer/analyzer.rb, line 62
def scan_method_definitions(element)
  method_definition_scanner = MethodDefinitionScanner.new(element)

  if method_definition_scanner.offense_detected?
    errors.push(method_definition_scanner.offense)
  end
end
scan_rescue(element) click to toggle source
# File lib/fasterer/analyzer.rb, line 82
def scan_rescue(element)
  rescue_call_scanner = RescueCallScanner.new(element)

  if rescue_call_scanner.offense_detected?
    errors.push(rescue_call_scanner.offense)
  end
end
traverse_sexp_tree(sexp_tree) click to toggle source
# File lib/fasterer/analyzer.rb, line 31
def traverse_sexp_tree(sexp_tree)
  return unless sexp_tree.is_a?(Sexp)

  token = sexp_tree.first

  scan_by_token(token, sexp_tree)

  case token
  when :call, :iter
    method_call = MethodCall.new(sexp_tree)
    traverse_sexp_tree(method_call.receiver_element) if method_call.receiver_element
    traverse_sexp_tree(method_call.arguments_element)
    traverse_sexp_tree(method_call.block_body) if method_call.has_block?
  else
    sexp_tree.each { |element| traverse_sexp_tree(element) }
  end
end