Class: RuboCop::Cop::Corrector

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/cop/corrector.rb

Overview

This class takes a source buffer and rewrite its source based on the different correction rules supplied.

Important! The nodes modified by the corrections should be part of the AST of the source_buffer.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(source_buffer, corrections = []) ⇒ Corrector

Returns a new instance of Corrector.

Examples:


class AndOrCorrector
  def initialize(node)
    @node = node
  end

  def call(corrector)
    replacement = (@node.type == :and ? '&&' : '||')
    corrector.replace(@node.loc.operator, replacement)
  end
end

corrections = [AndOrCorrector.new(node)]
corrector = Corrector.new(source_buffer, corrections)


33
34
35
36
37
38
39
40
41
42
43
# File 'lib/rubocop/cop/corrector.rb', line 33

def initialize(source_buffer, corrections = [])
  @source_buffer = source_buffer
  @corrections = corrections
  @source_rewriter = Parser::Source::Rewriter.new(source_buffer)

  @diagnostics = []
  # Don't print warnings to stderr if corrections conflict with each other
  @source_rewriter.diagnostics.consumer = lambda do |diagnostic|
    @diagnostics << diagnostic
  end
end

Instance Attribute Details

#correctionsObject (readonly)

Returns the value of attribute corrections.



45
46
47
# File 'lib/rubocop/cop/corrector.rb', line 45

def corrections
  @corrections
end

#diagnosticsObject (readonly)

Returns the value of attribute diagnostics.



45
46
47
# File 'lib/rubocop/cop/corrector.rb', line 45

def diagnostics
  @diagnostics
end

Instance Method Details

#insert_after(range, content) ⇒ Object

Inserts new code after the given source range.



85
86
87
# File 'lib/rubocop/cop/corrector.rb', line 85

def insert_after(range, content)
  @source_rewriter.insert_after(range, content)
end

#insert_before(range, content) ⇒ Object

Inserts new code before the given source range.



77
78
79
# File 'lib/rubocop/cop/corrector.rb', line 77

def insert_before(range, content)
  @source_rewriter.insert_before(range, content)
end

#remove(range) ⇒ Object

Removes the source range.



69
70
71
# File 'lib/rubocop/cop/corrector.rb', line 69

def remove(range)
  @source_rewriter.remove(range)
end

#remove_leading(range, size) ⇒ Object

Removes size characters from the beginning of the given range. If size is greater than the size of range, the removed region can overrun the end of range.



114
115
116
117
118
119
# File 'lib/rubocop/cop/corrector.rb', line 114

def remove_leading(range, size)
  to_remove = Parser::Source::Range.new(range.source_buffer,
                                        range.begin_pos,
                                        range.begin_pos + size)
  @source_rewriter.remove(to_remove)
end

#remove_preceding(range, size) ⇒ Object

Removes size characters prior to the source range.



101
102
103
104
105
106
# File 'lib/rubocop/cop/corrector.rb', line 101

def remove_preceding(range, size)
  to_remove = Parser::Source::Range.new(range.source_buffer,
                                        range.begin_pos - size,
                                        range.begin_pos)
  @source_rewriter.remove(to_remove)
end

#remove_trailing(range, size) ⇒ Object

Removes size characters from the end of the given range. If size is greater than the size of range, the removed region can overrun the beginning of range.



127
128
129
130
131
132
# File 'lib/rubocop/cop/corrector.rb', line 127

def remove_trailing(range, size)
  to_remove = Parser::Source::Range.new(range.source_buffer,
                                        range.end_pos - size,
                                        range.end_pos)
  @source_rewriter.remove(to_remove)
end

#replace(range, content) ⇒ Object

Replaces the code of the source range range with content.



93
94
95
# File 'lib/rubocop/cop/corrector.rb', line 93

def replace(range, content)
  @source_rewriter.replace(range, content)
end

#rewriteString

Does the actual rewrite and returns string corresponding to the rewritten source.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rubocop/cop/corrector.rb', line 51

def rewrite
  # rubocop:disable Lint/HandleExceptions
  @corrections.each do |correction|
    begin
      @source_rewriter.transaction do
        correction.call(self)
      end
    rescue ::Parser::ClobberingError
    end
  end
  # rubocop:enable Lint/HandleExceptions

  @source_rewriter.process
end