class Fasterer::MethodDefinitionScanner

Attributes

element[R]

Public Class Methods

new(element) click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 12
def initialize(element)
  @element = element
  check_offense
end

Private Instance Methods

check_offense() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 19
def check_offense
  if method_definition.has_block?
    scan_block_call_offense
  else
    scan_getter_and_setter_offense
  end
end
method_definition() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 42
def method_definition
  @method_definition ||= MethodDefinition.new(element)
end
scan_block_call_offense() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 27
def scan_block_call_offense
  traverse_tree(method_definition.body) do |element|
    next unless element.sexp_type == :call

    method_call = MethodCall.new(element)

    if method_call.receiver.is_a?(Fasterer::VariableReference) &&
       method_call.receiver.name == method_definition.block_argument_name &&
       method_call.method_name == :call

      add_offense(:proc_call_vs_yield) && return
    end
  end
end
scan_getter_and_setter_offense() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 54
def scan_getter_and_setter_offense
  method_definition.setter? ? scan_setter_offense : scan_getter_offense
end
scan_getter_offense() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 73
def scan_getter_offense
  return if method_definition.arguments.size > 0
  return if method_definition.body.size != 1

  if method_definition.body.first.sexp_type == :ivar &&
     method_definition.body.first[1].to_s == "@#{method_definition.name}"

    add_offense(:getter_vs_attr_reader)
  end
end
scan_setter_offense() click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 58
def scan_setter_offense
  return if method_definition.arguments.size != 1
  return if method_definition.body.size != 1

  first_argument = method_definition.arguments.first
  return if first_argument.type != :regular_argument

  if method_definition.body.first.sexp_type == :iasgn &&
     method_definition.body.first[1].to_s == "@#{method_definition.name.to_s[0..-2]}" &&
     method_definition.body.first[2][1] == first_argument.name

    add_offense(:setter_vs_attr_writer)
  end
end
traverse_tree(sexp_tree) { |element| ... } click to toggle source
# File lib/fasterer/scanners/method_definition_scanner.rb, line 46
def traverse_tree(sexp_tree, &block)
  sexp_tree.each do |element|
    next unless element.is_a?(Array)
    yield element
    traverse_tree(element, &block)
  end
end