class RuboCop::Cop::Style::MultilineMemoization

)
baz
bar
foo ||= (
# good
end
baz
bar
foo ||= begin
# bad
@example EnforcedStyle: braces
end
baz
bar
foo ||= begin
# good
)
baz
bar
foo ||= (
# bad
@example EnforcedStyle: keyword (default)
Checks expressions wrapping styles for multiline memoization.

def bad_rhs?(rhs)

def bad_rhs?(rhs)
  return false unless rhs.multiline?
  if style == :keyword
    rhs.begin_type?
  else
    rhs.kwbegin_type?
  end
end

def keyword_autocorrect(node, corrector)

def keyword_autocorrect(node, corrector)
  node_buf = node.source_range.source_buffer
  corrector.replace(node.loc.begin, keyword_begin_str(node, node_buf))
  corrector.replace(node.loc.end, keyword_end_str(node, node_buf))
end

def keyword_begin_str(node, node_buf)

def keyword_begin_str(node, node_buf)
  if node_buf.source[node.loc.begin.end_pos] == "\n"
    'begin'
  else
    "begin\n#{' ' * (node.loc.column + configured_indentation_width)}"
  end
end

def keyword_end_str(node, node_buf)

def keyword_end_str(node, node_buf)
  if /[^\s)]/.match?(node_buf.source_line(node.loc.end.line))
    "\n#{' ' * node.loc.column}end"
  else
    'end'
  end
end

def message(_node)

def message(_node)
  style == :braces ? BRACES_MSG : KEYWORD_MSG
end

def on_or_asgn(node)

def on_or_asgn(node)
  _lhs, rhs = *node
  return unless bad_rhs?(rhs)
  add_offense(node.source_range) do |corrector|
    if style == :keyword
      keyword_autocorrect(rhs, corrector)
    else
      corrector.replace(rhs.loc.begin, '(')
      corrector.replace(rhs.loc.end, ')')
    end
  end
end