Class: RuboCop::Cop::Style::RedundantSelf
- Extended by:
- AutoCorrector
- Defined in:
- lib/rubocop/cop/style/redundant_self.rb
Overview
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 a 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. Also allows the use of `self.it` without arguments in blocks, as in `0.times { self.it }`, following `Lint/ItWithoutArgumentsInBlock` cop.
Constant Summary collapse
- MSG =
'Redundant `self` detected.'
- KERNEL_METHODS =
Kernel.methods(false)
- KEYWORDS =
%i[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 __FILE__ __LINE__ __ENCODING__].freeze
Constants inherited from Base
Instance Attribute Summary
Attributes inherited from Base
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize(config = nil, options = nil) ⇒ RedundantSelf
constructor
A new instance of RedundantSelf.
- #on_args(node) ⇒ Object
- #on_block(node) ⇒ Object (also: #on_numblock)
- #on_blockarg(node) ⇒ Object
-
#on_def(node) ⇒ Object
(also: #on_defs)
Using self.x to distinguish from local variable x.
- #on_if(node) ⇒ Object (also: #on_while, #on_until)
- #on_in_pattern(node) ⇒ Object
- #on_lvasgn(node) ⇒ Object
- #on_masgn(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 included from AutoCorrector
Methods inherited from Base
#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version
Methods included from ExcludeLimit
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
Constructor Details
#initialize(config = nil, options = nil) ⇒ RedundantSelf
Returns a new instance of RedundantSelf.
60 61 62 63 64 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 60 def initialize(config = nil, = nil) super @allowed_send_nodes = [] @local_variables_scopes = Hash.new { |hash, key| hash[key] = [] }.compare_by_identity end |
Class Method Details
.autocorrect_incompatible_with ⇒ Object
56 57 58 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 56 def self.autocorrect_incompatible_with [ColonMethodCall, Layout::DotPosition] end |
Instance Method Details
#on_args(node) ⇒ Object
86 87 88 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 86 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object Also known as: on_numblock
120 121 122 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 120 def on_block(node) add_scope(node, @local_variables_scopes[node]) end |
#on_blockarg(node) ⇒ Object
90 91 92 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 90 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
81 82 83 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 81 def on_def(node) add_scope(node) end |
#on_if(node) ⇒ Object Also known as: on_while, on_until
126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 126 def on_if(node) # Allow conditional nodes to use `self` in the condition if that variable # name is used in an `lvasgn` or `masgn` within the `if`. node.child_nodes.each do |child_node| lhs, _rhs = *child_node if child_node.lvasgn_type? add_lhs_to_local_variables_scopes(node.condition, lhs) elsif child_node.masgn_type? add_masgn_lhs_variables(node.condition, lhs) end end end |
#on_in_pattern(node) ⇒ Object
104 105 106 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 104 def on_in_pattern(node) add_match_var_scopes(node) end |
#on_lvasgn(node) ⇒ Object
99 100 101 102 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 99 def on_lvasgn(node) lhs, rhs = *node add_lhs_to_local_variables_scopes(rhs, lhs) end |
#on_masgn(node) ⇒ Object
94 95 96 97 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 94 def on_masgn(node) lhs, rhs = *node add_masgn_lhs_variables(rhs, lhs) end |
#on_op_asgn(node) ⇒ Object
74 75 76 77 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 74 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
68 69 70 71 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 68 def on_or_asgn(node) lhs, _rhs = *node allow_self(lhs) end |
#on_send(node) ⇒ Object
108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 108 def on_send(node) return unless node.self_receiver? && regular_method_call?(node) return if node.parent&.mlhs_type? return if allowed_send_node?(node) return if it_method_in_block?(node) add_offense(node.receiver) do |corrector| corrector.remove(node.receiver) corrector.remove(node.loc.dot) end end |