123456789_123456789_123456789_123456789_123456789_

Class: RuboCop::Cop::ParenthesesCorrector

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, RangeHelp
Inherits: Object
Defined in: lib/rubocop/cop/correctors/parentheses_corrector.rb

Overview

This autocorrects parentheses

Constant Summary

Class Method Summary

RangeHelp - Extended

add_range, column_offset_between,
contents_range

A range containing only the contents of a literal with delimiters (e.g.

directions,
effective_column

Returns the column attribute of the range, except if the range is on the first line and there’s a byte order mark at the beginning of that line, in which case 1 is subtracted from the column value.

final_pos, move_pos, move_pos_str, range_between, range_by_whole_lines, range_with_comments, range_with_comments_and_lines, range_with_surrounding_comma, range_with_surrounding_space, source_range

Class Method Details

.add_heredoc_comma(corrector, node) (private)

Add a comma back after the heredoc identifier

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 74

def add_heredoc_comma(corrector, node)
  return unless heredoc?(node)

  corrector.insert_after(node.child_nodes.last, ',')
end

.correct(corrector, node)

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 12

def correct(corrector, node)
  corrector.remove(node.loc.begin)
  corrector.remove(node.loc.end)
  handle_orphaned_comma(corrector, node)

  return unless ternary_condition?(node) && next_char_is_question_mark?(node)

  corrector.insert_after(node.loc.end, ' ')
end

.extend_range_for_heredoc(node, range) (private)

If the node contains a heredoc, remove the comma too It’ll be added back in the right place later

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 64

def extend_range_for_heredoc(node, range)
  return range unless heredoc?(node)

  comma_line = range_by_whole_lines(node.loc.end, buffer: node.source_range.source_buffer)
  offset = comma_line.source.match(COMMA_REGEXP)[0]&.size || 0

  range.adjust(end_pos: offset)
end

.handle_orphaned_comma(corrector, node) (private)

If removing parentheses leaves a comma on its own line, remove all the whitespace preceding it to prevent a syntax error.

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 41

def handle_orphaned_comma(corrector, node)
  return unless only_closing_paren_before_comma?(node)

  range = extend_range_for_heredoc(node, parens_range(node))
  corrector.remove(range)

  add_heredoc_comma(corrector, node)
end

.heredoc?(node) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 80

def heredoc?(node)
  node.child_nodes.last.loc.is_a?(Parser::Source::Map::Heredoc)
end

.next_char_is_question_mark?(node) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 28

def next_char_is_question_mark?(node)
  node.loc.last_column == node.parent.loc.question.column
end

.only_closing_paren_before_comma?(node) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 32

def only_closing_paren_before_comma?(node)
  source_buffer = node.source_range.source_buffer
  line_range = source_buffer.line_range(node.loc.end.line)

  line_range.source.start_with?(/\s*\)\s*,/)
end

.parens_range(node) (private)

Get a range for the closing parenthesis and all whitespace to the left of it

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 51

def parens_range(node)
  range_with_surrounding_space(
    range: node.loc.end,
    buffer: node.source_range.source_buffer,
    side: :left,
    newlines: true,
    whitespace: true,
    continuations: true
  )
end

.ternary_condition?(node) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/correctors/parentheses_corrector.rb', line 24

def ternary_condition?(node)
  node.parent&.if_type? && node.parent.ternary?
end