parser 2.7.1.5 → 2.7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/parser/current.rb +1 -1
  3. data/lib/parser/meta.rb +2 -2
  4. data/lib/parser/ruby28.rb +8047 -0
  5. data/lib/parser/version.rb +1 -1
  6. data/parser.gemspec +1 -20
  7. metadata +7 -96
  8. data/.travis.yml +0 -41
  9. data/.yardopts +0 -21
  10. data/CHANGELOG.md +0 -1137
  11. data/CONTRIBUTING.md +0 -17
  12. data/Gemfile +0 -10
  13. data/LICENSE.txt +0 -25
  14. data/README.md +0 -309
  15. data/Rakefile +0 -167
  16. data/ci/run_rubocop_specs +0 -14
  17. data/doc/AST_FORMAT.md +0 -2284
  18. data/doc/CUSTOMIZATION.md +0 -37
  19. data/doc/INTERNALS.md +0 -21
  20. data/doc/css/.gitkeep +0 -0
  21. data/doc/css/common.css +0 -68
  22. data/lib/parser/lexer.rl +0 -2550
  23. data/lib/parser/macruby.y +0 -2208
  24. data/lib/parser/ruby18.y +0 -1936
  25. data/lib/parser/ruby19.y +0 -2185
  26. data/lib/parser/ruby20.y +0 -2363
  27. data/lib/parser/ruby21.y +0 -2364
  28. data/lib/parser/ruby22.y +0 -2371
  29. data/lib/parser/ruby23.y +0 -2377
  30. data/lib/parser/ruby24.y +0 -2415
  31. data/lib/parser/ruby25.y +0 -2412
  32. data/lib/parser/ruby26.y +0 -2420
  33. data/lib/parser/ruby27.y +0 -2949
  34. data/lib/parser/ruby30.y +0 -3048
  35. data/lib/parser/rubymotion.y +0 -2192
  36. data/test/bug_163/fixtures/input.rb +0 -5
  37. data/test/bug_163/fixtures/output.rb +0 -5
  38. data/test/bug_163/rewriter.rb +0 -20
  39. data/test/helper.rb +0 -103
  40. data/test/parse_helper.rb +0 -328
  41. data/test/racc_coverage_helper.rb +0 -133
  42. data/test/test_ast_processor.rb +0 -32
  43. data/test/test_base.rb +0 -31
  44. data/test/test_current.rb +0 -31
  45. data/test/test_diagnostic.rb +0 -95
  46. data/test/test_diagnostic_engine.rb +0 -59
  47. data/test/test_encoding.rb +0 -99
  48. data/test/test_lexer.rb +0 -3617
  49. data/test/test_lexer_stack_state.rb +0 -78
  50. data/test/test_meta.rb +0 -12
  51. data/test/test_parse_helper.rb +0 -83
  52. data/test/test_parser.rb +0 -9986
  53. data/test/test_runner_parse.rb +0 -56
  54. data/test/test_runner_rewrite.rb +0 -47
  55. data/test/test_source_buffer.rb +0 -165
  56. data/test/test_source_comment.rb +0 -36
  57. data/test/test_source_comment_associator.rb +0 -399
  58. data/test/test_source_map.rb +0 -14
  59. data/test/test_source_range.rb +0 -192
  60. data/test/test_source_rewriter.rb +0 -541
  61. data/test/test_source_rewriter_action.rb +0 -46
  62. data/test/test_source_tree_rewriter.rb +0 -361
  63. data/test/test_static_environment.rb +0 -45
  64. data/test/using_tree_rewriter/fixtures/input.rb +0 -3
  65. data/test/using_tree_rewriter/fixtures/output.rb +0 -3
  66. data/test/using_tree_rewriter/using_tree_rewriter.rb +0 -9
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
- require 'parse_helper'
5
-
6
- class TestSourceMap < Minitest::Test
7
- include ParseHelper
8
-
9
- def test_to_hash
10
- buf = Parser::Source::Buffer.new("<input>", source: "1")
11
- ast = parser_for_ruby_version('1.8').parse(buf)
12
- assert_equal [:expression, :operator], ast.loc.to_hash.keys.sort_by(&:to_s)
13
- end
14
- end
@@ -1,192 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
-
5
- class TestSourceRange < Minitest::Test
6
- def setup
7
- @buf = Parser::Source::Buffer.new('(string)',
8
- source: "foobar\nbaz")
9
- @sr1_3 = Parser::Source::Range.new(@buf, 1, 3)
10
- @sr2_2 = Parser::Source::Range.new(@buf, 2, 2)
11
- @sr3_3 = Parser::Source::Range.new(@buf, 3, 3)
12
- @sr2_6 = Parser::Source::Range.new(@buf, 2, 6)
13
- @sr5_8 = Parser::Source::Range.new(@buf, 5, 8)
14
- @sr5_7 = Parser::Source::Range.new(@buf, 5, 7)
15
- @sr6_7 = Parser::Source::Range.new(@buf, 6, 7)
16
- end
17
-
18
- def test_initialize
19
- assert_equal 1, @sr1_3.begin_pos
20
- assert_equal 3, @sr1_3.end_pos
21
- assert @sr1_3.frozen?
22
- end
23
-
24
- def test_size
25
- assert_equal 4, @sr2_6.size
26
- end
27
-
28
- def test_bad_size
29
- assert_raises ArgumentError do
30
- Parser::Source::Range.new(@buf, 2, 1)
31
- end
32
- end
33
-
34
- def test_join
35
- sr = @sr1_3.join(@sr5_8)
36
-
37
- assert_equal 1, sr.begin_pos
38
- assert_equal 8, sr.end_pos
39
- end
40
-
41
- def test_intersect
42
- assert_equal 2, @sr1_3.intersect(@sr2_6).begin_pos
43
- assert_equal 3, @sr1_3.intersect(@sr2_6).end_pos
44
- assert_equal 5, @sr2_6.intersect(@sr5_8).begin_pos
45
- assert_equal 6, @sr2_6.intersect(@sr5_8).end_pos
46
- assert @sr1_3.intersect(@sr5_8) == nil
47
- assert_equal 2, @sr1_3.intersect(@sr2_2).begin_pos
48
- assert_equal 2, @sr1_3.intersect(@sr2_2).end_pos
49
- assert_equal 2, @sr2_2.intersect(@sr2_2).begin_pos
50
- assert_equal 2, @sr2_2.intersect(@sr2_2).end_pos
51
- end
52
-
53
- def test_overlaps
54
- assert !@sr1_3.overlaps?(@sr5_8)
55
- assert @sr1_3.overlaps?(@sr2_6)
56
- assert @sr2_6.overlaps?(@sr5_8)
57
- assert @sr1_3.overlaps?(@sr2_2)
58
- assert !@sr2_6.overlaps?(@sr2_2)
59
- assert @sr2_2.overlaps?(@sr2_2)
60
- end
61
-
62
- def check_relationship(relationship, sr1, sr2, reflexive_relationship = relationship)
63
- # Double check equality
64
- assert_equal true, sr1 == sr1.dup
65
- assert_equal true, sr1 != sr2
66
- # Check relationships and reflexivity
67
- assert_equal true, sr1.send(relationship, sr2)
68
- assert_equal true, sr2.send(reflexive_relationship, sr1)
69
- # Check it's not true for itself
70
- assert_equal false, sr1.send(relationship, sr1)
71
- # Check other relationships return false
72
- others = %i[disjoint? crossing? contains? contained?] - [relationship, reflexive_relationship]
73
- others.each do |other_rel|
74
- assert_equal false, sr1.send(other_rel, sr2), other_rel
75
- assert_equal false, sr2.send(other_rel, sr1), other_rel
76
- end
77
- end
78
-
79
- def test_disjoint
80
- check_relationship(:disjoint?, @sr1_3, @sr5_8)
81
- check_relationship(:disjoint?, @sr2_2, @sr2_6)
82
- check_relationship(:disjoint?, @sr2_2, @sr3_3)
83
- check_relationship(:disjoint?, @sr2_6, @sr6_7)
84
- end
85
-
86
- def test_crossing
87
- check_relationship(:crossing?, @sr1_3, @sr2_6)
88
- end
89
-
90
- def test_containment
91
- check_relationship(:contained?, @sr2_2, @sr1_3, :contains?)
92
- check_relationship(:contained?, @sr5_7, @sr5_8, :contains?)
93
- check_relationship(:contained?, @sr6_7, @sr5_8, :contains?)
94
- end
95
-
96
- def test_order
97
- assert_equal 0, @sr1_3 <=> @sr1_3
98
- assert_equal(-1, @sr1_3 <=> @sr5_8)
99
- assert_equal(-1, @sr2_2 <=> @sr2_6)
100
- assert_equal(+1, @sr2_6 <=> @sr2_2)
101
-
102
- assert_equal(-1, @sr1_3 <=> @sr2_6)
103
-
104
- assert_equal(+1, @sr2_2 <=> @sr1_3)
105
- assert_equal(-1, @sr1_3 <=> @sr2_2)
106
- assert_equal(-1, @sr5_7 <=> @sr5_8)
107
-
108
- assert_nil @sr1_3 <=> Parser::Source::Range.new(@buf.dup, 1, 3)
109
- assert_nil @sr1_3 <=> 4
110
- end
111
-
112
- def test_empty
113
- assert !@sr1_3.empty?
114
- assert @sr2_2.empty?
115
- end
116
-
117
- def test_line
118
- sr = Parser::Source::Range.new(@buf, 7, 8)
119
- assert_equal 2, sr.line
120
- end
121
-
122
- def test_source_line
123
- sr = Parser::Source::Range.new(@buf, 7, 8)
124
- assert_equal 'baz', sr.source_line
125
- end
126
-
127
- def test_columns
128
- sr = Parser::Source::Range.new(@buf, 7, 8)
129
- assert_equal 0, sr.begin.column
130
- assert_equal 1, sr.end.column
131
- assert_equal 0...1, sr.column_range
132
- end
133
-
134
- def test_begin_end
135
- sr_beg = @sr2_6.begin
136
- assert_equal 2, sr_beg.begin_pos
137
- assert_equal 2, sr_beg.end_pos
138
-
139
- sr_end = @sr2_6.end
140
- assert_equal 6, sr_end.begin_pos
141
- assert_equal 6, sr_end.end_pos
142
- end
143
-
144
- def test_source
145
- sr = Parser::Source::Range.new(@buf, 0, 3)
146
- assert_equal 'foo', sr.source
147
-
148
- sr_multi = Parser::Source::Range.new(@buf, 0, 10)
149
- assert_equal "foobar\nbaz", sr_multi.source
150
- end
151
-
152
- def test_is?
153
- sr = Parser::Source::Range.new(@buf, 0, 3)
154
- assert sr.is?('foo')
155
- refute sr.is?('bar')
156
- end
157
-
158
- def test_to_range
159
- sr = Parser::Source::Range.new(@buf, 10, 20)
160
- assert_equal (10...20), sr.to_range
161
- end
162
-
163
- def test_to_s
164
- sr = Parser::Source::Range.new(@buf, 8, 9)
165
- assert_equal '(string):2:2', sr.to_s
166
- end
167
-
168
- def test_with
169
- sr2 = @sr1_3.with(begin_pos: 2)
170
- sr3 = @sr1_3.with(end_pos: 4)
171
-
172
- assert_equal 2, sr2.begin_pos
173
- assert_equal 3, sr2.end_pos
174
- assert_equal 1, sr3.begin_pos
175
- assert_equal 4, sr3.end_pos
176
- end
177
-
178
- def test_eql_and_hash
179
- assert_equal false, @sr1_3.eql?(@sr3_3)
180
- assert @sr1_3.hash != @sr3_3.hash
181
-
182
- also_1_3 = @sr3_3.with(begin_pos: 1)
183
- assert_equal true, @sr1_3.eql?(also_1_3)
184
- assert_equal @sr1_3.hash, also_1_3.hash
185
-
186
- buf2 = Parser::Source::Buffer.new('(string)',
187
- source: "foobar\nbaz")
188
- from_other_buf = Parser::Source::Range.new(buf2, 1, 3)
189
- assert_equal false, @sr1_3.eql?(from_other_buf)
190
- assert @sr1_3.hash != from_other_buf.hash
191
- end
192
- end
@@ -1,541 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'helper'
4
-
5
- class TestSourceRewriter < Minitest::Test
6
- def setup
7
- @buf = Parser::Source::Buffer.new('(rewriter)',
8
- source: 'foo bar baz')
9
- Parser::Source::Rewriter.warned_of_deprecation = true
10
- @rewriter = Parser::Source::Rewriter.new(@buf)
11
- end
12
-
13
- def range(from, len)
14
- Parser::Source::Range.new(@buf, from, from + len)
15
- end
16
-
17
- def test_remove
18
- assert_equal 'foo baz',
19
- @rewriter.
20
- remove(range(4, 3)).
21
- process
22
- end
23
-
24
- def test_insert_before
25
- assert_equal 'foo quux bar baz',
26
- @rewriter.
27
- insert_before(range(4, 3), 'quux ').
28
- process
29
- end
30
-
31
- def test_insert_after
32
- assert_equal 'foo bar quux baz',
33
- @rewriter.
34
- insert_after(range(4, 3), ' quux').
35
- process
36
- end
37
-
38
- def test_replace
39
- assert_equal 'foo quux baz',
40
- @rewriter.
41
- replace(range(4, 3), 'quux').
42
- process
43
- end
44
-
45
- def test_composing_asc
46
- assert_equal 'foo---bar---baz',
47
- @rewriter.
48
- replace(range(3, 1), '---').
49
- replace(range(7, 1), '---').
50
- process
51
- end
52
-
53
- def test_composing_desc
54
- assert_equal 'foo---bar---baz',
55
- @rewriter.
56
- replace(range(7, 1), '---').
57
- replace(range(3, 1), '---').
58
- process
59
- end
60
-
61
- #
62
- # Merging/clobbering of overlapping edits
63
- #
64
-
65
- def test_insertion_just_before_replace
66
- assert_equal 'foostrawberry jam---bar baz',
67
- @rewriter.
68
- replace(range(3, 1), '---').
69
- insert_before(range(3, 1), 'strawberry jam').
70
- process
71
- end
72
-
73
- def test_insertion_just_after_replace
74
- assert_equal 'foo---strawberry jam baz',
75
- @rewriter.
76
- replace(range(3, 4), '---').
77
- insert_after(range(3, 4), 'strawberry jam').
78
- process
79
- end
80
-
81
- def test_insertion_just_before_remove
82
- assert_equal 'foostrawberry jambar baz',
83
- @rewriter.
84
- remove(range(3, 1)).
85
- insert_before(range(3, 1), 'strawberry jam').
86
- process
87
- end
88
-
89
- def test_insertion_just_after_remove
90
- assert_equal 'foostrawberry jam baz',
91
- @rewriter.
92
- remove(range(3, 4)).
93
- insert_after(range(3, 4), 'strawberry jam').
94
- process
95
- end
96
-
97
- def test_insertion_just_before_replace_at_buffer_start
98
- assert_equal 'strawberry jam--- bar baz',
99
- @rewriter.
100
- replace(range(0, 3), '---').
101
- insert_before(range(0, 1), 'strawberry jam').
102
- process
103
- end
104
-
105
- def test_insertion_just_after_replace_at_buffer_end
106
- assert_equal 'foo bar ---strawberry jam',
107
- @rewriter.
108
- replace(range(8, 3), '---').
109
- insert_after(range(9, 2), 'strawberry jam').
110
- process
111
- end
112
-
113
- def test_insertion_just_before_remove_at_buffer_start
114
- assert_equal 'strawberry bar baz',
115
- @rewriter.
116
- remove(range(0, 3)).
117
- insert_before(range(0, 1), 'strawberry').
118
- process
119
- end
120
-
121
- def test_insertion_just_after_remove_at_buffer_end
122
- assert_equal 'foo bar strawberry',
123
- @rewriter.
124
- remove(range(8, 3)).
125
- insert_after(range(10, 1), 'strawberry').
126
- process
127
- end
128
-
129
- def test_multiple_insertions_at_same_location_clobber
130
- silence_diagnostics
131
-
132
- assert_raises Parser::ClobberingError do
133
- @rewriter.
134
- insert_before(range(0, 11), '<').
135
- insert_after( range(0, 11), '>').
136
- insert_before(range(0, 7), '(')
137
- end
138
- end
139
-
140
- def test_intentional_multiple_insertions_at_same_location
141
- assert_equal 'foo [(bar)] baz',
142
- @rewriter.
143
- insert_before_multi(range(4, 0), '(').
144
- insert_after_multi(range(7, 0), ')').
145
- insert_before_multi(range(4, 0), '[').
146
- insert_after_multi(range(7, 0), ']').
147
- process
148
- end
149
-
150
- def test_insertion_within_replace_clobber
151
- silence_diagnostics
152
-
153
- assert_raises Parser::ClobberingError do
154
- @rewriter.
155
- replace(range(3, 2), '<').
156
- insert_after(range(3, 1), '>')
157
- end
158
- end
159
-
160
- def test_insertion_within_remove_clobber
161
- silence_diagnostics
162
-
163
- assert_raises Parser::ClobberingError do
164
- @rewriter.
165
- remove(range(3, 2)).
166
- insert_after(range(3, 1), '>')
167
- end
168
- end
169
-
170
- def test_replace_overlapping_insertion_clobber
171
- silence_diagnostics
172
-
173
- assert_raises Parser::ClobberingError do
174
- @rewriter.
175
- insert_after(range(3, 1), '>').
176
- replace(range(3, 2), '<')
177
- end
178
- end
179
-
180
- def test_remove_overlapping_insertion_clobber
181
- silence_diagnostics
182
-
183
- assert_raises Parser::ClobberingError do
184
- @rewriter.
185
- insert_after(range(3, 1), '>').
186
- remove(range(3, 2))
187
- end
188
- end
189
-
190
- def test_multi_insertion_within_replace_clobber
191
- silence_diagnostics
192
-
193
- assert_raises Parser::ClobberingError do
194
- @rewriter.
195
- replace(range(3, 2), '<').
196
- insert_after_multi(range(3, 1), '>')
197
- end
198
- end
199
-
200
- def test_multi_insertion_within_remove_clobber
201
- silence_diagnostics
202
-
203
- assert_raises Parser::ClobberingError do
204
- @rewriter.
205
- remove(range(3, 2)).
206
- insert_after_multi(range(3, 1), '>')
207
- end
208
- end
209
-
210
- def test_replace_overlapping_multi_insertion_clobber
211
- silence_diagnostics
212
-
213
- assert_raises Parser::ClobberingError do
214
- @rewriter.
215
- insert_after_multi(range(3, 1), '>').
216
- replace(range(3, 2), '<')
217
- end
218
- end
219
-
220
- def test_remove_overlapping_multi_insertion_clobber
221
- silence_diagnostics
222
-
223
- assert_raises Parser::ClobberingError do
224
- @rewriter.
225
- insert_after_multi(range(3, 1), '>').
226
- remove(range(3, 2))
227
- end
228
- end
229
-
230
- def test_insertion_on_merged_insertion_clobber
231
- # 2 insertions at the same point clobber each other, even if the 1st one
232
- # was merged with an adjacent edit, and even if the same text is being
233
- # inserted
234
-
235
- silence_diagnostics
236
-
237
- assert_raises Parser::ClobberingError do
238
- @rewriter.
239
- insert_before(range(3, 1), '>').
240
- remove(range(3, 2)).
241
- insert_after(range(2, 1), '>')
242
- end
243
- end
244
-
245
- def test_insertion_merge_with_overlapping_replace
246
- assert_equal 'fo abc bar baz',
247
- @rewriter.
248
- insert_before(range(3, 1), 'abc').
249
- replace(range(2, 2), ' abc ').
250
- process
251
- end
252
-
253
- def test_replace_merge_with_overlapped_insertion
254
- assert_equal 'fo abc bar baz',
255
- @rewriter.
256
- replace(range(2, 2), ' abc ').
257
- insert_before(range(3, 1), 'abc').
258
- process
259
- end
260
-
261
- def test_replace_same_begin_larger_than_replaced_range_matching
262
- assert_equal 'foo supercalifragilistic baz',
263
- @rewriter.
264
- replace(range(4, 3), 'super').
265
- replace(range(4, 3), 'supercalifragilistic').
266
- process
267
- end
268
-
269
- def test_replace_same_begin_larger_than_replaced_range_non_matching
270
- silence_diagnostics
271
-
272
- assert_raises Parser::ClobberingError do
273
- @rewriter.
274
- replace(range(4, 3), 'super!').
275
- replace(range(4, 3), 'supercalifragilistic')
276
- end
277
- end
278
-
279
- def test_overlapping_replace_left_smaller_than_replaced_matching
280
- assert_equal 'superbaz',
281
- @rewriter.
282
- replace(range(0, 7), 'super').
283
- replace(range(2, 6), 'per').
284
- process
285
- end
286
-
287
- def test_overlapping_replace_left_smaller_than_replaced_non_matching
288
- silence_diagnostics
289
-
290
- assert_raises Parser::ClobberingError do
291
- @rewriter.
292
- replace(range(0, 7), 'super').
293
- replace(range(2, 8), 'perk')
294
- end
295
- end
296
-
297
- def test_overlapping_replace_left_larger_right_smaller_matching
298
- assert_equal 'foods baz',
299
- @rewriter.
300
- replace(range(1, 3), 'oods ').
301
- replace(range(3, 6), 'ds b').
302
- process
303
- end
304
-
305
- def test_overlapping_replace_left_larger_right_larger_matching
306
- assert_equal 'foods abcdefghijklm',
307
- @rewriter.
308
- replace(range(1, 3), 'oods ').
309
- replace(range(3, 8), 'ds abcdefghijklm').
310
- process
311
- end
312
-
313
- def test_overlapping_replace_left_larger_right_smaller_non_matching
314
- silence_diagnostics
315
-
316
- assert_raises Parser::ClobberingError do
317
- @rewriter.
318
- replace(range(1, 3), 'oods ').
319
- replace(range(3, 6), 'ds')
320
- end
321
- end
322
-
323
- def test_overlapping_replace_left_larger_right_larger_non_matching
324
- silence_diagnostics
325
-
326
- assert_raises Parser::ClobberingError do
327
- @rewriter.
328
- replace(range(1, 3), 'oods b').
329
- replace(range(3, 8), 'ds abcdefghijklm')
330
- end
331
- end
332
-
333
- def test_subsuming_replace_both_smaller_matching
334
- assert_equal 'food baz',
335
- @rewriter.
336
- replace(range(0, 7), 'food').
337
- replace(range(3, 3), 'd').
338
- process
339
- end
340
-
341
- def test_subsuming_replace_both_smaller_non_matching
342
- silence_diagnostics
343
-
344
- assert_raises Parser::ClobberingError do
345
- @rewriter.
346
- replace(range(0, 7), 'foo').
347
- replace(range(3, 3), 'd')
348
- end
349
- end
350
-
351
- def test_subsuming_replace_both_larger_matching
352
- assert_equal 'foo barr baz',
353
- @rewriter.
354
- replace(range(0, 7), 'foo barr').
355
- replace(range(3, 3), ' bar').
356
- process
357
- end
358
-
359
- def test_subsuming_replace_both_larger_non_matching
360
- silence_diagnostics
361
-
362
- assert_raises Parser::ClobberingError do
363
- @rewriter.
364
- replace(range(0, 7), 'foo barr').
365
- replace(range(3, 3), ' bar ')
366
- end
367
- end
368
-
369
- def test_replaced_ranges_merge_when_furthest_right_range_is_not_furthest_left
370
- # regression test; previously, when actions were merged, the resulting
371
- # replaced range could be too small sometimes
372
- assert_equal 'foo_***_***',
373
- @rewriter.
374
- replace(range(3, 1), '_').
375
- replace(range(7, 1), '_').
376
- replace(range(4, 7), '***_***').
377
- process
378
- end
379
-
380
- def test_clobber
381
- diagnostics = []
382
- @rewriter.diagnostics.consumer = lambda do |diag|
383
- diagnostics << diag
384
- end
385
-
386
- assert_raises Parser::ClobberingError do
387
- @rewriter.
388
- replace(range(3, 1), '---').
389
- remove(range(3, 1))
390
- end
391
-
392
- assert_equal 2, diagnostics.count
393
-
394
- assert_equal :error, diagnostics.first.level
395
- assert_equal 'cannot remove 1 character(s)',
396
- diagnostics.first.message
397
- assert_equal range(3, 1), diagnostics.first.location
398
-
399
- assert_equal :note, diagnostics.last.level
400
- assert_equal "clobbered by: replace 1 character(s) with \"---\"",
401
- diagnostics.last.message
402
- assert_equal range(3, 1), diagnostics.last.location
403
- end
404
-
405
- def test_clobbering_error_backward_compatibility
406
- silence_diagnostics
407
-
408
- rescued = false
409
-
410
- # We use begin..rescue..end here rather than #assert_raises
411
- # since #assert_raises expects exact error class.
412
- begin
413
- @rewriter.
414
- replace(range(3, 1), '---').
415
- remove(range(3, 1))
416
- rescue RuntimeError => error
417
- rescued = true if error.message.include?('clobber')
418
- end
419
-
420
- assert rescued
421
- end
422
-
423
-
424
- def test_crossing_delete
425
- assert_equal 'faz',
426
- @rewriter.
427
- remove(range(1, 4)).
428
- remove(range(6, 3)).
429
- remove(range(4, 3)).
430
- process
431
- end
432
-
433
- def test_overlapping_replace
434
- assert_equal 'flippin flyin flapjackz',
435
- @rewriter.
436
- replace(range(1, 4), 'lippin f').
437
- replace(range(4, 4), 'pin flyin flap').
438
- replace(range(7, 3), ' flyin flapjack').
439
- process
440
- end
441
-
442
- def test_subsuming_delete
443
- assert_equal 'foo',
444
- @rewriter.
445
- remove(range(6, 3)).
446
- remove(range(7, 2)).
447
- remove(range(3, 8)).
448
- process
449
- end
450
-
451
- def test_subsuming_replace
452
- assert_equal 'freebie',
453
- @rewriter.
454
- replace(range(3, 3), 'ebi').
455
- replace(range(1, 10), 'reebie').
456
- replace(range(5, 2), 'ie').
457
- process
458
- end
459
-
460
- def test_equivalent_delete_insert_replace
461
- # A deletion + insertion just before or after the deleted range is
462
- # identical in every way to a replacement! So logically, they shouldn't
463
- # conflict.
464
- assert_equal 'tin bar baz',
465
- @rewriter.
466
- remove(range(0, 3)). # ' bar baz'
467
- insert_before(range(0, 1), 'tin'). # 'tin bar baz'
468
- replace(range(0, 3), 'tin').
469
- process
470
- end
471
-
472
- def test_transaction_returns_self
473
- assert_equal @rewriter, @rewriter.transaction {}
474
- end
475
-
476
- def test_transaction_commit
477
- silence_diagnostics
478
-
479
- # Original: 'foo bar baz'
480
-
481
- # Rewrite as 'foo BAR baz'
482
- @rewriter.replace(range(4, 3), 'BAR')
483
-
484
- # Rewrite as '( bar )'
485
- @rewriter.transaction do
486
- @rewriter.replace(range(0, 3), '(')
487
- @rewriter.replace(range(8, 3), ')')
488
- end
489
-
490
- @rewriter.replace(range(3, 1), '_')
491
- @rewriter.replace(range(7, 1), '_')
492
-
493
- assert_equal '(_BAR_)', @rewriter.process
494
- end
495
-
496
- def test_transaction_rollback
497
- silence_diagnostics
498
-
499
- # Original: 'foo bar baz'
500
-
501
- # Rewrite as 'foo bar BAZ'
502
- @rewriter.replace(range(8, 3), 'BAZ')
503
-
504
- assert_raises Parser::ClobberingError do
505
- # Trying to rewrite as '( bar )', but it fails
506
- @rewriter.transaction do
507
- @rewriter.replace(range(0, 3), '(')
508
- @rewriter.replace(range(8, 3), ')')
509
- end
510
- end
511
-
512
- @rewriter.replace(range(0, 3), 'FOO')
513
-
514
- assert_equal 'FOO bar BAZ', @rewriter.process
515
- end
516
-
517
- def test_nested_transaction_raises_error
518
- error = assert_raises RuntimeError do
519
- @rewriter.transaction do
520
- @rewriter.transaction do
521
- end
522
- end
523
- end
524
-
525
- assert_match(/nested/i, error.message)
526
- end
527
-
528
- def test_process_in_transaction_raises_error
529
- error = assert_raises RuntimeError do
530
- @rewriter.transaction do
531
- @rewriter.process
532
- end
533
- end
534
-
535
- assert_match(/transaction/, error.message)
536
- end
537
-
538
- def silence_diagnostics
539
- @rewriter.diagnostics.consumer = proc {}
540
- end
541
- end