txus/to_source

View on GitHub
lib/to_source/emitter/formal_arguments.rb

Summary

Maintainability
A
25 mins
Test Coverage
module ToSource

  class Emitter

    class FormalArguments < self

    private

      def any?
        required? or defaults? or splat? or block_arg?
      end

      def required
        arguments.required
      end

      def required?
        required.any?
      end

      def defaults
        arguments.defaults
      end

      def defaults?
        !!defaults
      end

      def splat
        arguments.splat
      end

      def splat?
        !!splat
      end

      def block_arg
        arguments.block_arg
      end

      def block_arg?
        !!block_arg
      end

      def emit_required
        array = required
        max = array.length - 1
        array.each_with_index do |member, index|
          if member.kind_of?(Rubinius::AST::Node)
            visit(member)
          else
            emit(member)
          end
          emit(', ') if index < max
        end
      end

      def emit_defaults
        return unless defaults?
        emit(', ') if required?
        visit(defaults)
      end

      def emit_splat
        return unless splat?

        emit(', ') if required? or defaults?
        emit('*')
        value = splat
        unless value == :@unnamed_splat
          emit(value)
        end
      end

      def emit_block_arg
        return unless block_arg?
        emit(', ') if required? or defaults? or splat?
        visit(block_arg)
      end

      def arguments
        node.arguments
      end

      def dispatch
        return unless any?

        util = self.class

        emit(util::OPEN)

        emit_required
        emit_defaults
        emit_splat
        emit_block_arg

        emit(util::CLOSE)
      end

      class Block < self
        OPEN = ' |'.freeze
        CLOSE = '|'.freeze
      end

      class Method < self
        OPEN = '('.freeze
        CLOSE = ')'.freeze
      end
    end
  end
end