class RuboCop::Cop::Style::CaseIndentation
This cop checks how the *when*s of a case expression are indented in relation to its case or end keyword.
It will register a separate offense for each misaligned when.
Public Instance Methods
on_case(case_node)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 14 def on_case(case_node) _condition, *whens, _else = *case_node base = style indent = cop_config['IndentOneStep'] base_column = base_column(case_node, base) whens.each do |when_node| check_when(when_node, case_node, base, indent, base_column) end end
Private Instance Methods
autocorrect(node)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 65 def autocorrect(node) whitespace = whitespace_range(node) return false unless whitespace.source.strip.empty? ->(corrector) { corrector.replace(whitespace, replacement(node)) } end
base_column(case_node, base)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 58 def base_column(case_node, base) case base when :case then case_node.location.keyword.column when :end then case_node.location.end.column end end
check_when(when_node, case_node, base, indent, base_column)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 28 def check_when(when_node, case_node, base, indent, base_column) pos = when_node.loc.keyword expected_column = base_column + (indent ? configured_indentation_width : 0) if pos.column == expected_column correct_style_detected else incorrect_style(when_node, case_node, base, pos, indent) end end
incorrect_style(when_node, case_node, base, pos, indent)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 39 def incorrect_style(when_node, case_node, base, pos, indent) msg = 'Indent `when` ' + if indent "one step more than `#{base}`." else "as deep as `#{base}`." end add_offense(when_node, pos, msg) do if pos.column == base_column(case_node, alternative_style) opposite_style_detected else unrecognized_style_detected end end end
parameter_name()
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 54 def parameter_name 'IndentWhenRelativeTo' end
replacement(node)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 81 def replacement(node) case_node = node.each_ancestor(:case).first base_type = cop_config[parameter_name] == 'end' ? :end : :case column = base_column(case_node, base_type) column += configured_indentation_width if cop_config['IndentOneStep'] ' ' * column end
whitespace_range(node)
click to toggle source
# File lib/rubocop/cop/style/case_indentation.rb, line 72 def whitespace_range(node) when_column = node.location.keyword.column begin_pos = node.loc.keyword.begin_pos Parser::Source::Range.new(node.source_range.source_buffer, begin_pos - when_column, begin_pos) end