class RuboCop::Cop::Rails::Delegate
end
foo.bar
def bar
private
# good
delegate :bar, to: :foo, prefix: true
# good
end
foo.bar
def foo_bar
# bad
delegate :bar, to: :foo
# good
end
foo.bar
def bar
# bad
@example
automatically with delegate method.
This cop looks for delegations, that could have been created
def arguments_match?(args, body)
def arguments_match?(args, body) _receiver, _method_name, *arguments = *body arg_array = Array(args) argument_array = Array(arguments) arg_array.size == argument_array.size && ( arg_array == argument_array || arg_array.map(&:children) == argument_array.map(&:children) ) end
def autocorrect(node)
def autocorrect(node) method_name, _args, body = *node delegation = ["delegate :#{body.children[1]}", "to: :#{body.children[0].children[1]}"] if method_name == prefixed_method_name(body) delegation << ['prefix: true'] end lambda do |corrector| corrector.replace(node.loc.expression, delegation.join(', ')) end end
def delegate?(body)
def delegate?(body) receiver, * = *body return false unless receiver.is_a? Parser::AST::Node return false unless receiver.type == :send receiver.child_nodes.empty? end
def method_name_matches?(method_name, body)
def method_name_matches?(method_name, body) _receiver, property_name, *_args = *body method_name == property_name || method_name == prefixed_method_name(body) end
def on_def(node)
def on_def(node) method_name, args, body = *node return unless trivial_delegate?(method_name, args, body) return if private_or_protected_delegation(node) add_offense(node, :keyword, MSG) end
def prefixed_method_name(body)
def prefixed_method_name(body) receiver, property_name, *_args = *body _receiver, target, *_args = *receiver [target, property_name].join('_').to_sym end
def private_or_protected_before(line)
def private_or_protected_before(line) (processed_source[0..line].map(&:strip) & %w(private protected)).any? end
def private_or_protected_delegation(node)
def private_or_protected_delegation(node) line = node.loc.line private_or_protected_before(line) || private_or_protected_inline(line) end
def private_or_protected_inline(line)
def private_or_protected_inline(line) processed_source[line - 1].strip =~ /\A(private )|(protected )/ end
def trivial_delegate?(method_name, args, body)
def trivial_delegate?(method_name, args, body) body && delegate?(body) && method_name_matches?(method_name, body) && arguments_match?(args, body) end