class RuboCop::Cop::Rails::Exit

raise ‘a bad error has happened’
# good
exit(0)
# bad
@example
do its job.
the program exiting, which could result in the code failing to run and
- Usage in application code outside of the web process could result in
is used.)
code will result in specs exiting (potentially silently if exit(0)
rescue from a SystemExit and continue on, unit testing that library
- Usage in library code for your application. Even though rails will
There are two obvious cases where ‘exit’ is particularly harmful:
other form of stopping execution of current request.
Valid options are instead to raise an error, break, return or some
This cop enforces that ‘exit’ calls are not used within a rails app.

def offending_node?(node)

def offending_node?(node)
  right_method_name?(node.method_name) &&
    right_argument_count?(node.arguments) &&
    right_receiver?(node.receiver)
end

def on_send(node)

def on_send(node)
  add_offense(node, location: :selector) if offending_node?(node)
end

def right_argument_count?(arg_nodes)

`exit` implementation than the one we are preventing.
More than 1 argument likely means it is a different
def right_argument_count?(arg_nodes)
  arg_nodes.size <= 1
end

def right_method_name?(method_name)

def right_method_name?(method_name)
  TARGET_METHODS.include?(method_name)
end

def right_receiver?(receiver_node)

`exit` calls.
Kernel or Process or if receiver node is nil for plain
Only register if exit is being called explicitly on
def right_receiver?(receiver_node)
  return true unless receiver_node
  _a, receiver_node_class, _c = *receiver_node
  EXPLICIT_RECEIVERS.include?(receiver_node_class)
end