class RuboCop::Cop::Style::StaticClass


end
def self.class_method; end
def instance_method; end
class SomeClass
# good - has instance method
end
end
# body omitted
def some_other_method
end
# body omitted
def some_method
module_function
module SomeModule
# good
end
end
# body omitted
def self.some_other_method
end
# body omitted
def self.some_method
class SomeClass
# bad
@example
a dummy instance is instantiated from it somewhere.
for some other subclass, monkey-patched with instance methods or
This cop is unsafe, because it is possible that this class is a parent
@safety
instances out of them.
replaced with a module. Classes should be used only when it makes sense to create
Checks for places where classes with only class methods can be

def autocorrect(corrector, class_node)

def autocorrect(corrector, class_node)
  corrector.replace(class_node.loc.keyword, 'module')
  corrector.insert_after(class_node.loc.name, "\nmodule_function\n")
  class_elements(class_node).each do |node|
    if node.defs_type?
      autocorrect_def(corrector, node)
    elsif node.sclass_type?
      autocorrect_sclass(corrector, node)
    end
  end
end

def autocorrect_def(corrector, node)

def autocorrect_def(corrector, node)
  corrector.remove(
    range_between(node.receiver.source_range.begin_pos, node.loc.name.begin_pos)
  )
end

def autocorrect_sclass(corrector, node)

def autocorrect_sclass(corrector, node)
  corrector.remove(
    range_between(node.loc.keyword.begin_pos, node.identifier.source_range.end_pos)
  )
  corrector.remove(node.loc.end)
end

def class_convertible_to_module?(class_node)

def class_convertible_to_module?(class_node)
  nodes = class_elements(class_node)
  return false if nodes.empty?
  nodes.all? do |node|
    (node_visibility(node) == :public && node.defs_type?) ||
      sclass_convertible_to_module?(node) ||
      node.equals_asgn? ||
      extend_call?(node)
  end
end

def class_elements(class_node)

def class_elements(class_node)
  class_def = class_node.body
  if !class_def
    []
  elsif class_def.begin_type?
    class_def.children
  else
    [class_def]
  end
end

def extend_call?(node)

def extend_call?(node)
  node.send_type? && node.method?(:extend)
end

def on_class(class_node)

def on_class(class_node)
  return if class_node.parent_class
  return unless class_convertible_to_module?(class_node)
  add_offense(class_node) do |corrector|
    autocorrect(corrector, class_node)
  end
end

def sclass_convertible_to_module?(node)

def sclass_convertible_to_module?(node)
  return false unless node.sclass_type?
  class_elements(node).all? do |child|
    node_visibility(child) == :public && (child.def_type? || child.equals_asgn?)
  end
end