lib/fasterer/method_definition.rb in fasterer-0.1.8 vs lib/fasterer/method_definition.rb in fasterer-0.1.9
- old
+ new
@@ -2,50 +2,96 @@
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
-
- if arguments_element.any?
- set_argument_names
- set_block_argument_name
- end
+ 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)
+ element[2].drop(1) || []
end
def set_method_name
@method_name = @element[1]
end
- def set_argument_names
- # TODO
+ 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.to_s.start_with?('&')
- @block_argument_name = last_argument.to_s[1..-1].to_sym
+ 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
+ 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