lib/rubocop/cop/style/case_indentation.rb in rubocop-0.46.0 vs lib/rubocop/cop/style/case_indentation.rb in rubocop-0.47.0

- old
+ new

@@ -9,52 +9,56 @@ # It will register a separate offense for each misaligned *when*. class CaseIndentation < Cop include AutocorrectAlignment include ConfigurableEnforcedStyle - def on_case(case_node) - _condition, *whens, _else = *case_node + MSG = 'Indent `when` %s `%s`.'.freeze - 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) + def on_case(case_node) + case_node.each_when do |when_node| + check_when(when_node) end end private - 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 + def check_when(when_node) + when_column = when_node.loc.keyword.column + base_column = base_column(when_node.parent, style) + + if when_column == base_column + indentation_width correct_style_detected else - incorrect_style(when_node, case_node, base, pos, indent) + incorrect_style(when_node) end end - 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) + def indent_one_step? + cop_config['IndentOneStep'] + end + + def indentation_width + indent_one_step? ? configured_indentation_width : 0 + end + + def incorrect_style(when_node) + when_column = when_node.loc.keyword.column + base_column = base_column(when_node.parent, alternative_style) + + add_offense(when_node, :keyword, message(style)) do + if when_column == base_column opposite_style_detected else unrecognized_style_detected end end end - def parameter_name - 'IndentWhenRelativeTo' + def message(base) + depth = indent_one_step? ? 'one step more than' : 'as deep as' + + format(MSG, depth, base) end def base_column(case_node, base) case base when :case then case_node.location.keyword.column @@ -62,13 +66,16 @@ end end def autocorrect(node) whitespace = whitespace_range(node) + return false unless whitespace.source.strip.empty? - ->(corrector) { corrector.replace(whitespace, replacement(node)) } + lambda do |corrector| + corrector.replace(whitespace, replacement(node)) + end end def whitespace_range(node) when_column = node.location.keyword.column begin_pos = node.loc.keyword.begin_pos @@ -76,12 +83,14 @@ range_between(begin_pos - when_column, begin_pos) end def replacement(node) case_node = node.each_ancestor(:case).first - base_type = cop_config[parameter_name] == 'end' ? :end : :case + base_type = cop_config[style_parameter_name] == 'end' ? :end : :case + column = base_column(case_node, base_type) - column += configured_indentation_width if cop_config['IndentOneStep'] + column += indentation_width + ' ' * column end end end end