class RuboCop::Cop::Layout::MultilineBlockLayout

}
bar(i)
foo(i)
blah { |i|
# good
}
bar(i)
blah { |i| foo(i)
# bad
end
bar(i)
foo(i)
blah do |i|
# good
end
bar(i)
|i| foo(i)
blah do
# bad
end
bar(i)
blah do |i| foo(i)
# bad
@example
arguments, if any, are on the same line as the start of the block.
after the start of the block. Additionally, it checks whether the block
This cop checks whether the multiline do end blocks have a newline

def add_offense_for_expression(node, expr, msg)

def add_offense_for_expression(node, expr, msg)
  expression = expr.source_range
  range = range_between(expression.begin_pos, expression.end_pos)
  add_offense(node, location: range, message: msg)
end

def args_on_beginning_line?(node)

def args_on_beginning_line?(node)
  !node.arguments? ||
    node.loc.begin.line == node.arguments.loc.last_line
end

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    unless args_on_beginning_line?(node)
      autocorrect_arguments(corrector, node)
      expr_before_body = node.arguments.source_range.end
    end
    return unless node.body
    expr_before_body ||= node.loc.begin
    if expr_before_body.line == node.body.first_line
      autocorrect_body(corrector, node, node.body)
    end
  end
end

def autocorrect_arguments(corrector, node)

def autocorrect_arguments(corrector, node)
  end_pos = range_with_surrounding_space(
    range: node.arguments.source_range,
    side: :right,
    newlines: false
  ).end_pos
  range = range_between(node.loc.begin.end.begin_pos, end_pos)
  corrector.replace(range, " |#{block_arg_string(node.arguments)}|")
end

def autocorrect_body(corrector, node, block_body)

def autocorrect_body(corrector, node, block_body)
  first_node = if block_body.begin_type?
                 block_body.children.first
               else
                 block_body
               end
  block_start_col = node.source_range.column
  corrector.insert_before(first_node.source_range,
                          "\n  #{' ' * block_start_col}")
end

def block_arg_string(args)

def block_arg_string(args)
  args.children.map do |arg|
    if arg.mlhs_type?
      "(#{block_arg_string(arg)})"
    else
      arg.source
    end
  end.join(', ')
end

def on_block(node)

def on_block(node)
  return if node.single_line?
  unless args_on_beginning_line?(node)
    add_offense_for_expression(node, node.arguments, ARG_MSG)
  end
  return unless node.body && node.loc.begin.line == node.body.first_line
  add_offense_for_expression(node, node.body, MSG)
end