parser 2.7.0.3 → 2.7.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -169,4 +169,19 @@ class TestSourceRange < Minitest::Test
169
169
  assert_equal 1, sr3.begin_pos
170
170
  assert_equal 4, sr3.end_pos
171
171
  end
172
+
173
+ def test_eql_and_hash
174
+ assert_equal false, @sr1_3.eql?(@sr3_3)
175
+ assert @sr1_3.hash != @sr3_3.hash
176
+
177
+ also_1_3 = @sr3_3.with(begin_pos: 1)
178
+ assert_equal true, @sr1_3.eql?(also_1_3)
179
+ assert_equal @sr1_3.hash, also_1_3.hash
180
+
181
+ buf2 = Parser::Source::Buffer.new('(string)')
182
+ buf2.source = "foobar\nbaz"
183
+ from_other_buf = Parser::Source::Range.new(buf2, 1, 3)
184
+ assert_equal false, @sr1_3.eql?(from_other_buf)
185
+ assert @sr1_3.hash != from_other_buf.hash
186
+ end
172
187
  end
@@ -8,8 +8,10 @@ class TestSourceTreeRewriter < Minitest::Test
8
8
  @buf.source = 'puts(:hello, :world)'
9
9
 
10
10
  @hello = range(5, 6)
11
+ @ll = range(7, 2)
11
12
  @comma_space = range(11,2)
12
13
  @world = range(13,6)
14
+ @whole = range(0, @buf.source.length)
13
15
  end
14
16
 
15
17
  def range(from, len)
@@ -17,11 +19,11 @@ class TestSourceTreeRewriter < Minitest::Test
17
19
  end
18
20
 
19
21
  # Returns either:
20
- # - String (Normal operation)
22
+ # - yield rewriter
21
23
  # - [diagnostic, ...] (Diagnostics)
22
24
  # - Parser::ClobberingError
23
25
  #
24
- def apply(actions, **policy)
26
+ def build(actions, **policy)
25
27
  diagnostics = []
26
28
  diags = -> { diagnostics.flatten.map(&:strip).join("\n") }
27
29
  rewriter = Parser::Source::TreeRewriter.new(@buf, **policy)
@@ -30,7 +32,7 @@ class TestSourceTreeRewriter < Minitest::Test
30
32
  rewriter.public_send(action, range, *args)
31
33
  end
32
34
  if diagnostics.empty?
33
- rewriter.process
35
+ yield rewriter
34
36
  else
35
37
  diags.call
36
38
  end
@@ -38,6 +40,15 @@ class TestSourceTreeRewriter < Minitest::Test
38
40
  [::Parser::ClobberingError, diags.call]
39
41
  end
40
42
 
43
+ # Returns either:
44
+ # - String (Normal operation)
45
+ # - [diagnostic, ...] (Diagnostics)
46
+ # - Parser::ClobberingError
47
+ #
48
+ def apply(actions, **policy)
49
+ build(actions, **policy) { |rewriter| rewriter.process }
50
+ end
51
+
41
52
  # Expects ordered actions to be grouped together
42
53
  def check_actions(expected, grouped_actions, **policy)
43
54
  grouped_actions.permutation do |sequence|
@@ -140,6 +151,16 @@ DIAGNOSTIC
140
151
  [:wrap, @hello, '[', ']']]
141
152
  end
142
153
 
154
+ def test_inserts_on_empty_ranges
155
+ assert_actions_result 'puts({x}:hello[y], :world)',
156
+ [:insert_before, @hello.begin, '{'],
157
+ [:replace, @hello.begin, 'x'],
158
+ [:insert_after, @hello.begin, '}'],
159
+ [:insert_before, @hello.end, '['],
160
+ [:replace, @hello.end, 'y'],
161
+ [:insert_after, @hello.end, ']']
162
+ end
163
+
143
164
  def test_replace_same_range
144
165
  assert_actions_result 'puts(:hey, :world)',
