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
84 85 86 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 84 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object Also known as: on_numblock
116 117 118 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 116 def on_block(node) add_scope(node, @local_variables_scopes[node]) end |
#on_blockarg(node) ⇒ Object
88 89 90 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 88 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
79 80 81 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 79 def on_def(node) add_scope(node) end |
#on_if(node) ⇒ Object Also known as: on_while, on_until
122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 122 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| if child_node.lvasgn_type? add_lhs_to_local_variables_scopes(node.condition, child_node.lhs) elsif child_node.masgn_type? add_masgn_lhs_variables(node.condition, child_node.lhs) end end end |
#on_in_pattern(node) ⇒ Object
100 101 102 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 100 def on_in_pattern(node) add_match_var_scopes(node) end |
#on_lvasgn(node) ⇒ Object
96 97 98 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 96 def on_lvasgn(node) add_lhs_to_local_variables_scopes(node.rhs, node.lhs) end |
#on_masgn(node) ⇒ Object
92 93 94 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 92 def on_masgn(node) add_masgn_lhs_variables(node.rhs, node.lhs) end |
#on_op_asgn(node) ⇒ Object
73 74 75 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 73 def on_op_asgn(node) allow_self(node.lhs) end |
#on_or_asgn(node) ⇒ Object Also known as: on_and_asgn
Assignment of self.x
68 69 70 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 68 def on_or_asgn(node) allow_self(node.lhs) end |
#on_send(node) ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 104 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 |