Class: Parser::Source::Rewriter
- Inherits:
-
Object
- Object
- Parser::Source::Rewriter
- Defined in:
- lib/parser/source/rewriter.rb
Defined Under Namespace
Classes: Action
Instance Attribute Summary collapse
-
#diagnostics ⇒ Object
Returns the value of attribute diagnostics.
Instance Method Summary collapse
- #append(action) ⇒ Object private
- #clobber(range) ⇒ Object private
- #clobbered?(range) ⇒ Boolean private
-
#initialize(source_buffer) ⇒ Rewriter
constructor
A new instance of Rewriter.
- #insert_after(range, content) ⇒ Object
- #insert_before(range, content) ⇒ Object
- #process ⇒ Object
- #remove(range) ⇒ Object
- #replace(range, content) ⇒ Object
Constructor Details
#initialize(source_buffer) ⇒ Rewriter
Returns a new instance of Rewriter.
7 8 9 10 11 12 13 14 15 16 |
# File 'lib/parser/source/rewriter.rb', line 7 def initialize(source_buffer) @diagnostics = Diagnostic::Engine.new @diagnostics.consumer = lambda do |diag| $stderr.puts diag.render end @source_buffer = source_buffer @queue = [] @clobber = 0 end |
Instance Attribute Details
#diagnostics ⇒ Object
Returns the value of attribute diagnostics.
5 6 7 |
# File 'lib/parser/source/rewriter.rb', line 5 def diagnostics @diagnostics end |
Instance Method Details
#append(action) ⇒ Object (private)
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/parser/source/rewriter.rb', line 53 def append(action) if (clobber_action = clobbered?(action.range)) # cannot replace 3 characters with "foobar" diagnostic = Diagnostic.new(:error, "cannot #{action}", action.range) @diagnostics.process(diagnostic) # clobbered by: remove 3 characters diagnostic = Diagnostic.new(:note, "clobbered by: #{clobber_action}", clobber_action.range) @diagnostics.process(diagnostic) else clobber(action.range) @queue << action end self end |
#clobber(range) ⇒ Object (private)
75 76 77 |
# File 'lib/parser/source/rewriter.rb', line 75 def clobber(range) @clobber |= (2 ** range.size - 1) << range.begin_pos end |
#clobbered?(range) ⇒ Boolean (private)
79 80 81 82 83 84 85 |
# File 'lib/parser/source/rewriter.rb', line 79 def clobbered?(range) if @clobber & ((2 ** range.size - 1) << range.begin_pos) != 0 @queue.find do |action| action.range.to_a & range.to_a end end end |
#insert_after(range, content) ⇒ Object
26 27 28 |
# File 'lib/parser/source/rewriter.rb', line 26 def insert_after(range, content) append Rewriter::Action.new(range.end, content) end |
#insert_before(range, content) ⇒ Object
22 23 24 |
# File 'lib/parser/source/rewriter.rb', line 22 def insert_before(range, content) append Rewriter::Action.new(range.begin, content) end |
#process ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/parser/source/rewriter.rb', line 34 def process adjustment = 0 source = @source_buffer.source.dup @queue.sort_by { |action| action.range.begin_pos }. each do |action| begin_pos = action.range.begin_pos + adjustment end_pos = begin_pos + action.range.length source[begin_pos...end_pos] = action.replacement adjustment += (action.replacement.length - action.range.length) end source end |