Class: RuboCop::Cop::Style::MultilineArrayBraceLayout

Inherits:
Cop
  • Object
show all
Defined in:
lib/rubocop/cop/style/multiline_array_brace_layout.rb

Overview

This cop checks that the closing brace in an array literal is symmetrical with respect to the opening brace and the array elements.

If an array's opening brace is on the same line as the first element of the array, then the closing brace should be on the same line as the last element of the array.

If an array's opening brace is on a separate line from the first element of the array, then the closing brace should be on the line after the last element of the array.

Examples:


# bad
[ :a,
  :b
]

# bad
[
  :a,
  :b ]

# good
[ :a,
  :b ]

#good
[
  :a,
  :b
]

Constant Summary collapse

SAME_LINE_MESSAGE =
'Closing array brace must be on the same line as ' \
'the last array element when opening brace is on the same line as ' \
'the first array element.'.freeze
NEW_LINE_MESSAGE =
'Closing array brace must be on the line after ' \
'the last array element when opening brace is on a separate line ' \
'from the first array element.'.freeze

Constants included from Util

Util::ASGN_NODES, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES, Util::STRING_ESCAPES, Util::STRING_ESCAPE_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods inherited from Cop

#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, inherited, #initialize, #join_force?, lint?, match?, #message, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version

Methods included from Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search_body

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, ends_its_line?, first_part_of_call_chain, interpret_string_escapes, line_range, move_pos, numeric_range_size, on_node, operator?, parentheses?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, to_string_literal, to_symbol_literal, within_node?

Methods included from PathUtil

hidden?, issue_deprecation_warning, match_path?, relative_path

Constructor Details

This class inherits a constructor from RuboCop::Cop::Cop

Instance Method Details

#autocorrect(node) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/rubocop/cop/style/multiline_array_brace_layout.rb', line 64

def autocorrect(node)
  if closing_brace_on_same_line?(node)
    lambda do |corrector|
      corrector.insert_before(node.loc.end, "\n".freeze)
    end
  else
    range = Parser::Source::Range.new(
      node.source_range.source_buffer,
      node.children.last.source_range.end_pos,
      node.loc.end.begin_pos)

    ->(corrector) { corrector.remove(range) }
  end
end

#on_array(node) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/rubocop/cop/style/multiline_array_brace_layout.rb', line 49

def on_array(node)
  return unless node.loc.begin # Ignore implicit arrays.
  return if node.children.empty? # Ignore empty arrays.

  if opening_brace_on_same_line?(node)
    return if closing_brace_on_same_line?(node)

    add_offense(node, :expression, SAME_LINE_MESSAGE)
  else
    return unless closing_brace_on_same_line?(node)

    add_offense(node, :expression, NEW_LINE_MESSAGE)
  end
end