lib/fasterer/method_definition.rb
module Fasterer
class MethodDefinition
attr_reader :element # for testing purposes
attr_reader :method_name
attr_reader :block_argument_name
attr_reader :body
attr_reader :arguments
alias_method :name, :method_name
def initialize(element)
@element = element # Ripper element
set_method_name
set_body
set_arguments
set_block_argument_name
end
def has_block?
!!@block_argument_name
end
def setter?
name.to_s.end_with?('=')
end
private
def arguments_element
element[2].drop(1) || []
end
def set_method_name
@method_name = @element[1]
end
def set_arguments
@arguments = arguments_element.map do |argument_element|
MethodDefinitionArgument.new(argument_element)
end
end
def set_body
@body = @element[3..-1]
end
def set_block_argument_name
if last_argument_element.to_s.start_with?('&')
@block_argument_name = last_argument_element.to_s[1..-1].to_sym
end
end
def last_argument_element
arguments_element.last
end
end
class MethodDefinitionArgument
attr_reader :element, :name, :type
def initialize(element)
@element = element
set_name
set_argument_type
end
def regular_argument?
@type == :regular_argument
end
def default_argument?
@type == :default_argument
end
def keyword_argument?
@type == :keyword_argument
end
private
def set_name
@name = element.is_a?(Symbol) ? element : element[1]
end
def set_argument_type
@type = if element.is_a?(Symbol)
:regular_argument
elsif element.is_a?(Sexp) && element.sexp_type == :lasgn
:default_argument
elsif element.is_a?(Sexp) && element.sexp_type == :kwarg
:keyword_argument
end
end
end
end