class RuboCop::Cop::Style::HashAsLastArrayItem
[{ one: 1 }, { two: 2 }]
# good
[1, 2, one: 1, two: 2]
# good
[1, 2, { one: 1, two: 2 }]
# bad
@example EnforcedStyle: no_braces
[{ one: 1 }, { two: 2 }]
# good
[1, 2, { one: 1, two: 2 }]
# good
[1, 2, one: 1, two: 2]
# bad
@example EnforcedStyle: braces (default)
EnforcedStyle.
NOTE: This cop will ignore arrays where all items are hashes, regardless of
array item depending on configuration.
Checks for presence or absence of braces around hash literal as a last
def braces_style?
def braces_style? style == :braces end
def check_braces(node)
def check_braces(node) return if node.braces? add_offense(node, message: 'Wrap hash in `{` and `}`.') do |corrector| corrector.wrap(node, '{', '}') end end
def check_no_braces(node)
def check_no_braces(node) return unless node.braces? return if node.children.empty? # Empty hash cannot be "unbraced" add_offense(node, message: 'Omit the braces around the hash.') do |corrector| remove_last_element_trailing_comma(corrector, node.parent) corrector.remove(node.loc.begin) corrector.remove(node.loc.end) end end
def containing_array(hash_node)
def containing_array(hash_node) parent = hash_node.parent parent if parent&.array_type? end
def explicit_array?(array)
def explicit_array?(array) # an implicit array cannot have an "unbraced" hash array.square_brackets? end
def last_array_item?(array, node)
def last_array_item?(array, node) return false if array.child_nodes.all?(&:hash_type?) array.children.last.equal?(node) end
def on_hash(node)
def on_hash(node) return unless (array = containing_array(node)) return unless last_array_item?(array, node) && explicit_array?(array) if braces_style? check_braces(node) else check_no_braces(node) end end
def remove_last_element_trailing_comma(corrector, node)
def remove_last_element_trailing_comma(corrector, node) range = range_with_surrounding_space( range: node.children.last.source_range, side: :right ).end.resize(1) corrector.remove(range) if range.source == ',' end