class Rubocop::Cop::Style::RedundantSelf
otherwise.
We allow uses of ‘self` with operators because it would be awkward
Special cases:
end
self.bar= 1 # Make sure above attr writer is called
def foo
attr_writer :bar
* Calling an attribute writer to prevent an local variable assignment
end
self.bar # resolves name class with local variable
bar = 1
def foo2
end
self.bar # resolves name clash with argument
def foo(bar)
end
:baz
def bar
Example:
messages this way.
with public or protected scope, you cannot send private
Note, with using explicit self you can only send messages
variable.
presence of a method name clash with an argument or a local
* Sending a message to same object with zero arguments in
`self` is only needed when:
This cop checks for redundant uses of `self`.
def allow_self(node)
def allow_self(node) if node.type == :send receiver, _method_name, *_args = *node @allowed_send_nodes << node if receiver && receiver.type == :self end end
def autocorrect(node)
def autocorrect(node) receiver, _method_name, *_args = *node @corrections << lambda do |corrector| corrector.remove(receiver.loc.expression) corrector.remove(node.loc.dot) end end
def constant_name?(method_name)
def constant_name?(method_name) method_name.match(/^[A-Z]/) end
def initialize(config = nil, options = nil)
def initialize(config = nil, options = nil) super @allowed_send_nodes = [] @local_variables = [] end
def keyword?(method_name)
def keyword?(method_name) [:alias, :and, :begin, :break, :case, :class, :def, :defined, :do, :else, :elsif, :end, :ensure, :false, :for, :if, :in, :module, :next, :nil, :not, :or, :redo, :rescue, :retry, :return, :self, :super, :then, :true, :undef, :unless, :until, :when, :while, :yield].include?(method_name) end
def on_args(node)
def on_args(node) node.children.each { |arg| on_argument(arg) } end
def on_argument(node)
def on_argument(node) name, _ = *node @local_variables << name end
def on_blockarg(node)
def on_blockarg(node) on_argument(node) end
def on_def(node)
def on_def(node) @local_variables = [] end
def on_defs(node)
def on_defs(node) @local_variables = [] end
def on_lvasgn(node)
def on_lvasgn(node) lhs, _rhs = *node @local_variables << lhs end
def on_op_asgn(node)
def on_op_asgn(node) lhs, _op, _rhs = *node allow_self(lhs) end
def on_or_asgn(node)
def on_or_asgn(node) lhs, _rhs = *node allow_self(lhs) end
def on_send(node)
def on_send(node) receiver, method_name, *_args = *node if receiver && receiver.type == :self unless operator?(method_name) || keyword?(method_name) || constant_name?(method_name) || @allowed_send_nodes.include?(node) || @local_variables.include?(method_name) add_offense(node, :expression) end end end
def operator?(method_name)
def operator?(method_name) method_name.to_s =~ /\W/ end