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.
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, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #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, #ready, #relevant_file?, 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.
59 60 61 62 63 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 59 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
55 56 57 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 55 def self.autocorrect_incompatible_with [ColonMethodCall, Layout::DotPosition] end |
Instance Method Details
#on_args(node) ⇒ Object
85 86 87 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 85 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object Also known as: on_numblock
119 120 121 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 119 def on_block(node) add_scope(node, @local_variables_scopes[node]) end |
#on_blockarg(node) ⇒ Object
89 90 91 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 89 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
80 81 82 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 80 def on_def(node) add_scope(node) end |
#on_if(node) ⇒ Object Also known as: on_while, on_until
125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 125 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
103 104 105 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 103 def on_in_pattern(node) add_match_var_scopes(node) end |
#on_lvasgn(node) ⇒ Object
98 99 100 101 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 98 def on_lvasgn(node) lhs, rhs = *node add_lhs_to_local_variables_scopes(rhs, lhs) end |
#on_masgn(node) ⇒ Object
93 94 95 96 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 93 def on_masgn(node) lhs, rhs = *node add_masgn_lhs_variables(rhs, lhs) end |
#on_op_asgn(node) ⇒ Object
73 74 75 76 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 73 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
67 68 69 70 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 67 def on_or_asgn(node) lhs, _rhs = *node allow_self(lhs) end |
#on_send(node) ⇒ Object
107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 107 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) add_offense(node.receiver) do |corrector| corrector.remove(node.receiver) corrector.remove(node.loc.dot) end end |