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_itblock)
- #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_gem_version, #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
87 88 89 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 87 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object Also known as: on_numblock, on_itblock
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
91 92 93 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 91 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
82 83 84 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 82 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 |
# 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.each_descendant(:lvasgn, :masgn) do |descendant_node| if descendant_node.lvasgn_type? add_lhs_to_local_variables_scopes(node.condition, descendant_node.lhs) else add_masgn_lhs_variables(node.condition, descendant_node.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
99 100 101 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 99 def on_lvasgn(node) add_lhs_to_local_variables_scopes(node.rhs, node.lhs) end |
#on_masgn(node) ⇒ Object
95 96 97 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 95 def on_masgn(node) add_masgn_lhs_variables(node.rhs, node.lhs) end |
#on_op_asgn(node) ⇒ Object
76 77 78 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 76 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 71 72 73 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 68 def on_or_asgn(node) allow_self(node.lhs) lhs_name = node.lhs.lvasgn_type? ? node.lhs.name : node.lhs add_lhs_to_local_variables_scopes(node.rhs, lhs_name) 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) return if it_method_in_block?(node) add_offense(node.receiver) do |corrector| corrector.remove(node.receiver) corrector.remove(node.loc.dot) end end |