class Rubocop::Cop::Style::BlockNesting

This cop checks for excessive nesting of conditional and looping constructs. Despite the cop’s name, blocks are not considered as a extra level of nesting.

The maximum level of nesting allowed is configurable.

Constants

NESTING_BLOCKS

Public Instance Methods

inspect(source_buffer, source, tokens, ast, comments) click to toggle source
# File lib/rubocop/cop/style/block_nesting.rb, line 15
def inspect(source_buffer, source, tokens, ast, comments)
  return unless ast
  max = BlockNesting.config['Max']
  check_nesting_level(ast, max, 0)
end

Private Instance Methods

check_nesting_level(node, max, current_level) click to toggle source
# File lib/rubocop/cop/style/block_nesting.rb, line 23
def check_nesting_level(node, max, current_level)
  if NESTING_BLOCKS.include?(node.type)
    unless node.loc.respond_to?(:keyword) &&
        node.loc.keyword.is?('elsif')
      current_level += 1
    end
    if current_level == max + 1
      add_offence(:convention, node.location.expression, message(max))
      return
    end
  end
  node.children.each do |child|
    if child.is_a?(Parser::AST::Node)
      check_nesting_level(child, max, current_level)
    end
  end
end
message(max) click to toggle source
# File lib/rubocop/cop/style/block_nesting.rb, line 41
def message(max)
  "Avoid more than #{max} levels of block nesting."
end