lib/rubocop/cop/corrector.rb in rubocop-0.57.2 vs lib/rubocop/cop/corrector.rb in rubocop-0.58.0
- old
+ new
@@ -30,10 +30,12 @@
#
# corrections = [AndOrCorrector.new(node)]
# corrector = Corrector.new(source_buffer, corrections)
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,
@@ -70,18 +72,20 @@
# Removes the source range.
#
# @param [Parser::Source::Range] range
def remove(range)
+ validate_range range
@source_rewriter.remove(range)
end
# Inserts new code before the given source range.
#
# @param [Parser::Source::Range] range
# @param [String] content
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
@@ -91,26 +95,29 @@
# Inserts new code after the given source range.
#
# @param [Parser::Source::Range] range
# @param [String] content
def insert_after(range, content)
+ validate_range range
@source_rewriter.insert_after(range, content)
end
# Replaces the code of the source range `range` with `content`.
#
# @param [Parser::Source::Range] range
# @param [String] content
def replace(range, content)
+ validate_range range
@source_rewriter.replace(range, content)
end
# Removes `size` characters prior to the source range.
#
# @param [Parser::Source::Range] range
# @param [Integer] size
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
@@ -120,10 +127,11 @@
# overrun the end of `range`.
#
# @param [Parser::Source::Range] range
# @param [Integer] size
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
@@ -133,13 +141,30 @@
# overrun the beginning of `range`.
#
# @param [Parser::Source::Range] range
# @param [Integer] size
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
+
+ private
+
+ # :nodoc:
+ def validate_range(range)
+ return if range.source_buffer == @source_buffer
+ unless range.source_buffer.is_a?(Parser::Source::Buffer)
+ # actually this should be enforced by parser gem
+ raise 'Corrector expected range source buffer to be a '\
+ "Parser::Source::Buffer, but got #{range.source_buffer.class}"
+ end
+ raise "Correction target buffer #{range.source_buffer.object_id} "\
+ "name:#{range.source_buffer.name.inspect}"\
+ " is not current #{@source_buffer.object_id} "\
+ "name:#{@source_buffer.name.inspect} under investigation"
end
end
end
end