145
166
  [[:replace, @hello, ':hi'],
@@ -170,4 +191,73 @@ DIAGNOSTIC
170
191
  rewriter = Parser::Source::TreeRewriter.new(@buf)
171
192
  assert_raises(IndexError) { rewriter.insert_before(range(0, 100), 'hola') }
172
193
  end
194
+
195
+ def test_empty
196
+ rewriter = Parser::Source::TreeRewriter.new(@buf)
197
+ assert_equal true, rewriter.empty?
198
+
199
+ # This is a trivial wrap
200
+ rewriter.wrap(range(2,3), '', '')
201
+ assert_equal true, rewriter.empty?
202
+
203
+ # This is a trivial deletion
204
+ rewriter.remove(range(2,0))
205
+ assert_equal true, rewriter.empty?
206
+
207
+ rewriter.remove(range(2,3))
208
+ assert_equal false, rewriter.empty?
209
+ end
210
+
211
+ # splits array into two groups, yield all such possible pairs of groups
212
+ # each_split([1, 2, 3, 4]) yields [1, 2], [3, 4];
213
+ # then [1, 3], [2, 4]
214
+ # ...
215
+ # and finally [3, 4], [1, 2]
216
+ def each_split(array)
217
+ n = array.size
218
+ first_split_size = n.div(2)
219
+ splitting = (0...n).to_set
220
+ splitting.to_a.combination(first_split_size) do |indices|
221
+ yield array.values_at(*indices),
222
+ array.values_at(*(splitting - indices))
223
+ end
224
+ end
225
+
226
+ # Checks that `actions+extra` give the same result when
227
+ # made in order or from subgroups that are later merged.
228
+ # The `extra` actions are always added at the end of the second group.
229
+ #
230
+ def check_all_merge_possibilities(actions, extra, **policy)
231
+ expected = apply(actions + extra, **policy)
232
+
233
+ each_split(actions) do |actions_1, actions_2|
234
+ build(actions_1, **policy) do |rewriter_1|
235
+ build(actions_2 + extra, **policy) do |rewriter_2|
236
+ result = rewriter_1.merge(rewriter_2).process
237
+ assert_equal(expected, result,
238
+ "Group 1: #{actions_1.inspect}\n\n" +
239
+ "Group 2: #{(actions_2 + extra).inspect}"
240
+ )
241
+ end
242
+ end
243
+ end
244
+ end
245
+
246
+ def test_merge
247
+ check_all_merge_possibilities([
248
+ [:wrap, @whole, '<', '>'],
249
+ [:replace, @comma_space, ' => '],
250
+ [:wrap, @hello, '!', '!'],
251
+ # Following two wraps must have same value as they
252
+ # will be applied in different orders...
253
+ [:wrap, @hello.join(@world), '{', '}'],
254
+ [:wrap, @hello.join(@world), '{', '}'],
255
+ [:remove, @ll],
256
+ [:replace, @world, ':everybody'],
257
+ [:wrap, @world, '[', ']']
258
+ ],
259
+ [ # ... but this one is always going to be applied last (extra)
260
+ [:wrap, @hello.join(@world), '@', '@'],
261
+ ])
262
+ end
173
263
  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.7.0.3
4
+ version: 2.7.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - whitequark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-26 00:00:00.000000000 Z
11
+ date: 2020-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast
@@ -229,6 +229,8 @@ files:
229
229
  - lib/parser/ruby26.y
230
230
  - lib/parser/ruby27.rb
231
231
  - lib/parser/ruby27.y
232
+ - lib/parser/ruby28.rb
233
+ - lib/parser/ruby28.y
232
234
  - lib/parser/rubymotion.rb
233
235
  - lib/parser/rubymotion.y
234
236
  - lib/parser/runner.rb
@@ -242,6 +244,7 @@ files:
242
244
  - lib/parser/source/map/condition.rb
243
245
  - lib/parser/source/map/constant.rb
244
246
  - lib/parser/source/map/definition.rb
247
+ - lib/parser/source/map/endless_definition.rb
245
248
  - lib/parser/source/map/for.rb
246
249
  - lib/parser/source/map/heredoc.rb
247
250
  - lib/parser/source/map/index.rb
@@ -297,9 +300,9 @@ licenses:
297
300
  - MIT
298
301
  metadata:
299
302
  bug_tracker_uri: https://github.com/whitequark/parser/issues
300
- changelog_uri: https://github.com/whitequark/parser/blob/v2.7.0.3/CHANGELOG.md
301
- documentation_uri: https://www.rubydoc.info/gems/parser/2.7.0.3
302
- source_code_uri: https://github.com/whitequark/parser/tree/v2.7.0.3
303
+ changelog_uri: https://github.com/whitequark/parser/blob/v2.7.1.2/CHANGELOG.md
304
+ documentation_uri: https://www.rubydoc.info/gems/parser/2.7.1.2
305
+ source_code_uri: https://github.com/whitequark/parser/tree/v2.7.1.2
303
306
  post_install_message:
304
307
  rdoc_options: []
305
308
  require_paths: