class RuboCop::Cop::Style::MultilineMemoization

This cop checks expressions wrapping styles for multiline memoization.

@example EnforcedStyle: keyword (default)

# bad
foo ||= (
  bar
  baz
)

# good
foo ||= begin
  bar
  baz
end

@example EnforcedStyle: braces

# bad
foo ||= begin
  bar
  baz
end

# good
foo ||= (
  bar
  baz
)

Constants

MSG

Public Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 46
def autocorrect(node)
  lambda do |corrector|
    if style == :keyword
      keyword_autocorrect(node, corrector)
    else
      corrector.replace(node.loc.begin, '(')
      corrector.replace(node.loc.end, ')')
    end
  end
end
on_or_asgn(node) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 38
def on_or_asgn(node)
  _lhs, rhs = *node

  return unless bad_rhs?(rhs)

  add_offense(rhs, location: node.source_range)
end

Private Instance Methods

bad_rhs?(rhs) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 59
def bad_rhs?(rhs)
  return false unless rhs.multiline?

  if style == :keyword
    rhs.begin_type?
  else
    rhs.kwbegin_type?
  end
end
keyword_autocorrect(node, corrector) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 69
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
keyword_begin_str(node, node_buf) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 75
def keyword_begin_str(node, node_buf)
  indent = config.for_cop('IndentationWidth')['Width'] || 2
  if node_buf.source[node.loc.begin.end_pos] == "\n"
    'begin'
  else
    "begin\n" + (' ' * (node.loc.column + indent))
  end
end
keyword_end_str(node, node_buf) click to toggle source
# File lib/rubocop/cop/style/multiline_memoization.rb, line 84
def keyword_end_str(node, node_buf)
  if node_buf.source_line(node.loc.end.line) =~ /[^\s\)]/
    "\n" + (' ' * node.loc.column) + 'end'
  else
    'end'
  end
end