Class: RuboCop::Cop::Corrector
- Inherits:
-
Object
- Object
- RuboCop::Cop::Corrector
- 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
-
#corrections ⇒ Object
readonly
Returns the value of attribute corrections.
-
#diagnostics ⇒ Object
readonly
Returns the value of attribute diagnostics.
Instance Method Summary collapse
-
#initialize(source_buffer, corrections = []) ⇒ Corrector
constructor
A new instance of Corrector.
-
#insert_after(range, content) ⇒ Object
Inserts new code after the given source range.
-
#insert_before(range, content) ⇒ Object
Inserts new code before the given source range.
-
#remove(range) ⇒ Object
Removes the source range.
-
#remove_leading(range, size) ⇒ Object
Removes ‘size` characters from the beginning of the given range.
-
#remove_preceding(range, size) ⇒ Object
Removes ‘size` characters prior to the source range.
-
#remove_trailing(range, size) ⇒ Object
Removes ‘size` characters from the end of the given range.
-
#replace(range, content) ⇒ Object
Replaces the code of the source range ‘range` with `content`.
-
#rewrite ⇒ String
Does the actual rewrite and returns string corresponding to the rewritten source.
Constructor Details
#initialize(source_buffer, corrections = []) ⇒ Corrector
Returns a new instance of Corrector.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/rubocop/cop/corrector.rb', line 33 def initialize(source_buffer, corrections = []) @source_buffer = source_buffer raise 'source_buffer should be a Parser::Source::Buffer' unless \ source_buffer.is_a? Parser::Source::Buffer @corrections = corrections @source_rewriter = Parser::Source::TreeRewriter.new( source_buffer, different_replacements: :raise, swallowed_insertions: :raise, crossing_deletions: :accept ) @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
#corrections ⇒ Object (readonly)
Returns the value of attribute corrections.
53 54 55 |
# File 'lib/rubocop/cop/corrector.rb', line 53 def corrections @corrections end |
#diagnostics ⇒ Object (readonly)
Returns the value of attribute diagnostics.
53 54 55 |
# File 'lib/rubocop/cop/corrector.rb', line 53 def diagnostics @diagnostics end |
Instance Method Details
#insert_after(range, content) ⇒ Object
Inserts new code after the given source range.
99 100 101 102 |
# File 'lib/rubocop/cop/corrector.rb', line 99 def insert_after(range, content) validate_range range @source_rewriter.insert_after(range, content) end |
#insert_before(range, content) ⇒ Object
Inserts new code before the given source range.
85 86 87 88 89 90 91 92 93 |
# File 'lib/rubocop/cop/corrector.rb', line 85 def insert_before(range, content) validate_range range # TODO: Fix Cops using bad ranges instead if range.end_pos > @source_buffer.source.size range = range.with(end_pos: @source_buffer.source.size) end @source_rewriter.insert_before(range, content) end |
#remove(range) ⇒ Object
Removes the source range.
76 77 78 79 |
# File 'lib/rubocop/cop/corrector.rb', line 76 def remove(range) validate_range 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`.
131 132 133 134 135 136 137 |
# File 'lib/rubocop/cop/corrector.rb', line 131 def remove_leading(range, size) validate_range range 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.
117 118 119 120 121 122 123 |
# File 'lib/rubocop/cop/corrector.rb', line 117 def remove_preceding(range, size) validate_range range 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`.
145 146 147 148 149 150 151 |
# File 'lib/rubocop/cop/corrector.rb', line 145 def remove_trailing(range, size) validate_range range 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`.
108 109 110 111 |
# File 'lib/rubocop/cop/corrector.rb', line 108 def replace(range, content) validate_range range @source_rewriter.replace(range, content) end |
#rewrite ⇒ String
Does the actual rewrite and returns string corresponding to the rewritten source.
59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/rubocop/cop/corrector.rb', line 59 def rewrite @corrections.each do |correction| begin @source_rewriter.transaction do correction.call(self) end rescue ErrorWithAnalyzedFileLocation => e raise e unless e.cause.is_a?(::Parser::ClobberingError) end end @source_rewriter.process end |