class RuboCop::Cop::Layout::EmptyLinesAroundExceptionHandlingKeywords

end
do_something2
rescue
do_something
def foo
# bad
end
do_something4
ensure
do_something3
else
do_something2
rescue
do_something
begin
# bad
end
do_something2
rescue
do_something
def foo
# good
end
do_something4
ensure
do_something3
else
do_something2
rescue
do_something
begin
# good
@example
can be used for this purpose.
‘Style/EmptyLinesAroundBeginBody` or `Style/EmptyLinesAroundMethodBody`
beginning/end and around method definition body.
sections. This cop doesn’t check empty lines at ‘begin` body
This cop checks if empty lines exist around the bodies of `begin`

def autocorrect(node)

def autocorrect(node)
  EmptyLineCorrector.correct(node)
end

def check_body(node)

def check_body(node)
  locations = keyword_locations(node)
  locations.each do |loc|
    line = loc.line
    keyword = loc.source
    # below the keyword
    check_line(style, line, message('after', keyword), &:empty?)
    # above the keyword
    check_line(style,
               line - 2,
               message('before', keyword),
               &:empty?)
  end
end

def keyword_locations(node)

def keyword_locations(node)
  return [] unless node
  case node.type
  when :rescue
    keyword_locations_in_rescue(node)
  when :ensure
    keyword_locations_in_ensure(node)
  else
    []
  end
end

def keyword_locations_in_ensure(node)

def keyword_locations_in_ensure(node)
  ensure_body, = *node
  [
    node.loc.keyword,
    *keyword_locations(ensure_body)
  ]
end

def keyword_locations_in_rescue(node)

def keyword_locations_in_rescue(node)
  _begin_body, *resbodies, _else_body = *node
  [
    node.loc.else,
    *resbodies.map { |body| body.loc.keyword }
  ].compact
end

def message(location, keyword)

def message(location, keyword)
  format(MSG, location: location, keyword: keyword)
end

def on_def(node)

def on_def(node)
  check_body(node.body)
end

def on_kwbegin(node)

def on_kwbegin(node)
  body, = *node
  check_body(body)
end

def style

def style
  :no_empty_lines
end