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
Enforces that `exit` calls are not used within a rails app.

def offending_node?(node)

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

def on_send(node)

def on_send(node)
  add_offense(node.loc.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_receiver?(receiver_node)

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