Class: RuboCop::Cop::Style::RedundantSelf
- Defined in:
- lib/rubocop/cop/style/redundant_self.rb
Overview
This cop checks for redundant uses of ‘self`.
The usage of ‘self` is only needed when:
-
Sending a message to same object with zero arguments in presence of a method name clash with an argument or a local variable.
-
Calling an attribute writer to prevent an local variable assignment.
Note, with using explicit self you can only send messages with public or protected scope, you cannot send private messages this way.
Note we allow uses of ‘self` with operators because it would be awkward otherwise.
Constant Summary collapse
- MSG =
'Redundant `self` detected.'.freeze
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::CONDITIONAL_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::LOGICAL_OPERATOR_NODES, Util::MODIFIER_NODES, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Class Method Summary collapse
Instance Method Summary collapse
- #autocorrect(node) ⇒ Object
-
#initialize(config = nil, options = nil) ⇒ RedundantSelf
constructor
A new instance of RedundantSelf.
- #on_args(node) ⇒ Object
- #on_block(node) ⇒ Object
- #on_blockarg(node) ⇒ Object
-
#on_def(node) ⇒ Object
(also: #on_defs)
Using self.x to distinguish from local variable x.
- #on_lvasgn(node) ⇒ Object
- #on_op_asgn(node) ⇒ Object
-
#on_or_asgn(node) ⇒ Object
(also: #on_and_asgn)
Assignment of self.x.
- #on_send(node) ⇒ Object
Methods inherited from Cop
#add_offense, all, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, #correct, department, #duplicate_location?, #excluded_file?, #find_location, #highlights, inherited, #join_force?, lint?, match?, #message, #messages, non_rails, #parse, qualified_cop_name, #relevant_file?, #target_rails_version, #target_ruby_version
Methods included from AST::Sexp
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
begins_its_line?, comment_line?, double_quotes_required?, effective_column, ends_its_line?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, operator?, parentheses?, parenthesized_call?, precede?, range_between, range_by_whole_lines, range_with_surrounding_comma, range_with_surrounding_space, same_line?, source_range, strip_quotes, stripped_source_upto, symbol_without_quote?, to_string_literal, to_supported_styles, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, find_file_upwards, match_path?, pwd, relative_path, reset_pwd, smart_path
Constructor Details
#initialize(config = nil, options = nil) ⇒ RedundantSelf
Returns a new instance of RedundantSelf.
51 52 53 54 55 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 51 def initialize(config = nil, = nil) super @allowed_send_nodes = [] @local_variables_scopes = Hash.new { |hash, key| hash[key] = [] } end |
Class Method Details
.autocorrect_incompatible_with ⇒ Object
47 48 49 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 47 def self.autocorrect_incompatible_with [ColonMethodCall] end |
Instance Method Details
#autocorrect(node) ⇒ Object
103 104 105 106 107 108 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 103 def autocorrect(node) lambda do |corrector| corrector.remove(node.receiver.source_range) corrector.remove(node.loc.dot) end end |
#on_args(node) ⇒ Object
77 78 79 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 77 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object
99 100 101 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 99 def on_block(node) add_scope(node, @local_variables_scopes[node]) end |
#on_blockarg(node) ⇒ Object
81 82 83 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 81 def on_blockarg(node) on_argument(node) end |
#on_def(node) ⇒ Object Also known as: on_defs
Using self.x to distinguish from local variable x
72 73 74 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 72 def on_def(node) add_scope(node) end |
#on_lvasgn(node) ⇒ Object
85 86 87 88 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 85 def on_lvasgn(node) lhs, rhs = *node @local_variables_scopes[rhs] << lhs end |
#on_op_asgn(node) ⇒ Object
65 66 67 68 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 65 def on_op_asgn(node) lhs, _op, _rhs = *node allow_self(lhs) end |
#on_or_asgn(node) ⇒ Object Also known as: on_and_asgn
Assignment of self.x
59 60 61 62 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 59 def on_or_asgn(node) lhs, _rhs = *node allow_self(lhs) end |
#on_send(node) ⇒ Object
90 91 92 93 94 95 96 97 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 90 def on_send(node) return unless node.self_receiver? && regular_method_call?(node) return if node.parent && node.parent.mlhs_type? return if allowed_send_node?(node) add_offense(node) end |