class RuboCop::Cop::InternalAffairs::DeprecatedPositionalArguments

Enforces use of keyword arguments for `#add_offense`.

@example

# bad
add_offense(node, :selector, 'message')
add_offense(node, :selector, message: 'message')

# good
add_offense(node, location: :selector, message: 'message')

Constants

ARGUMENTS
MSG

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb, line 35
def autocorrect(node)
  positional_arguments(node) do |arguments|
    # Can't autocorrect splat.
    next if arguments.any?(&:splat_type?)

    lambda do |corrector|
      arguments.zip(ARGUMENTS).each do |(arg, keyword)|
        corrector.replace(arg.source_range, "#{keyword}: #{arg.source}")
      end
    end
  end
end
on_send(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb, line 22
def on_send(node)
  return unless node.method_name == :add_offense

  positional_arguments(node) do |arguments|
    location = range_between(
      arguments.first.loc.expression.begin_pos,
      arguments.last.loc.expression.end_pos
    )

    add_offense(node, location: location)
  end
end

Private Instance Methods

extract_arguments(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb, line 67
def extract_arguments(node)
  node.arguments.butfirst.take_while do |arg|
    # Filter out block argument
    next false if arg.block_pass_type?
    # Filter out kwsplat
    next false if arg.hash_type? && arg.each_child_node(:kwsplat).any?
    # Keep all others
    true
  end
end
positional_arguments(node) { |positional_args| ... } click to toggle source
# File lib/rubocop/cop/internal_affairs/deprecated_positional_arguments.rb, line 50
def positional_arguments(node)
  arguments = extract_arguments(node)

  positional_args =
    case arguments
    when :empty?.to_proc then []
    # Keyword arguments only
    when ->(args) { args.one? && args.first.hash_type? } then []
    # Mixed style
    when ->(args) { args.last.hash_type? } then arguments.drop_last(1)
    # Positional arguments only
    else arguments
    end

  yield positional_args if positional_args.any?
end