parser 2.3.0.2 → 2.3.0.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/doc/AST_FORMAT.md +1 -1
- data/lib/parser/lexer.rl +82 -96
- data/lib/parser/lexer/literal.rb +5 -5
- data/lib/parser/source/buffer.rb +39 -12
- data/lib/parser/source/comment/associator.rb +17 -11
- data/lib/parser/source/range.rb +22 -12
- data/lib/parser/source/rewriter.rb +214 -59
- data/lib/parser/version.rb +1 -1
- data/test/parse_helper.rb +36 -26
- data/test/test_lexer.rb +1181 -1147
- data/test/test_parser.rb +12 -0
- data/test/test_source_comment_associator.rb +17 -0
- data/test/test_source_range.rb +20 -0
- data/test/test_source_rewriter.rb +269 -10
- metadata +2 -2
data/test/test_parser.rb
CHANGED
@@ -3738,6 +3738,18 @@ class TestParser < Minitest::Test
|
|
3738
3738
|
ALL_VERSIONS - %w(1.8))
|
3739
3739
|
end
|
3740
3740
|
|
3741
|
+
def test_space_args_hash_literal_then_block
|
3742
|
+
# This code only parses if the lexer enters expr_endarg state correctly
|
3743
|
+
assert_parses(
|
3744
|
+
s(:block,
|
3745
|
+
s(:send, nil, :f, s(:int, 1), s(:hash, s(:pair, s(:int, 1), s(:int, 2)))),
|
3746
|
+
s(:args),
|
3747
|
+
s(:int, 1)),
|
3748
|
+
%q{f 1, {1 => 2} {1}},
|
3749
|
+
%q{},
|
3750
|
+
ALL_VERSIONS)
|
3751
|
+
end
|
3752
|
+
|
3741
3753
|
def test_space_args_arg_call
|
3742
3754
|
assert_parses(
|
3743
3755
|
s(:send, nil, :fun,
|
@@ -255,4 +255,21 @@ __ENCODING__
|
|
255
255
|
assert_equal ['# foo'],
|
256
256
|
associations[ast].map(&:text)
|
257
257
|
end
|
258
|
+
|
259
|
+
def test_associate_inside_heredoc
|
260
|
+
ast, associations = associate(<<-END)
|
261
|
+
<<x
|
262
|
+
\#{
|
263
|
+
foo # bar
|
264
|
+
}
|
265
|
+
x
|
266
|
+
END
|
267
|
+
|
268
|
+
begin_node = ast.children[0]
|
269
|
+
send_node = begin_node.children[0]
|
270
|
+
|
271
|
+
assert_equal 1, associations.size
|
272
|
+
assert_equal ['# bar'],
|
273
|
+
associations[send_node].map(&:text)
|
274
|
+
end
|
258
275
|
end
|
data/test/test_source_range.rb
CHANGED
@@ -55,6 +55,26 @@ class TestSourceRange < Minitest::Test
|
|
55
55
|
assert !sr2.disjoint?(sr3)
|
56
56
|
end
|
57
57
|
|
58
|
+
def test_overlaps
|
59
|
+
sr1 = Parser::Source::Range.new(@buf, 1, 3)
|
60
|
+
sr2 = Parser::Source::Range.new(@buf, 2, 6)
|
61
|
+
sr3 = Parser::Source::Range.new(@buf, 5, 8)
|
62
|
+
|
63
|
+
assert !sr1.overlaps?(sr3)
|
64
|
+
assert sr1.overlaps?(sr2)
|
65
|
+
assert sr2.overlaps?(sr3)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_empty
|
69
|
+
sr1 = Parser::Source::Range.new(@buf, 1, 3)
|
70
|
+
sr2 = Parser::Source::Range.new(@buf, 2, 2)
|
71
|
+
sr3 = Parser::Source::Range.new(@buf, 7, 8)
|
72
|
+
|
73
|
+
assert !sr1.empty?
|
74
|
+
assert sr2.empty?
|
75
|
+
assert !sr3.empty?
|
76
|
+
end
|
77
|
+
|
58
78
|
def test_line
|
59
79
|
sr = Parser::Source::Range.new(@buf, 7, 8)
|
60
80
|
assert_equal 2, sr.line
|
@@ -56,16 +56,262 @@ class TestSourceRewriter < Minitest::Test
|
|
56
56
|
process
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
59
|
+
#
|
60
|
+
# Merging/clobbering of overlapping edits
|
61
|
+
#
|
62
|
+
|
63
|
+
def test_insertion_just_before_replace
|
64
|
+
assert_equal 'foostrawberry jam---bar baz',
|
65
|
+
@rewriter.
|
66
|
+
replace(range(3, 1), '---').
|
67
|
+
insert_before(range(3, 1), 'strawberry jam').
|
68
|
+
process
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_insertion_just_after_replace
|
72
|
+
assert_equal 'foo---strawberry jam baz',
|
73
|
+
@rewriter.
|
74
|
+
replace(range(3, 4), '---').
|
75
|
+
insert_after(range(3, 4), 'strawberry jam').
|
76
|
+
process
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_insertion_just_before_remove
|
80
|
+
assert_equal 'foostrawberry jambar baz',
|
81
|
+
@rewriter.
|
82
|
+
remove(range(3, 1)).
|
83
|
+
insert_before(range(3, 1), 'strawberry jam').
|
84
|
+
process
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_insertion_just_after_remove
|
88
|
+
assert_equal 'foostrawberry jam baz',
|
89
|
+
@rewriter.
|
90
|
+
remove(range(3, 4)).
|
91
|
+
insert_after(range(3, 4), 'strawberry jam').
|
92
|
+
process
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_insertion_just_before_replace_at_buffer_start
|
96
|
+
assert_equal 'strawberry jam--- bar baz',
|
97
|
+
@rewriter.
|
98
|
+
replace(range(0, 3), '---').
|
99
|
+
insert_before(range(0, 1), 'strawberry jam').
|
100
|
+
process
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_insertion_just_after_replace_at_buffer_end
|
104
|
+
assert_equal 'foo bar ---strawberry jam',
|
105
|
+
@rewriter.
|
106
|
+
replace(range(8, 3), '---').
|
107
|
+
insert_after(range(9, 2), 'strawberry jam').
|
108
|
+
process
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_insertion_just_before_remove_at_buffer_start
|
112
|
+
assert_equal 'strawberry bar baz',
|
113
|
+
@rewriter.
|
114
|
+
remove(range(0, 3)).
|
115
|
+
insert_before(range(0, 1), 'strawberry').
|
116
|
+
process
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_insertion_just_after_remove_at_buffer_end
|
120
|
+
assert_equal 'foo bar strawberry',
|
121
|
+
@rewriter.
|
122
|
+
remove(range(8, 3)).
|
123
|
+
insert_after(range(10, 1), 'strawberry').
|
124
|
+
process
|
125
|
+
end
|
126
|
+
|
127
|
+
def test_multiple_insertions_at_same_location_clobber
|
128
|
+
silence_diagnostics
|
129
|
+
|
130
|
+
assert_raises Parser::ClobberingError do
|
131
|
+
@rewriter.
|
132
|
+
insert_before(range(0, 11), '<').
|
133
|
+
insert_after( range(0, 11), '>').
|
134
|
+
insert_before(range(0, 7), '(')
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_insertion_within_replace_clobber
|
139
|
+
silence_diagnostics
|
140
|
+
|
141
|
+
assert_raises Parser::ClobberingError do
|
142
|
+
@rewriter.
|
143
|
+
replace(range(3, 2), '<').
|
144
|
+
insert_after(range(3, 1), '>')
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_insertion_within_remove_clobber
|
149
|
+
silence_diagnostics
|
150
|
+
|
151
|
+
assert_raises Parser::ClobberingError do
|
152
|
+
@rewriter.
|
153
|
+
remove(range(3, 2)).
|
154
|
+
insert_after(range(3, 1), '>')
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_replace_overlapping_insertion_clobber
|
159
|
+
silence_diagnostics
|
160
|
+
|
161
|
+
assert_raises Parser::ClobberingError do
|
162
|
+
@rewriter.
|
163
|
+
insert_after(range(3, 1), '>').
|
164
|
+
replace(range(3, 2), '<')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def test_remove_overlapping_insertion_clobber
|
169
|
+
silence_diagnostics
|
170
|
+
|
171
|
+
assert_raises Parser::ClobberingError do
|
172
|
+
@rewriter.
|
173
|
+
insert_after(range(3, 1), '>').
|
174
|
+
remove(range(3, 2))
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_insertion_on_merged_insertion_clobber
|
179
|
+
# 2 insertions at the same point clobber each other, even if the 1st one
|
180
|
+
# was merged with an adjacent edit, and even if the same text is being
|
181
|
+
# inserted
|
182
|
+
|
183
|
+
silence_diagnostics
|
184
|
+
|
185
|
+
assert_raises Parser::ClobberingError do
|
186
|
+
@rewriter.
|
187
|
+
insert_before(range(3, 1), '>').
|
188
|
+
remove(range(3, 2)).
|
189
|
+
insert_after(range(2, 1), '>')
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_insertion_merge_with_overlapping_replace
|
194
|
+
assert_equal 'fo abc bar baz',
|
195
|
+
@rewriter.
|
196
|
+
insert_before(range(3, 1), 'abc').
|
197
|
+
replace(range(2, 2), ' abc ').
|
198
|
+
process
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_replace_merge_with_overlapped_insertion
|
202
|
+
assert_equal 'fo abc bar baz',
|
203
|
+
@rewriter.
|
204
|
+
replace(range(2, 2), ' abc ').
|
205
|
+
insert_before(range(3, 1), 'abc').
|
206
|
+
process
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_replace_same_begin_larger_than_replaced_range_matching
|
210
|
+
assert_equal 'foo supercalifragilistic baz',
|
211
|
+
@rewriter.
|
212
|
+
replace(range(4, 3), 'super').
|
213
|
+
replace(range(4, 3), 'supercalifragilistic').
|
214
|
+
process
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_replace_same_begin_larger_than_replaced_range_non_matching
|
218
|
+
silence_diagnostics
|
219
|
+
|
220
|
+
assert_raises Parser::ClobberingError do
|
221
|
+
@rewriter.
|
222
|
+
replace(range(4, 3), 'super!').
|
223
|
+
replace(range(4, 3), 'supercalifragilistic')
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_overlapping_replace_left_smaller_than_replaced_matching
|
228
|
+
assert_equal 'superbaz',
|
229
|
+
@rewriter.
|
230
|
+
replace(range(0, 7), 'super').
|
231
|
+
replace(range(2, 6), 'per').
|
232
|
+
process
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_overlapping_replace_left_smaller_than_replaced_non_matching
|
236
|
+
silence_diagnostics
|
237
|
+
|
238
|
+
assert_raises Parser::ClobberingError do
|
239
|
+
@rewriter.
|
240
|
+
replace(range(0, 7), 'super').
|
241
|
+
replace(range(2, 8), 'perk')
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_overlapping_replace_left_larger_right_smaller_matching
|
246
|
+
assert_equal 'foods baz',
|
247
|
+
@rewriter.
|
248
|
+
replace(range(1, 3), 'oods ').
|
249
|
+
replace(range(3, 6), 'ds b').
|
250
|
+
process
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_overlapping_replace_left_larger_right_larger_matching
|
254
|
+
assert_equal 'foods abcdefghijklm',
|
255
|
+
@rewriter.
|
256
|
+
replace(range(1, 3), 'oods ').
|
257
|
+
replace(range(3, 8), 'ds abcdefghijklm').
|
258
|
+
process
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_overlapping_replace_left_larger_right_smaller_non_matching
|
262
|
+
silence_diagnostics
|
263
|
+
|
264
|
+
assert_raises Parser::ClobberingError do
|
265
|
+
@rewriter.
|
266
|
+
replace(range(1, 3), 'oods ').
|
267
|
+
replace(range(3, 6), 'ds')
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
def test_overlapping_replace_left_larger_right_larger_non_matching
|
272
|
+
silence_diagnostics
|
273
|
+
|
274
|
+
assert_raises Parser::ClobberingError do
|
275
|
+
@rewriter.
|
276
|
+
replace(range(1, 3), 'oods b').
|
277
|
+
replace(range(3, 8), 'ds abcdefghijklm')
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_subsuming_replace_both_smaller_matching
|
282
|
+
assert_equal 'food baz',
|
283
|
+
@rewriter.
|
284
|
+
replace(range(0, 7), 'food').
|
285
|
+
replace(range(3, 3), 'd').
|
286
|
+
process
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_subsuming_replace_both_smaller_non_matching
|
290
|
+
silence_diagnostics
|
291
|
+
|
292
|
+
assert_raises Parser::ClobberingError do
|
293
|
+
@rewriter.
|
294
|
+
replace(range(0, 7), 'foo').
|
295
|
+
replace(range(3, 3), 'd')
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_subsuming_replace_both_larger_matching
|
300
|
+
assert_equal 'foo barr baz',
|
301
|
+
@rewriter.
|
302
|
+
replace(range(0, 7), 'foo barr').
|
303
|
+
replace(range(3, 3), ' bar').
|
304
|
+
process
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_subsuming_replace_both_larger_non_matching
|
308
|
+
silence_diagnostics
|
309
|
+
|
310
|
+
assert_raises Parser::ClobberingError do
|
311
|
+
@rewriter.
|
312
|
+
replace(range(0, 7), 'foo barr').
|
313
|
+
replace(range(3, 3), ' bar ')
|
314
|
+
end
|
69
315
|
end
|
70
316
|
|
71
317
|
def test_clobber
|
@@ -111,6 +357,7 @@ class TestSourceRewriter < Minitest::Test
|
|
111
357
|
assert rescued
|
112
358
|
end
|
113
359
|
|
360
|
+
|
114
361
|
def test_overlapping_delete
|
115
362
|
assert_equal 'faz',
|
116
363
|
@rewriter.
|
@@ -147,6 +394,18 @@ class TestSourceRewriter < Minitest::Test
|
|
147
394
|
process
|
148
395
|
end
|
149
396
|
|
397
|
+
def test_equivalent_delete_insert_replace
|
398
|
+
# A deletion + insertion just before or after the deleted range is
|
399
|
+
# identical in every way to a replacement! So logically, they shouldn't
|
400
|
+
# conflict.
|
401
|
+
assert_equal 'tin bar baz',
|
402
|
+
@rewriter.
|
403
|
+
remove(range(0, 3)). # ' bar baz'
|
404
|
+
insert_before(range(0, 1), 'tin'). # 'tin bar baz'
|
405
|
+
replace(range(0, 3), 'tin').
|
406
|
+
process
|
407
|
+
end
|
408
|
+
|
150
409
|
def test_transaction_returns_self
|
151
410
|
assert_equal @rewriter, @rewriter.transaction {}
|
152
411
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.3.0.
|
4
|
+
version: 2.3.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|