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