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