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)

Parameters:

  • source_buffer (Parser::Source::Buffer)
  • corrections (Array(#call)) (defaults to: [])

    Array of Objects that respond to #call. They will receive the corrector itself and should use its method to modify the source.



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.

Parameters:

  • range (Parser::Source::Range)
  • content (String)


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.

Parameters:

  • range (Parser::Source::Range)
  • content (String)


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.

Parameters:

  • range (Parser::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`.

Parameters:

  • range (Parser::Source::Range)
  • size (Integer)


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.

Parameters:

  • range (Parser::Source::Range)
  • size (Integer)


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`.

Parameters:

  • range (Parser::Source::Range)
  • size (Integer)


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`.

Parameters:

  • range (Parser::Source::Range)
  • content (String)


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.

Returns:

  • (String)


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