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