class RuboCop::Cop::Metrics::BlockNesting

The maximum level of nesting allowed is configurable.
calculation as well.
counted towards the nesting level. Set them to ‘true` to include these in the nesting level
options. When both are set to `false` (the default) blocks and modifier forms are not
You can configure if blocks are considered using the `CountBlocks` and `CountModifierForms`
Checks for excessive nesting of conditional and looping constructs.

def check_nesting_level(node, max, current_level)

def check_nesting_level(node, max, current_level)
  if consider_node?(node)
    current_level += 1 if count_if_block?(node)
    if current_level > max
      self.max = current_level
      unless part_of_ignored_node?(node)
        add_offense(node, message: message(max)) { ignore_node(node) }
      end
    end
  end
  node.each_child_node do |child_node|
    check_nesting_level(child_node, max, current_level)
  end
end

def consider_node?(node)

def consider_node?(node)
  return true if NESTING_BLOCKS.include?(node.type)
  count_blocks? && (node.block_type? || node.numblock_type?)
end

def count_blocks?

def count_blocks?
  cop_config.fetch('CountBlocks', false)
end

def count_if_block?(node)

def count_if_block?(node)
  return true unless node.if_type?
  return false if node.elsif?
  return count_modifier_forms? if node.modifier_form?
  true
end

def count_modifier_forms?

def count_modifier_forms?
  cop_config.fetch('CountModifierForms', false)
end

def message(max)

def message(max)
  "Avoid more than #{max} levels of block nesting."
end

def on_new_investigation

def on_new_investigation
  return if processed_source.blank?
  max = cop_config['Max']
  check_nesting_level(processed_source.ast, max, 0)
end