class RuboCop::Cop::Lint::UselessRuby2Keywords
Looks for `ruby2_keywords` calls for methods that do not need it.
`ruby2_keywords` should only be called on methods that accept an argument splat (`*args`) but do not explicit keyword arguments (`k:` or `k: true`) or a keyword splat (`**kwargs`).
@example
# good (splat argument without keyword arguments) ruby2_keywords def foo(*args); end # bad (no arguments) ruby2_keywords def foo; end # good def foo; end # bad (positional argument) ruby2_keywords def foo(arg); end # good def foo(arg); end # bad (double splatted argument) ruby2_keywords def foo(**args); end # good def foo(**args); end # bad (keyword arguments) ruby2_keywords def foo(i:, j:); end # good def foo(i:, j:); end # bad (splat argument with keyword arguments) ruby2_keywords def foo(*args, i:, j:); end # good def foo(*args, i:, j:); end # bad (splat argument with double splat) ruby2_keywords def foo(*args, **kwargs); end # good def foo(*args, **kwargs); end # bad (ruby2_keywords given a symbol) def foo; end ruby2_keywords :foo # good def foo; end # bad (ruby2_keywords with dynamic method) define_method(:foo) { |arg| } ruby2_keywords :foo # good define_method(:foo) { |arg| }
Constants
- MSG
- RESTRICT_ON_SEND
Public Instance Methods
on_send(node)
click to toggle source
# File lib/rubocop/cop/lint/useless_ruby2_keywords.rb, line 79 def on_send(node) if node.first_argument.def_type? inspect_def(node, node.first_argument) elsif node.first_argument.sym_type? inspect_sym(node, node.first_argument) end end
Private Instance Methods
allowed_arguments(arguments)
click to toggle source
`ruby2_keywords` is only allowed if there's a `restarg` and no keyword arguments
# File lib/rubocop/cop/lint/useless_ruby2_keywords.rb, line 108 def allowed_arguments(arguments) return false if arguments.empty? arguments.each_child_node(:restarg).any? && arguments.each_child_node(:kwarg, :kwoptarg, :kwrestarg).none? end
inspect_def(node, def_node)
click to toggle source
# File lib/rubocop/cop/lint/useless_ruby2_keywords.rb, line 89 def inspect_def(node, def_node) return if allowed_arguments(def_node.arguments) add_offense(node.loc.selector, message: format(MSG, method_name: def_node.method_name)) end
inspect_sym(node, sym_node)
click to toggle source
# File lib/rubocop/cop/lint/useless_ruby2_keywords.rb, line 95 def inspect_sym(node, sym_node) return unless node.parent method_name = sym_node.value definition = node.parent.each_child_node.detect { |n| method_definition(n, method_name) } return unless definition return if allowed_arguments(definition.arguments) add_offense(node, message: format(MSG, method_name: method_name)) end