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

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

Returns:

  • (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