Class: RuboCop::Cop::Style::RedundantInitialize

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
CommentsHelp, RangeHelp
Defined in:
lib/rubocop/cop/style/redundant_initialize.rb

Overview

Checks for initialize methods that are redundant.

An initializer is redundant if it does not do anything, or if it only calls super with the same arguments given to it. If the initializer takes an argument that accepts multiple values (restarg, kwrestarg, etc.) it will not register an offense, because it allows the initializer to take a different number of arguments as its superclass potentially does.

NOTE: If an initializer takes any arguments and has an empty body, RuboCop assumes it to not be redundant. This is to prevent potential ArgumentError.

NOTE: If an initializer argument has a default value, RuboCop assumes it to not be redundant.

NOTE: Empty initializers are registered as offenses, but it is possible to purposely create an empty initialize method to override a superclass’s initializer.

Examples:

# bad
def initialize
end

# bad
def initialize
  super
end

# bad
def initialize(a, b)
  super
end

# bad
def initialize(a, b)
  super(a, b)
end

# good
def initialize
  do_something
end

# good
def initialize
  do_something
  super
end

# good (different number of parameters)
def initialize(a, b)
  super(a)
end

# good (default value)
def initialize(a, b = 5)
  super
end

# good (default value)
def initialize(a, b: 5)
  super
end

# good (changes the parameter requirements)
def initialize(_)
end

# good (changes the parameter requirements)
def initialize(*)
end

# good (changes the parameter requirements)
def initialize(**)
end

# good (changes the parameter requirements)
def initialize(...)
end

AllowComments: true (default)


# good
def initialize
  # Overriding to negate superclass `initialize` method.
end

AllowComments: false


# bad
def initialize
  # Overriding to negate superclass `initialize` method.
end

Constant Summary collapse

MSG =
'Remove unnecessary `initialize` method.'
MSG_EMPTY =
'Remove unnecessary empty `initialize` method.'

Constants included from RangeHelp

RangeHelp::BYTE_ORDER_MARK, RangeHelp::NOT_GIVEN

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods included from CommentsHelp

#comments_contain_disables?, #comments_in_range, #contains_comments?, #source_range_with_comment

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, 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, #initialize, #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

#exclude_limit

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

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#initialize_forwards?(node) ⇒ Object



115
116
117
# File 'lib/rubocop/cop/style/redundant_initialize.rb', line 115

def_node_matcher :initialize_forwards?, <<~PATTERN
  (def _ (args $arg*) $({super zsuper} ...))
PATTERN

#on_def(node) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/rubocop/cop/style/redundant_initialize.rb', line 119

def on_def(node)
  return if acceptable?(node)

  if node.body.nil?
    register_offense(node, MSG_EMPTY) if node.arguments.empty?
  else
    return if node.body.begin_type?

    if (args, super_node = initialize_forwards?(node))
      return unless same_args?(super_node, args)

      register_offense(node, MSG)
    end
  end
end