parser 2.4.0.2 → 2.5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/CHANGELOG.md +35 -1
- data/Gemfile +2 -0
- data/README.md +1 -2
- data/Rakefile +2 -1
- data/bin/ruby-parse +2 -1
- data/bin/ruby-rewrite +2 -1
- data/lib/gauntlet_parser.rb +2 -0
- data/lib/parser.rb +16 -17
- data/lib/parser/all.rb +2 -0
- data/lib/parser/ast/node.rb +2 -0
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/base.rb +6 -12
- data/lib/parser/builders/default.rb +28 -47
- data/lib/parser/clobbering_error.rb +2 -0
- data/lib/parser/context.rb +42 -0
- data/lib/parser/current.rb +4 -20
- data/lib/parser/deprecation.rb +13 -0
- data/lib/parser/diagnostic.rb +3 -3
- data/lib/parser/diagnostic/engine.rb +2 -0
- data/lib/parser/lexer.rl +122 -60
- data/lib/parser/lexer/dedenter.rb +2 -0
- data/lib/parser/lexer/explanation.rb +2 -0
- data/lib/parser/lexer/literal.rb +4 -9
- data/lib/parser/lexer/stack_state.rb +4 -1
- data/lib/parser/macruby.y +32 -17
- data/lib/parser/messages.rb +14 -0
- data/lib/parser/meta.rb +2 -0
- data/lib/parser/rewriter.rb +30 -44
- data/lib/parser/ruby18.y +20 -13
- data/lib/parser/ruby19.y +32 -17
- data/lib/parser/ruby20.y +33 -18
- data/lib/parser/ruby21.y +32 -17
- data/lib/parser/ruby22.y +32 -17
- data/lib/parser/ruby23.y +32 -17
- data/lib/parser/ruby24.y +63 -46
- data/lib/parser/ruby25.y +72 -48
- data/lib/parser/rubymotion.y +33 -18
- data/lib/parser/runner.rb +4 -7
- data/lib/parser/runner/ruby_parse.rb +10 -0
- data/lib/parser/runner/ruby_rewrite.rb +2 -0
- data/lib/parser/source/buffer.rb +19 -24
- data/lib/parser/source/comment.rb +2 -0
- data/lib/parser/source/comment/associator.rb +2 -0
- data/lib/parser/source/map.rb +2 -0
- data/lib/parser/source/map/collection.rb +2 -0
- data/lib/parser/source/map/condition.rb +2 -0
- data/lib/parser/source/map/constant.rb +2 -0
- data/lib/parser/source/map/definition.rb +2 -0
- data/lib/parser/source/map/for.rb +2 -0
- data/lib/parser/source/map/heredoc.rb +2 -0
- data/lib/parser/source/map/keyword.rb +2 -0
- data/lib/parser/source/map/objc_kwarg.rb +2 -0
- data/lib/parser/source/map/operator.rb +2 -0
- data/lib/parser/source/map/rescue_body.rb +2 -0
- data/lib/parser/source/map/send.rb +2 -0
- data/lib/parser/source/map/ternary.rb +2 -0
- data/lib/parser/source/map/variable.rb +2 -0
- data/lib/parser/source/range.rb +81 -13
- data/lib/parser/source/rewriter.rb +48 -10
- data/lib/parser/source/rewriter/action.rb +2 -0
- data/lib/parser/source/tree_rewriter.rb +301 -0
- data/lib/parser/source/tree_rewriter/action.rb +133 -0
- data/lib/parser/static_environment.rb +2 -0
- data/lib/parser/syntax_error.rb +2 -0
- data/lib/parser/tree_rewriter.rb +133 -0
- data/lib/parser/version.rb +3 -1
- data/parser.gemspec +4 -1
- data/test/bug_163/fixtures/input.rb +2 -0
- data/test/bug_163/fixtures/output.rb +2 -0
- data/test/bug_163/rewriter.rb +2 -0
- data/test/helper.rb +7 -7
- data/test/parse_helper.rb +57 -10
- data/test/racc_coverage_helper.rb +2 -0
- data/test/test_base.rb +2 -0
- data/test/test_current.rb +2 -4
- data/test/test_diagnostic.rb +3 -1
- data/test/test_diagnostic_engine.rb +2 -0
- data/test/test_encoding.rb +61 -49
- data/test/test_lexer.rb +164 -77
- data/test/test_lexer_stack_state.rb +2 -0
- data/test/test_parse_helper.rb +8 -8
- data/test/test_parser.rb +613 -51
- data/test/test_runner_rewrite.rb +47 -0
- data/test/test_source_buffer.rb +22 -10
- data/test/test_source_comment.rb +2 -0
- data/test/test_source_comment_associator.rb +2 -0
- data/test/test_source_map.rb +2 -0
- data/test/test_source_range.rb +92 -45
- data/test/test_source_rewriter.rb +3 -1
- data/test/test_source_rewriter_action.rb +2 -0
- data/test/test_source_tree_rewriter.rb +177 -0
- data/test/test_static_environment.rb +2 -0
- data/test/using_tree_rewriter/fixtures/input.rb +3 -0
- data/test/using_tree_rewriter/fixtures/output.rb +3 -0
- data/test/using_tree_rewriter/using_tree_rewriter.rb +9 -0
- metadata +21 -10
- data/lib/parser/compatibility/ruby1_8.rb +0 -20
- data/lib/parser/compatibility/ruby1_9.rb +0 -32
- data/test/bug_163/test_runner_rewrite.rb +0 -35
data/lib/parser/runner.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'benchmark'
|
2
4
|
require 'find'
|
3
5
|
require 'optparse'
|
@@ -176,9 +178,7 @@ module Parser
|
|
176
178
|
|
177
179
|
def process_fragments
|
178
180
|
@fragments.each_with_index do |fragment, index|
|
179
|
-
|
180
|
-
fragment = fragment.dup.force_encoding(@parser.default_encoding)
|
181
|
-
end
|
181
|
+
fragment = fragment.dup.force_encoding(@parser.default_encoding)
|
182
182
|
|
183
183
|
buffer = Source::Buffer.new("(fragment:#{index})")
|
184
184
|
buffer.source = fragment
|
@@ -189,10 +189,7 @@ module Parser
|
|
189
189
|
|
190
190
|
def process_files
|
191
191
|
@files.each do |filename|
|
192
|
-
source = File.read(filename)
|
193
|
-
if source.respond_to? :force_encoding
|
194
|
-
source.force_encoding(@parser.default_encoding)
|
195
|
-
end
|
192
|
+
source = File.read(filename).force_encoding(@parser.default_encoding)
|
196
193
|
|
197
194
|
buffer = Parser::Source::Buffer.new(filename)
|
198
195
|
|
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'parser/runner'
|
2
4
|
require 'parser/lexer/explanation'
|
5
|
+
require 'json'
|
3
6
|
|
4
7
|
module Parser
|
5
8
|
|
@@ -94,6 +97,7 @@ module Parser
|
|
94
97
|
|
95
98
|
@locate = false
|
96
99
|
@emit_ruby = false
|
100
|
+
@emit_json = false
|
97
101
|
end
|
98
102
|
|
99
103
|
private
|
@@ -118,6 +122,10 @@ module Parser
|
|
118
122
|
opts.on '--emit-ruby', 'Emit S-expressions as valid Ruby code' do
|
119
123
|
@emit_ruby = true
|
120
124
|
end
|
125
|
+
|
126
|
+
opts.on '--emit-json', 'Emit S-expressions as valid JSON' do
|
127
|
+
@emit_json = true
|
128
|
+
end
|
121
129
|
end
|
122
130
|
|
123
131
|
def process_all_input
|
@@ -136,6 +144,8 @@ module Parser
|
|
136
144
|
elsif !@benchmark
|
137
145
|
if @emit_ruby
|
138
146
|
puts ast.inspect
|
147
|
+
elsif @emit_json
|
148
|
+
puts JSON.generate(ast.to_sexp_array)
|
139
149
|
else
|
140
150
|
puts ast.to_s
|
141
151
|
end
|
data/lib/parser/source/buffer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: ascii-8bit
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Parser
|
4
5
|
module Source
|
@@ -28,7 +29,7 @@ module Parser
|
|
28
29
|
# @api private
|
29
30
|
#
|
30
31
|
ENCODING_RE =
|
31
|
-
|
32
|
+
/\A\#\s*(en)?coding\s*[:=]\s*
|
32
33
|
(
|
33
34
|
# Special-case: there's a UTF8-MAC encoding.
|
34
35
|
(utf8-mac)
|
@@ -63,7 +64,7 @@ module Parser
|
|
63
64
|
end
|
64
65
|
|
65
66
|
if (result = ENCODING_RE.match(encoding_line))
|
66
|
-
Encoding.find(result[
|
67
|
+
Encoding.find(result[3] || result[4] || result[6])
|
67
68
|
else
|
68
69
|
nil
|
69
70
|
end
|
@@ -156,13 +157,11 @@ module Parser
|
|
156
157
|
# @return [String]
|
157
158
|
#
|
158
159
|
def source=(input)
|
159
|
-
if
|
160
|
-
|
161
|
-
input = self.class.reencode_string(input)
|
160
|
+
input = input.dup if input.frozen?
|
161
|
+
input = self.class.reencode_string(input)
|
162
162
|
|
163
|
-
|
164
|
-
|
165
|
-
end
|
163
|
+
unless input.valid_encoding?
|
164
|
+
raise EncodingError, "invalid byte sequence in #{input.encoding.name}"
|
166
165
|
end
|
167
166
|
|
168
167
|
self.raw_source = input
|
@@ -182,8 +181,7 @@ module Parser
|
|
182
181
|
|
183
182
|
@source = input.gsub("\r\n".freeze, "\n".freeze).freeze
|
184
183
|
|
185
|
-
if
|
186
|
-
!@source.ascii_only? &&
|
184
|
+
if !@source.ascii_only? &&
|
187
185
|
@source.encoding != Encoding::UTF_32LE &&
|
188
186
|
@source.encoding != Encoding::BINARY
|
189
187
|
@slice_source = @source.encode(Encoding::UTF_32LE)
|
@@ -246,7 +244,7 @@ module Parser
|
|
246
244
|
def source_lines
|
247
245
|
@lines ||= begin
|
248
246
|
lines = @source.lines.to_a
|
249
|
-
lines << '' if @source.end_with?("\n".freeze)
|
247
|
+
lines << ''.dup if @source.end_with?("\n".freeze)
|
250
248
|
|
251
249
|
lines.each do |line|
|
252
250
|
line.chomp!("\n".freeze)
|
@@ -288,6 +286,13 @@ module Parser
|
|
288
286
|
end
|
289
287
|
end
|
290
288
|
|
289
|
+
##
|
290
|
+
# @return [Range] A range covering the whole source
|
291
|
+
#
|
292
|
+
def source_range
|
293
|
+
@source_range ||= Range.new(self, 0, source.size)
|
294
|
+
end
|
295
|
+
|
291
296
|
##
|
292
297
|
# Number of last line in the buffer
|
293
298
|
#
|
@@ -312,19 +317,9 @@ module Parser
|
|
312
317
|
@line_begins
|
313
318
|
end
|
314
319
|
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
line_begins.bsearch do |line, line_begin|
|
319
|
-
line_begin <= position
|
320
|
-
end
|
321
|
-
end
|
322
|
-
else
|
323
|
-
def line_for(position)
|
324
|
-
# Slower O(n) variant for Ruby <2.0.
|
325
|
-
line_begins.find do |line, line_begin|
|
326
|
-
line_begin <= position
|
327
|
-
end
|
320
|
+
def line_for(position)
|
321
|
+
line_begins.bsearch do |line, line_begin|
|
322
|
+
line_begin <= position
|
328
323
|
end
|
329
324
|
end
|
330
325
|
end
|
data/lib/parser/source/map.rb
CHANGED
data/lib/parser/source/range.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Parser
|
2
4
|
module Source
|
3
5
|
|
@@ -22,6 +24,8 @@ module Parser
|
|
22
24
|
# @api public
|
23
25
|
#
|
24
26
|
class Range
|
27
|
+
include Comparable
|
28
|
+
|
25
29
|
attr_reader :source_buffer
|
26
30
|
attr_reader :begin_pos, :end_pos
|
27
31
|
|
@@ -49,7 +53,7 @@ module Parser
|
|
49
53
|
# of this range.
|
50
54
|
#
|
51
55
|
def begin
|
52
|
-
|
56
|
+
with(end_pos: @begin_pos)
|
53
57
|
end
|
54
58
|
|
55
59
|
##
|
@@ -57,7 +61,7 @@ module Parser
|
|
57
61
|
# of this range.
|
58
62
|
#
|
59
63
|
def end
|
60
|
-
|
64
|
+
with(begin_pos: @end_pos)
|
61
65
|
end
|
62
66
|
|
63
67
|
##
|
@@ -165,12 +169,30 @@ module Parser
|
|
165
169
|
[@source_buffer.name, line, column + 1].join(':')
|
166
170
|
end
|
167
171
|
|
172
|
+
##
|
173
|
+
# @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos
|
174
|
+
# @return [Range] the same range as this range but with the given end point(s) changed
|
175
|
+
# to the given value(s).
|
176
|
+
#
|
177
|
+
def with(begin_pos: @begin_pos, end_pos: @end_pos)
|
178
|
+
Range.new(@source_buffer, begin_pos, end_pos)
|
179
|
+
end
|
180
|
+
|
181
|
+
##
|
182
|
+
# @param [Hash] Endpoint(s) to change, any combination of :begin_pos or :end_pos
|
183
|
+
# @return [Range] the same range as this range but with the given end point(s) adjusted
|
184
|
+
# by the given amount(s)
|
185
|
+
#
|
186
|
+
def adjust(begin_pos: 0, end_pos: 0)
|
187
|
+
Range.new(@source_buffer, @begin_pos + begin_pos, @end_pos + end_pos)
|
188
|
+
end
|
189
|
+
|
168
190
|
##
|
169
191
|
# @param [Integer] new_size
|
170
192
|
# @return [Range] a range beginning at the same point as this range and length `new_size`.
|
171
193
|
#
|
172
194
|
def resize(new_size)
|
173
|
-
|
195
|
+
with(end_pos: @begin_pos + new_size)
|
174
196
|
end
|
175
197
|
|
176
198
|
##
|
@@ -197,19 +219,66 @@ module Parser
|
|
197
219
|
end
|
198
220
|
|
199
221
|
##
|
222
|
+
# Return `true` iff this range and `other` are disjoint.
|
223
|
+
#
|
224
|
+
# Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
|
225
|
+
#
|
200
226
|
# @param [Range] other
|
201
|
-
# @return [Boolean]
|
227
|
+
# @return [Boolean]
|
202
228
|
#
|
203
229
|
def disjoint?(other)
|
204
|
-
|
230
|
+
if empty? && other.empty?
|
231
|
+
@begin_pos != other.begin_pos
|
232
|
+
else
|
233
|
+
@begin_pos >= other.end_pos || other.begin_pos >= @end_pos
|
234
|
+
end
|
205
235
|
end
|
206
236
|
|
207
237
|
##
|
238
|
+
# Return `true` iff this range is not disjoint from `other`.
|
239
|
+
#
|
208
240
|
# @param [Range] other
|
209
241
|
# @return [Boolean] `true` if this range and `other` overlap
|
210
242
|
#
|
211
243
|
def overlaps?(other)
|
212
|
-
|
244
|
+
!disjoint?(other)
|
245
|
+
end
|
246
|
+
|
247
|
+
##
|
248
|
+
# Returns true iff this range contains (strictly) `other`.
|
249
|
+
#
|
250
|
+
# Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
|
251
|
+
#
|
252
|
+
# @param [Range] other
|
253
|
+
# @return [Boolean]
|
254
|
+
#
|
255
|
+
def contains?(other)
|
256
|
+
(other.begin_pos <=> @begin_pos) + (@end_pos <=> other.end_pos) >= (other.empty? ? 2 : 1)
|
257
|
+
end
|
258
|
+
|
259
|
+
##
|
260
|
+
# Return `other.contains?(self)`
|
261
|
+
#
|
262
|
+
# Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
|
263
|
+
#
|
264
|
+
# @param [Range] other
|
265
|
+
# @return [Boolean]
|
266
|
+
#
|
267
|
+
def contained?(other)
|
268
|
+
other.contains?(self)
|
269
|
+
end
|
270
|
+
|
271
|
+
##
|
272
|
+
# Returns true iff both ranges intersect and also have different elements from one another.
|
273
|
+
#
|
274
|
+
# Two ranges must be one and only one of ==, disjoint?, contains?, contained? or crossing?
|
275
|
+
#
|
276
|
+
# @param [Range] other
|
277
|
+
# @return [Boolean]
|
278
|
+
#
|
279
|
+
def crossing?(other)
|
280
|
+
return false unless overlaps?(other)
|
281
|
+
(@begin_pos <=> other.begin_pos) * (@end_pos <=> other.end_pos) == 1
|
213
282
|
end
|
214
283
|
|
215
284
|
##
|
@@ -220,14 +289,13 @@ module Parser
|
|
220
289
|
end
|
221
290
|
|
222
291
|
##
|
223
|
-
#
|
224
|
-
# @return [Boolean]
|
292
|
+
# Compare ranges, first by begin_pos, then by end_pos.
|
225
293
|
#
|
226
|
-
def
|
227
|
-
other.is_a?(Range) &&
|
228
|
-
@source_buffer == other.source_buffer
|
229
|
-
|
230
|
-
|
294
|
+
def <=>(other)
|
295
|
+
return nil unless other.is_a?(::Parser::Source::Range) &&
|
296
|
+
@source_buffer == other.source_buffer
|
297
|
+
(@begin_pos <=> other.begin_pos).nonzero? ||
|
298
|
+
(@end_pos <=> other.end_pos)
|
231
299
|
end
|
232
300
|
|
233
301
|
##
|
@@ -1,18 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Parser
|
2
4
|
module Source
|
3
5
|
|
4
6
|
##
|
5
|
-
# {Rewriter}
|
6
|
-
# It schedules code updates to be performed in the correct order and
|
7
|
-
# verifies that no two updates _clobber_ each other, that is, attempt to
|
8
|
-
# modify the same section of code. (However, if two updates modify the
|
9
|
-
# same section in exactly the same way, they are merged.)
|
7
|
+
# {Rewriter} is deprecated. Use {TreeRewriter} instead.
|
10
8
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# the diagnostic engine. After that, an exception is raised.
|
9
|
+
# TreeRewriter has simplified semantics, and customizable policies
|
10
|
+
# with regards to clobbering. Please read the documentation.
|
14
11
|
#
|
15
|
-
#
|
12
|
+
# Keep in mind:
|
13
|
+
# - Rewriter was discarding the `end_pos` of the given range for `insert_before`,
|
14
|
+
# and the `begin_pos` for `insert_after`. These are meaningful in TreeRewriter.
|
15
|
+
# - TreeRewriter's wrap/insert_before/insert_after are multiple by default, while
|
16
|
+
# Rewriter would raise clobbering errors if the non '_multi' version was called.
|
17
|
+
# - The TreeRewriter policy closest to Rewriter's behavior is:
|
18
|
+
# different_replacements: :raise,
|
19
|
+
# swallowed_insertions: :raise,
|
20
|
+
# overlapping_deletions: :accept
|
16
21
|
#
|
17
22
|
# @!attribute [r] source_buffer
|
18
23
|
# @return [Source::Buffer]
|
@@ -21,6 +26,7 @@ module Parser
|
|
21
26
|
# @return [Diagnostic::Engine]
|
22
27
|
#
|
23
28
|
# @api public
|
29
|
+
# @deprecated Use {TreeRewriter}
|
24
30
|
#
|
25
31
|
class Rewriter
|
26
32
|
attr_reader :source_buffer
|
@@ -28,8 +34,10 @@ module Parser
|
|
28
34
|
|
29
35
|
##
|
30
36
|
# @param [Source::Buffer] source_buffer
|
37
|
+
# @deprecated Use {TreeRewriter}
|
31
38
|
#
|
32
39
|
def initialize(source_buffer)
|
40
|
+
self.class.warn_of_deprecation
|
33
41
|
@diagnostics = Diagnostic::Engine.new
|
34
42
|
@diagnostics.consumer = lambda do |diag|
|
35
43
|
$stderr.puts diag.render
|
@@ -54,6 +62,7 @@ module Parser
|
|
54
62
|
# @param [Range] range
|
55
63
|
# @return [Rewriter] self
|
56
64
|
# @raise [ClobberingError] when clobbering is detected
|
65
|
+
# @deprecated Use {TreeRewriter#remove}
|
57
66
|
#
|
58
67
|
def remove(range)
|
59
68
|
append Rewriter::Action.new(range, ''.freeze)
|
@@ -66,11 +75,27 @@ module Parser
|
|
66
75
|
# @param [String] content
|
67
76
|
# @return [Rewriter] self
|
68
77
|
# @raise [ClobberingError] when clobbering is detected
|
78
|
+
# @deprecated Use {TreeRewriter#insert_before}
|
69
79
|
#
|
70
80
|
def insert_before(range, content)
|
71
81
|
append Rewriter::Action.new(range.begin, content)
|
72
82
|
end
|
73
83
|
|
84
|
+
##
|
85
|
+
# Inserts new code before and after the given source range.
|
86
|
+
#
|
87
|
+
# @param [Range] range
|
88
|
+
# @param [String] before
|
89
|
+
# @param [String] after
|
90
|
+
# @return [Rewriter] self
|
91
|
+
# @raise [ClobberingError] when clobbering is detected
|
92
|
+
# @deprecated Use {TreeRewriter#wrap}
|
93
|
+
#
|
94
|
+
def wrap(range, before, after)
|
95
|
+
append Rewriter::Action.new(range.begin, before)
|
96
|
+
append Rewriter::Action.new(range.end, after)
|
97
|
+
end
|
98
|
+
|
74
99
|
##
|
75
100
|
# Inserts new code before the given source range by allowing other
|
76
101
|
# insertions at the same position.
|
@@ -87,6 +112,7 @@ module Parser
|
|
87
112
|
# @param [String] content
|
88
113
|
# @return [Rewriter] self
|
89
114
|
# @raise [ClobberingError] when clobbering is detected
|
115
|
+
# @deprecated Use {TreeRewriter#insert_before}
|
90
116
|
#
|
91
117
|
def insert_before_multi(range, content)
|
92
118
|
@insert_before_multi_order -= 1
|
@@ -100,6 +126,7 @@ module Parser
|
|
100
126
|
# @param [String] content
|
101
127
|
# @return [Rewriter] self
|
102
128
|
# @raise [ClobberingError] when clobbering is detected
|
129
|
+
# @deprecated Use {TreeRewriter#insert_after}
|
103
130
|
#
|
104
131
|
def insert_after(range, content)
|
105
132
|
append Rewriter::Action.new(range.end, content)
|
@@ -121,6 +148,7 @@ module Parser
|
|
121
148
|
# @param [String] content
|
122
149
|
# @return [Rewriter] self
|
123
150
|
# @raise [ClobberingError] when clobbering is detected
|
151
|
+
# @deprecated Use {TreeRewriter#insert_after}
|
124
152
|
#
|
125
153
|
def insert_after_multi(range, content)
|
126
154
|
@insert_after_multi_order += 1
|
@@ -134,6 +162,7 @@ module Parser
|
|
134
162
|
# @param [String] content
|
135
163
|
# @return [Rewriter] self
|
136
164
|
# @raise [ClobberingError] when clobbering is detected
|
165
|
+
# @deprecated Use {TreeRewriter#replace}
|
137
166
|
#
|
138
167
|
def replace(range, content)
|
139
168
|
append Rewriter::Action.new(range, content)
|
@@ -144,6 +173,7 @@ module Parser
|
|
144
173
|
# modified source as a new string.
|
145
174
|
#
|
146
175
|
# @return [String]
|
176
|
+
# @deprecated Use {TreeRewriter#process}
|
147
177
|
#
|
148
178
|
def process
|
149
179
|
if in_transaction?
|
@@ -181,6 +211,7 @@ module Parser
|
|
181
211
|
#
|
182
212
|
# @raise [RuntimeError] when no block is passed
|
183
213
|
# @raise [RuntimeError] when already in a transaction
|
214
|
+
# @deprecated Use {TreeRewriter#transaction}
|
184
215
|
#
|
185
216
|
def transaction
|
186
217
|
unless block_given?
|
@@ -392,7 +423,7 @@ module Parser
|
|
392
423
|
end
|
393
424
|
|
394
425
|
def merge_replacements(actions)
|
395
|
-
result = ''
|
426
|
+
result = ''.dup
|
396
427
|
prev_act = nil
|
397
428
|
|
398
429
|
actions.each do |act|
|
@@ -469,6 +500,13 @@ module Parser
|
|
469
500
|
def adjacent?(range1, range2)
|
470
501
|
range1.begin_pos <= range2.end_pos && range2.begin_pos <= range1.end_pos
|
471
502
|
end
|
503
|
+
|
504
|
+
DEPRECATION_WARNING = [
|
505
|
+
'Parser::Source::Rewriter is deprecated.',
|
506
|
+
'Please update your code to use Parser::Source::TreeRewriter instead'
|
507
|
+
].join("\n").freeze
|
508
|
+
|
509
|
+
extend Deprecation
|
472
510
|
end
|
473
511
|
|
474
512
|
end
|