class RuboCop::Cop::Lint::MissingSuper


end
end
do_something
super
def self.inherited(base)
class Parent
# good
end
end
do_something
def self.inherited(base)
class Parent
# bad
end
end
@salary = salary
super(name)
def initialize(name, salary)
class Employee < Person
# good
end
end
@salary = salary
def initialize(name, salary)
class Employee < Person
# bad
@example
challenging or verbose for no actual gain.
missing method. In other cases, the theoretical ideal handling could be
because in some cases it makes sense to overtake what is considered a
This cop does not consider ‘method_missing` (and `respond_to_missing?`)
without calls to `super`.
This cop checks for the presence of constructors and lifecycle callbacks

def callback_method_def?(node)

def callback_method_def?(node)
  return unless CALLBACKS.include?(node.method_name)
  node.each_ancestor(:class, :sclass, :module).first
end

def contains_super?(node)

def contains_super?(node)
  node.each_descendant(:super, :zsuper).any?
end

def inside_class_with_stateful_parent?(node)

def inside_class_with_stateful_parent?(node)
  class_node = node.each_ancestor(:class).first
  class_node&.parent_class && !stateless_class?(class_node.parent_class)
end

def offender?(node)

def offender?(node)
  (node.method?(:initialize) || callback_method_def?(node)) && !contains_super?(node)
end

def on_def(node)

def on_def(node)
  return unless offender?(node)
  if node.method?(:initialize) && inside_class_with_stateful_parent?(node)
    add_offense(node, message: CONSTRUCTOR_MSG)
  elsif callback_method_def?(node)
    add_offense(node, message: CALLBACK_MSG)
  end
end

def on_defs(node)

def on_defs(node)
  return if !callback_method_def?(node) || contains_super?(node)
  add_offense(node, message: CALLBACK_MSG)
end

def stateless_class?(node)

def stateless_class?(node)
  STATELESS_CLASSES.include?(node.const_name)
end