Module: Rubocop::Cop::Style::AutocorrectAlignment
- Included in:
- AlignArray, AlignParameters
- Defined in:
- lib/rubocop/cop/style/autocorrect_alignment.rb
Overview
This module does auto-correction of nodes that should just be moved to the left or to the right, amount being determined by the instance variable @column_delta.
Instance Method Summary collapse
- #autocorrect(node) ⇒ Object
- #check_alignment(items) ⇒ Object
- #each_line(expr) ⇒ Object
- #remove(range, corrector) ⇒ Object
- #start_of_line?(loc) ⇒ Boolean
Instance Method Details
#autocorrect(node) ⇒ Object
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/rubocop/cop/style/autocorrect_alignment.rb', line 23 def autocorrect(node) # We can't use the instance variable inside the lambda. That would # just give each lambda the same reference and they would all get # the last value of @column_delta. A local variable fixes the # problem. column_delta = @column_delta @corrections << lambda do |corrector| expr = node.loc.expression each_line(expr) do |line_begin_pos, line| starts_with_space = expr.source_buffer.source[line_begin_pos] =~ / / pos_to_remove = if column_delta > 0 || starts_with_space line_begin_pos else line_begin_pos - column_delta.abs end range = Parser::Source::Range.new(expr.source_buffer, pos_to_remove, pos_to_remove + column_delta.abs) if column_delta > 0 corrector.insert_before(range, ' ' * column_delta) else remove(range, corrector) end end end end |
#check_alignment(items) ⇒ Object
10 11 12 13 14 15 16 17 |
# File 'lib/rubocop/cop/style/autocorrect_alignment.rb', line 10 def check_alignment(items) items.each_cons(2) do |prev, current| if current.loc.line > prev.loc.line && start_of_line?(current.loc) @column_delta = items.first.loc.column - current.loc.column convention(current, :expression) if @column_delta != 0 end end end |
#each_line(expr) ⇒ Object
66 67 68 69 70 71 72 73 |
# File 'lib/rubocop/cop/style/autocorrect_alignment.rb', line 66 def each_line(expr) offset = 0 expr.source.each_line do |line| line_begin_pos = expr.begin_pos + offset yield line_begin_pos, line offset += line.length end end |
#remove(range, corrector) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/rubocop/cop/style/autocorrect_alignment.rb', line 53 def remove(range, corrector) original_stderr = $stderr $stderr = StringIO.new # Avoid error messages on console corrector.remove(range) rescue RuntimeError range = Parser::Source::Range.new(range.source_buffer, range.begin_pos + 1, range.end_pos + 1) retry if range.source =~ /^ +$/ ensure $stderr = original_stderr end |
#start_of_line?(loc) ⇒ Boolean
19 20 21 |
# File 'lib/rubocop/cop/style/autocorrect_alignment.rb', line 19 def start_of_line?(loc) loc.expression.source_line[0...loc.column] =~ /^\s*$/ end |