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.'
- KERNEL_METHODS =
Kernel.methods(false)
Constants included from Util
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_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 inherited from Cop
#add_offense, all, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #external_dependency_checksum, #find_location, #highlights, inherited, #join_force?, lint?, match?, #message, #messages, #parse, qualified_cop_name, #reason_to_not_correct, #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?, #correctable?, #disable_offense, #disable_uncorrectable?, #safe_autocorrect?, #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?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens, trim_string_interporation_escape_character
Methods included from PathUtil
absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path
Constructor Details
#initialize(config = nil, options = nil) ⇒ RedundantSelf
Returns a new instance of RedundantSelf.
52 53 54 55 56 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 52 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
48 49 50 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 48 def self.autocorrect_incompatible_with [ColonMethodCall] end |
Instance Method Details
#autocorrect(node) ⇒ Object
111 112 113 114 115 116 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 111 def autocorrect(node) lambda do |corrector| corrector.remove(node.receiver.source_range) corrector.remove(node.loc.dot) end end |
#on_args(node) ⇒ Object
78 79 80 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 78 def on_args(node) node.children.each { |arg| on_argument(arg) } end |
#on_block(node) ⇒ Object
107 108 109 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 107 def on_block(node) add_scope(node, @local_variables_scopes[node]) end |
#on_blockarg(node) ⇒ Object
82 83 84 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 82 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
73 74 75 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 73 def on_def(node) add_scope(node) end |
#on_lvasgn(node) ⇒ Object
93 94 95 96 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 93 def on_lvasgn(node) lhs, rhs = *node add_lhs_to_local_variables_scopes(rhs, lhs) end |
#on_masgn(node) ⇒ Object
86 87 88 89 90 91 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 86 def on_masgn(node) lhs, rhs = *node lhs.children.each do |child| add_lhs_to_local_variables_scopes(rhs, child.to_a.first) end end |
#on_op_asgn(node) ⇒ Object
66 67 68 69 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 66 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
60 61 62 63 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 60 def on_or_asgn(node) lhs, _rhs = *node allow_self(lhs) end |
#on_send(node) ⇒ Object
98 99 100 101 102 103 104 105 |
# File 'lib/rubocop/cop/style/redundant_self.rb', line 98 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) end |