class RuboCop::Cop::Style::InfiniteLoop

Use `Kernel#loop` for infinite loops.

@example

# bad
while true
  work
end

# good
loop do
  work
end

Constants

LEADING_SPACE
MSG

Public Instance Methods

on_until(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 29
def on_until(node)
  return unless node.condition.falsey_literal?

  add_offense(node, location: :keyword)
end
Also aliased as: on_until_post
on_until_post(node)
Alias for: on_until
on_while(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 23
def on_while(node)
  return unless node.condition.truthy_literal?

  add_offense(node, location: :keyword)
end
Also aliased as: on_while_post
on_while_post(node)
Alias for: on_while

Private Instance Methods

autocorrect(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 40
def autocorrect(node)
  if node.while_post_type? || node.until_post_type?
    replace_begin_end_with_modifier(node)
  elsif node.modifier_form?
    replace_source(node.source_range, modifier_replacement(node))
  else
    replace_source(non_modifier_range(node), 'loop do')
  end
end
configured_indent() click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 85
def configured_indent
  ' ' * config.for_cop('IndentationWidth')['Width']
end
modifier_replacement(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 63
def modifier_replacement(node)
  if node.single_line?
    'loop { ' + node.body.source + ' }'
  else
    indentation = node.body.loc.expression.source_line[LEADING_SPACE]

    ['loop do', node.body.source.gsub(/^/, configured_indent),
     'end'].join("\n#{indentation}")
  end
end
non_modifier_range(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 74
def non_modifier_range(node)
  start_range = node.loc.keyword.begin
  end_range = if node.do?
                node.loc.begin.end
              else
                node.condition.source_range.end
              end

  start_range.join(end_range)
end
replace_begin_end_with_modifier(node) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 50
def replace_begin_end_with_modifier(node)
  lambda do |corrector|
    corrector.replace(node.body.loc.begin, 'loop do')
    corrector.remove(node.body.loc.end.end.join(node.source_range.end))
  end
end
replace_source(range, replacement) click to toggle source
# File lib/rubocop/cop/style/infinite_loop.rb, line 57
def replace_source(range, replacement)
  lambda do |corrector|
    corrector.replace(range, replacement)
  end
end