unparser 0.1.15 → 0.1.16

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +6 -0
  3. data/circle.yml +1 -1
  4. data/config/flay.yml +1 -1
  5. data/config/flog.yml +1 -1
  6. data/config/reek.yml +1 -0
  7. data/lib/unparser/ast.rb +1 -1
  8. data/lib/unparser/ast/local_variable_scope.rb +1 -1
  9. data/lib/unparser/cli/differ.rb +1 -1
  10. data/lib/unparser/cli/source.rb +2 -0
  11. data/lib/unparser/constants.rb +0 -11
  12. data/lib/unparser/dsl.rb +1 -1
  13. data/lib/unparser/emitter.rb +41 -13
  14. data/lib/unparser/emitter/argument.rb +22 -34
  15. data/lib/unparser/emitter/assignment.rb +29 -6
  16. data/lib/unparser/emitter/begin.rb +10 -8
  17. data/lib/unparser/emitter/binary.rb +3 -12
  18. data/lib/unparser/emitter/block.rb +1 -0
  19. data/lib/unparser/emitter/case.rb +4 -2
  20. data/lib/unparser/emitter/cbase.rb +1 -0
  21. data/lib/unparser/emitter/class.rb +2 -1
  22. data/lib/unparser/emitter/def.rb +1 -1
  23. data/lib/unparser/emitter/defined.rb +2 -1
  24. data/lib/unparser/emitter/flipflop.rb +3 -2
  25. data/lib/unparser/emitter/flow_modifier.rb +22 -5
  26. data/lib/unparser/emitter/for.rb +2 -1
  27. data/lib/unparser/emitter/if.rb +10 -3
  28. data/lib/unparser/emitter/literal.rb +1 -0
  29. data/lib/unparser/emitter/literal/dynamic_body.rb +1 -1
  30. data/lib/unparser/emitter/literal/hash.rb +1 -1
  31. data/lib/unparser/emitter/literal/primitive.rb +83 -1
  32. data/lib/unparser/emitter/literal/range.rb +3 -2
  33. data/lib/unparser/emitter/match.rb +1 -0
  34. data/lib/unparser/emitter/module.rb +1 -1
  35. data/lib/unparser/emitter/op_assign.rb +3 -1
  36. data/lib/unparser/emitter/redo.rb +1 -0
  37. data/lib/unparser/emitter/repetition.rb +5 -3
  38. data/lib/unparser/emitter/resbody.rb +2 -2
  39. data/lib/unparser/emitter/rescue.rb +2 -1
  40. data/lib/unparser/emitter/retry.rb +1 -0
  41. data/lib/unparser/emitter/send.rb +13 -14
  42. data/lib/unparser/emitter/send/arguments.rb +1 -2
  43. data/lib/unparser/emitter/send/attribute_assignment.rb +3 -2
  44. data/lib/unparser/emitter/send/binary.rb +3 -2
  45. data/lib/unparser/emitter/send/index.rb +16 -2
  46. data/lib/unparser/emitter/send/regular.rb +2 -1
  47. data/lib/unparser/emitter/send/unary.rb +2 -1
  48. data/lib/unparser/emitter/splat.rb +2 -0
  49. data/lib/unparser/emitter/super.rb +2 -0
  50. data/lib/unparser/emitter/undef.rb +1 -0
  51. data/lib/unparser/emitter/variable.rb +4 -0
  52. data/lib/unparser/emitter/yield.rb +1 -0
  53. data/lib/unparser/preprocessor.rb +19 -12
  54. data/spec/integration/unparser/corpus_spec.rb +3 -2
  55. data/spec/integrations.yml +11 -1
  56. data/spec/unit/unparser_spec.rb +190 -183
  57. data/unparser.gemspec +2 -2
  58. metadata +5 -4
@@ -4,8 +4,9 @@ require 'spec_helper'
4
4
 
5
5
  describe 'Unparser on ruby corpus' do
6
6
  before do
7
- if RUBY_VERSION == '1.9.3'
8
- skip 'Corpus test not active for 1.9.3 because of limitations in encoding signalling, see Readme'
7
+ if RUBY_VERSION < '2.1.0'
8
+ # Limits in encodings and complex/rational literals
9
+ skip 'Corpus test not active for < 2.1.0'
9
10
  end
10
11
  if RUBY_ENGINE == 'jruby'
11
12
  skip 'Corpus test exhausts jruby heap space on travis'
@@ -1,5 +1,13 @@
1
1
  ---
2
- # Might not elaborate all 2.1 specific ASTs but the only 2.1 lib I know
2
+ - name: anima
3
+ repo_uri: 'https://github.com/mbj/anima.git'
4
+ exclude: []
5
+ - name: mutant
6
+ repo_uri: 'https://github.com/mbj/mutant.git'
7
+ exclude: []
8
+ - name: yaks
9
+ repo_uri: 'https://github.com/plexus/yaks.git'
10
+ exclude: []
3
11
  - name: chassis
4
12
  repo_uri: 'https://github.com/ahawkins/chassis.git'
5
13
  exclude: []
@@ -18,6 +26,8 @@
18
26
  - core/io/readpartial_spec.rb
19
27
  - core/env/element_reference_spec.rb
20
28
  - core/dir/pwd_spec.rb
29
+ - core/regexp/shared/new_ascii_8bit.rb
30
+ - core/regexp/encoding_spec.rb
21
31
  - core/string/casecmp_spec.rb
22
32
  - core/string/unpack/{b,c,h,m,u,w}_spec.rb
23
33
  - core/string/unpack/b_spec.rb
@@ -46,10 +46,21 @@ describe Unparser do
46
46
  Unparser.unparse(ast, comments).should eql(expected)
47
47
  end
48
48
 
49
+ def self.assert_unterminated(expression)
50
+ assert_source(expression)
51
+ assert_source("(#{expression}).foo")
52
+ end
53
+
54
+ def self.assert_terminated(expression, rubies = RUBIES)
55
+ assert_source(expression, rubies)
56
+ assert_source("foo(#{expression})", rubies)
57
+ assert_source("#{expression}.foo", rubies)
58
+ end
59
+
49
60
  def self.assert_generates(ast_or_string, expected, versions = RUBIES)
50
61
  with_versions(versions) do |parser|
51
62
  it "should generate #{ast_or_string} as #{expected} under #{parser.inspect}" do
52
- if ast_or_string.kind_of?(String)
63
+ if ast_or_string.is_a?(String)
53
64
  expected = strip(expected)
54
65
  assert_generates_from_string(parser, ast_or_string, expected)
55
66
  else
@@ -88,11 +99,11 @@ describe Unparser do
88
99
  end
89
100
 
90
101
  context 'literal' do
91
- context 'fixnum' do
92
- assert_generates s(:int, 1), '1'
93
- assert_generates s(:int, -1), '-1'
94
- assert_source '1'
102
+ context 'int' do
103
+ assert_generates '-0', '0'
95
104
  assert_source '++1'
105
+ assert_terminated '1'
106
+ assert_unterminated '-1'
96
107
  assert_generates '0x1', '1'
97
108
  assert_generates '1_000', '1000'
98
109
  assert_generates '1e10', '10000000000.0'
@@ -100,20 +111,42 @@ describe Unparser do
100
111
  assert_generates '-10e10000000000', '-Float::INFINITY'
101
112
  end
102
113
 
114
+ context 'rational' do
115
+ assert_terminated '1r', %w(2.1)
116
+ assert_generates '1.0r', '1r', %w(2.1)
117
+ assert_generates '-0r', '0r', %w(2.1)
118
+
119
+ assert_terminated '1.5r', %w(2.1)
120
+ assert_terminated '1.3r', %w(2.1)
121
+ end
122
+
123
+ context 'rational' do
124
+ %w(
125
+ 5i
126
+ -5i
127
+ 0.6i
128
+ -0.6i
129
+ 1000000000000000000000000000000i
130
+ 1ri
131
+ ).each do |expression|
132
+ assert_terminated(expression, %w(2.1))
133
+ end
134
+ end
135
+
103
136
  context 'string' do
104
137
  assert_generates '?c', '"c"'
105
- assert_generates %q("foo" "bar"), %q("foobar")
106
- assert_generates %q(%Q(foo"#{@bar})), %q("foo\\"#{@bar}")
107
- assert_source %q("\"")
108
- assert_source %q("foo#{1}bar")
109
- assert_source %q("\"#{@a}")
110
- assert_source %q("\\\\#{}")
111
- assert_source %q("foo bar")
112
- assert_source %q("foo\nbar")
113
- assert_source %q("foo bar #{}")
114
- assert_source %q("foo\nbar #{}")
115
- assert_source %q("#{}\#{}")
116
- assert_source %q("\#{}#{}")
138
+ assert_generates '"foo" "bar"', '"foobar"'
139
+ assert_generates '%Q(foo"#{@bar})', '"foo\\"#{@bar}"'
140
+ assert_terminated '"\""'
141
+ assert_terminated '"foo#{1}bar"'
142
+ assert_terminated '"\"#{@a}"'
143
+ assert_terminated '"\\\\#{}"'
144
+ assert_terminated '"foo bar"'
145
+ assert_terminated '"foo\nbar"'
146
+ assert_terminated '"foo bar #{}"'
147
+ assert_terminated '"foo\nbar #{}"'
148
+ assert_terminated '"#{}\#{}"'
149
+ assert_terminated '"\#{}#{}"'
117
150
  # Within indentation
118
151
  assert_generates <<-'RUBY', <<-'RUBY'
119
152
  if foo
@@ -127,36 +160,38 @@ describe Unparser do
127
160
  end
128
161
  RUBY
129
162
 
130
- assert_source %q("foo#{@bar}")
131
- assert_source %q("fo\no#{bar}b\naz")
163
+ assert_terminated '"foo#{@bar}"'
164
+ assert_terminated '"fo\no#{bar}b\naz"'
132
165
  end
133
166
 
134
167
  context 'execute string' do
135
- assert_source '`foo`'
136
- assert_source '`foo#{@bar}`'
168
+ assert_terminated '`foo`'
169
+ assert_terminated '`foo#{@bar}`'
137
170
  assert_generates '%x(\))', '`)`'
138
171
  # FIXME: Research into this one!
139
172
  # assert_generates '%x(`)', '`\``'
140
- assert_source '`"`'
173
+ assert_terminated '`"`'
141
174
  end
142
175
 
143
176
  context 'symbol' do
144
177
  assert_generates s(:sym, :foo), ':foo'
145
178
  assert_generates s(:sym, :"A B"), ':"A B"'
146
- assert_source ':foo'
147
- assert_source ':"A B"'
148
- assert_source ':"A\"B"'
149
- assert_source ':""'
179
+ assert_terminated ':foo'
180
+ assert_terminated ':"A B"'
181
+ assert_terminated ':"A\"B"'
182
+ assert_terminated ':""'
150
183
  end
151
184
 
152
185
  context 'regexp' do
153
- assert_source '/foo/'
154
- assert_source %q(/[^-+',.\/:@[:alnum:]\[\]\x80-\xff]+/)
155
- assert_source '/foo#{@bar}/'
156
- assert_source '/foo#{@bar}/imx'
157
- assert_source "/\n/"
158
- assert_source '/\n/'
159
- assert_source "/\n/x"
186
+ assert_terminated '/foo/'
187
+ assert_terminated %q(/[^-+',.\/:@[:alnum:]\[\]\x80-\xff]+/)
188
+ assert_terminated '/foo#{@bar}/'
189
+ assert_terminated '/foo#{@bar}/imx'
190
+ assert_terminated '/#{"\x00"}/', %w(1.9)
191
+ assert_terminated '/#{"\u0000"}/', %w(2.0 2.1)
192
+ assert_terminated "/\n/"
193
+ assert_terminated '/\n/'
194
+ assert_terminated "/\n/x"
160
195
  # Within indentation
161
196
  assert_source <<-RUBY
162
197
  if foo
@@ -167,31 +202,32 @@ describe Unparser do
167
202
  assert_generates '%r(/)', '/\//'
168
203
  assert_generates '%r(\))', '/)/'
169
204
  assert_generates '%r(#{@bar}baz)', '/#{@bar}baz/'
170
- assert_source '/\/\//x'
205
+ assert_terminated '/\/\//x'
171
206
  end
172
207
 
173
208
  context 'dynamic symbol' do
174
- assert_source ':"foo#{bar}baz"'
175
- assert_source ':"fo\no#{bar}b\naz"'
176
- assert_source ':"#{bar}foo"'
177
- assert_source ':"foo#{bar}"'
209
+ assert_terminated ':"foo#{bar}baz"'
210
+ assert_terminated ':"fo\no#{bar}b\naz"'
211
+ assert_terminated ':"#{bar}foo"'
212
+ assert_terminated ':"#{"foo"}"'
213
+ assert_terminated ':"foo#{bar}"'
178
214
  end
179
215
 
180
216
  context 'irange' do
181
- assert_generates '1..2', %q(1..2)
182
- assert_source '(0.0 / 0.0)..1'
183
- assert_source '1..(0.0 / 0.0)'
184
- assert_source '(0.0 / 0.0)..100'
217
+ assert_unterminated '1..2'
218
+ assert_unterminated '(0.0 / 0.0)..1'
219
+ assert_unterminated '1..(0.0 / 0.0)'
220
+ assert_unterminated '(0.0 / 0.0)..100'
185
221
  end
186
222
 
187
223
  context 'erange' do
188
- assert_generates '1...2', %q(1...2)
224
+ assert_unterminated '1...2'
189
225
  end
190
226
 
191
227
  context 'float' do
192
228
  assert_source '-0.1'
193
- assert_source '0.1'
194
- assert_source '0.1'
229
+ assert_terminated '0.1'
230
+ assert_terminated '0.1'
195
231
  assert_generates '10.2e10000000000', 'Float::INFINITY'
196
232
  assert_generates '-10.2e10000000000', '-Float::INFINITY'
197
233
  assert_generates s(:float, -0.1), '-0.1'
@@ -199,18 +235,18 @@ describe Unparser do
199
235
  end
200
236
 
201
237
  context 'array' do
202
- assert_source '[1, 2]'
203
- assert_source '[1, (), n2]'
204
- assert_source '[1]'
205
- assert_source '[]'
206
- assert_source '[1, *@foo]'
207
- assert_source '[*@foo, 1]'
208
- assert_source '[*@foo, *@baz]'
209
- assert_generates '%w(foo bar)', %q(["foo", "bar"])
238
+ assert_terminated '[1, 2]'
239
+ assert_terminated '[1, (), n2]'
240
+ assert_terminated '[1]'
241
+ assert_terminated '[]'
242
+ assert_terminated '[1, *@foo]'
243
+ assert_terminated '[*@foo, 1]'
244
+ assert_terminated '[*@foo, *@baz]'
245
+ assert_generates '%w(foo bar)', '["foo", "bar"]'
210
246
  end
211
247
 
212
248
  context 'hash' do
213
- assert_source '{}'
249
+ assert_terminated '{}'
214
250
  assert_source '{ () => () }'
215
251
  assert_source '{ 1 => 2 }'
216
252
  assert_source '{ 1 => 2, 3 => 4 }'
@@ -219,7 +255,7 @@ describe Unparser do
219
255
  assert_source "{ foo: (if true\nend) }"
220
256
 
221
257
  context 'with symbol keys' do
222
- assert_source '{ a: (1 rescue(foo)), b: 2 }'
258
+ assert_source '{ a: (1 rescue foo), b: 2 }'
223
259
  assert_source '{ a: 1, b: 2 }'
224
260
  assert_source '{ a: :a }'
225
261
  assert_source '{ :"a b" => 1 }'
@@ -229,30 +265,21 @@ describe Unparser do
229
265
  end
230
266
 
231
267
  context 'access' do
232
- assert_source '@a'
233
- assert_source '@@a'
234
- assert_source '$a'
235
- assert_source '$1'
236
- assert_source '$`'
237
- assert_source 'CONST'
238
- assert_source 'SCOPED::CONST'
239
- assert_source '::TOPLEVEL'
240
- assert_source '::TOPLEVEL::CONST'
241
- end
242
-
243
- context 'retry' do
244
- assert_source 'retry'
268
+ %w(@a @@a $a $1 $` CONST SCOPED::CONST ::TOPLEVEL ::TOPLEVEL::CONST).each do |expression|
269
+ assert_terminated(expression)
270
+ end
245
271
  end
246
272
 
247
- context 'redo' do
248
- assert_source 'redo'
273
+ context 'control keywords' do
274
+ %w(retry redo).each do |expression|
275
+ assert_terminated(expression)
276
+ end
249
277
  end
250
278
 
251
279
  context 'singletons' do
252
- assert_source 'self'
253
- assert_source 'true'
254
- assert_source 'false'
255
- assert_source 'nil'
280
+ %w(self true false nil).each do |expression|
281
+ assert_terminated(expression)
282
+ end
256
283
  end
257
284
 
258
285
  context 'magic keywords' do
@@ -263,17 +290,17 @@ describe Unparser do
263
290
 
264
291
  context 'assignment' do
265
292
  context 'single' do
266
- assert_source 'a = 1'
267
- assert_source '@a = 1'
268
- assert_source '@@a = 1'
269
- assert_source '$a = 1'
270
- assert_source 'CONST = 1'
271
- assert_source 'Name::Spaced::CONST = 1'
272
- assert_source '::Foo = ::Bar'
293
+ assert_unterminated 'a = 1'
294
+ assert_unterminated '@a = 1'
295
+ assert_unterminated '@@a = 1'
296
+ assert_unterminated '$a = 1'
297
+ assert_unterminated 'CONST = 1'
298
+ assert_unterminated 'Name::Spaced::CONST = 1'
299
+ assert_unterminated '::Foo = ::Bar'
273
300
  end
274
301
 
275
302
  context 'lvar assigned from method with same name' do
276
- assert_source 'foo = foo()'
303
+ assert_unterminated 'foo = foo()'
277
304
  end
278
305
 
279
306
  context 'lvar introduction from condition' do
@@ -339,32 +366,33 @@ describe Unparser do
339
366
  end
340
367
 
341
368
  context 'multiple' do
342
- assert_source 'a, b = [1, 2]'
343
- assert_source 'a, *foo = [1, 2]'
344
369
  assert_source 'a, * = [1, 2]'
345
- assert_source '*foo = [1, 2]'
370
+ assert_source 'a, *foo = [1, 2]'
346
371
  assert_source '*a = []'
347
- assert_source '@a, @b = [1, 2]'
348
- assert_source 'a.foo, a.bar = [1, 2]'
349
- assert_source 'a[0, 2]'
350
- assert_source 'a[0], a[1] = [1, 2]'
351
- assert_source 'a[*foo], a[1] = [1, 2]'
352
- assert_source '@@a, @@b = [1, 2]'
353
- assert_source '$a, $b = [1, 2]'
354
- assert_source 'a, b = foo'
355
- assert_source 'a, (b, c) = [1, [2, 3]]'
372
+ assert_source '*foo = [1, 2]'
356
373
  assert_source 'a, = foo'
374
+ assert_unterminated 'a, b = [1, 2]'
375
+ assert_unterminated '@a, @b = [1, 2]'
376
+ assert_unterminated 'a.foo, a.bar = [1, 2]'
377
+ assert_unterminated 'a[0], a[1] = [1, 2]'
378
+ assert_unterminated 'a[*foo], a[1] = [1, 2]'
379
+ assert_unterminated '@@a, @@b = [1, 2]'
380
+ assert_unterminated '$a, $b = [1, 2]'
381
+ assert_unterminated 'a, b = foo'
382
+ assert_unterminated 'a, (b, c) = [1, [2, 3]]'
383
+ assert_unterminated 'a = (b, c = 1)'
384
+ assert_unterminated '(a,), b = 1'
357
385
  end
358
386
  end
359
387
 
360
388
  %w(next return break).each do |keyword|
361
389
 
362
390
  context keyword do
363
- assert_source "#{keyword}"
364
- assert_source "#{keyword} 1"
365
- assert_source "#{keyword} 2, 3"
366
- assert_source "#{keyword} *nil"
367
- assert_source "#{keyword} *foo, bar"
391
+ assert_terminated "#{keyword}"
392
+ assert_unterminated "#{keyword} 1"
393
+ assert_unterminated "#{keyword} 2, 3"
394
+ assert_unterminated "#{keyword} *nil"
395
+ assert_unterminated "#{keyword} *foo, bar"
368
396
 
369
397
  assert_generates <<-RUBY, <<-RUBY
370
398
  foo do |bar|
@@ -391,19 +419,19 @@ describe Unparser do
391
419
  end
392
420
 
393
421
  context 'send' do
394
- assert_source 'foo'
395
- assert_source 'self.foo'
396
- assert_source 'a.foo'
397
- assert_source 'A.foo'
398
- assert_source 'foo[]'
399
- assert_source 'foo[1]'
400
- assert_source 'foo[*baz]'
401
- assert_source 'foo(1)'
402
- assert_source 'foo(bar)'
403
- assert_source 'foo(&block)'
404
- assert_source 'foo(&(foo || bar))'
405
- assert_source 'foo(*arguments)'
406
- assert_source 'foo(*arguments)'
422
+ assert_terminated 'foo'
423
+ assert_terminated 'self.foo'
424
+ assert_terminated 'a.foo'
425
+ assert_terminated 'A.foo'
426
+ assert_terminated 'foo[]'
427
+ assert_terminated 'foo[1]'
428
+ assert_terminated 'foo[*baz]'
429
+ assert_terminated 'foo(1)'
430
+ assert_terminated 'foo(bar)'
431
+ assert_terminated 'foo(&block)'
432
+ assert_terminated 'foo(&(foo || bar))'
433
+ assert_terminated 'foo(*arguments)'
434
+ assert_terminated 'foo(*arguments)'
407
435
  assert_source <<-'RUBY'
408
436
  foo do
409
437
  end
@@ -493,40 +521,11 @@ describe Unparser do
493
521
  end.baz
494
522
  RUBY
495
523
 
496
- assert_source '(1..2).max'
497
- assert_source '1..2.max'
498
- assert_source '(a = b).bar'
499
- assert_source '@ivar.bar'
500
- assert_source '//.bar'
501
- assert_source '$var.bar'
502
- assert_source '"".bar'
503
- assert_source 'defined?(@foo).bar'
504
- assert_source 'break.foo'
505
- assert_source 'next.foo'
506
- assert_source 'super(a).foo'
507
- assert_source 'a || return'
508
- assert_source 'super.foo'
509
- assert_source 'nil.foo'
510
- assert_source ':sym.foo'
511
- assert_source '1.foo'
512
- assert_source '1.0.foo'
513
- assert_source '[].foo'
514
- assert_source '{}.foo'
515
- assert_source 'false.foo'
516
- assert_source 'true.foo'
517
- assert_source 'self.foo'
518
- assert_source 'yield(a).foo'
519
- assert_source 'yield.foo'
520
- assert_source 'Foo::Bar.foo'
521
- assert_source '::BAZ.foo'
522
- assert_source 'foo[i].foo'
523
- assert_source '(foo[i] = 1).foo'
524
- assert_source 'foo[1..2].foo'
525
- assert_source '(a.attribute ||= foo).bar'
526
- assert_source 'foo.bar = baz[1]'
527
- assert_source 'foo.bar = (baz || foo)'
528
- assert_source 'foo.bar = baz.bar'
529
- assert_source 'foo << (bar * baz)'
524
+ assert_terminated '(1..2).max'
525
+ assert_terminated '1..2.max'
526
+ assert_unterminated 'a || return'
527
+ assert_unterminated 'foo << (bar * baz)'
528
+
530
529
  assert_source <<-'RUBY'
531
530
  foo ||= (a, _ = b)
532
531
  RUBY
@@ -601,28 +600,25 @@ describe Unparser do
601
600
  local.bar
602
601
  RUBY
603
602
 
604
- assert_source 'foo.bar(*args)'
605
- assert_source 'foo.bar(*arga, foo, *argb)'
606
- assert_source 'foo.bar(*args, foo)'
607
- assert_source 'foo.bar(foo, *args)'
608
- assert_source 'foo.bar(foo, *args, &block)'
603
+ assert_terminated 'foo.bar(*args)'
604
+ assert_terminated 'foo.bar(*arga, foo, *argb)'
605
+ assert_terminated 'foo.bar(*args, foo)'
606
+ assert_terminated 'foo.bar(foo, *args)'
607
+ assert_terminated 'foo.bar(foo, *args, &block)'
609
608
  assert_source <<-'RUBY'
610
609
  foo(bar, *args)
611
610
  RUBY
612
611
 
613
- assert_source <<-'RUBY'
614
- foo(*args, &block)
615
- RUBY
616
-
617
- assert_source 'foo.bar(&baz)'
618
- assert_source 'foo.bar(:baz, &baz)'
619
- assert_source 'foo.bar = :baz'
620
- assert_source 'self.foo = :bar'
612
+ assert_terminated 'foo(*args, &block)'
613
+ assert_terminated 'foo.bar(&baz)'
614
+ assert_terminated 'foo.bar(:baz, &baz)'
615
+ assert_terminated 'foo.bar = :baz'
616
+ assert_unterminated 'self.foo = :bar'
621
617
 
622
- assert_source 'foo.bar(baz: boz)'
623
- assert_source 'foo.bar(foo, "baz" => boz)'
624
- assert_source 'foo.bar({ foo: boz }, boz)'
625
- assert_source 'foo.bar(foo, {})'
618
+ assert_terminated 'foo.bar(baz: boz)'
619
+ assert_terminated 'foo.bar(foo, "baz" => boz)'
620
+ assert_terminated 'foo.bar({ foo: boz }, boz)'
621
+ assert_terminated 'foo.bar(foo, {})'
626
622
  end
627
623
 
628
624
  context 'begin; end' do
@@ -679,7 +675,7 @@ describe Unparser do
679
675
 
680
676
  assert_source <<-'RUBY'
681
677
  begin
682
- raise(Exception) rescue(foo = bar)
678
+ raise(Exception) rescue foo = bar
683
679
  rescue Exception
684
680
  end
685
681
  RUBY
@@ -720,19 +716,19 @@ describe Unparser do
720
716
 
721
717
  assert_source <<-'RUBY'
722
718
  class << self
723
- undef :bar rescue(nil)
719
+ undef :bar rescue nil
724
720
  end
725
721
  RUBY
726
722
 
727
723
  assert_source <<-'RUBY'
728
724
  module Foo
729
- undef :bar rescue(nil)
725
+ undef :bar rescue nil
730
726
  end
731
727
  RUBY
732
728
 
733
729
  assert_source <<-'RUBY'
734
730
  class Foo
735
- undef :bar rescue(nil)
731
+ undef :bar rescue nil
736
732
  end
737
733
  RUBY
738
734
 
@@ -811,34 +807,34 @@ describe Unparser do
811
807
  end
812
808
  RUBY
813
809
 
814
- assert_source 'foo rescue(bar)'
815
- assert_source 'foo rescue(return bar)'
816
- assert_source 'x = foo rescue(return bar)'
810
+ assert_source 'foo rescue bar'
811
+ assert_source 'foo rescue return bar'
812
+ assert_source 'x = (foo rescue return bar)'
817
813
 
818
814
  %w(while until if).each do |keyword|
819
815
  assert_source <<-RUBY
820
816
  #{keyword} (
821
- foo rescue(false)
817
+ foo rescue false
822
818
  )
823
819
  end
824
820
  RUBY
825
821
 
826
822
  assert_generates <<-RUBY, <<-GENERATED
827
- foo rescue(false) #{keyword} true
823
+ foo rescue false #{keyword} true
828
824
  RUBY
829
825
  #{keyword} true
830
- foo rescue(false)
826
+ foo rescue false
831
827
  end
832
828
  GENERATED
833
829
  end
834
830
 
835
831
  assert_generates <<-'RUBY', <<-GENERATED
836
- case (foo rescue(false))
832
+ case (foo rescue false)
837
833
  when true
838
834
  end
839
835
  RUBY
840
836
  case (
841
- foo rescue(false)
837
+ foo rescue false
842
838
  )
843
839
  when true
844
840
  end
@@ -1022,7 +1018,7 @@ describe Unparser do
1022
1018
  begin
1023
1019
  foo
1024
1020
  ensure
1025
- bar rescue(nil)
1021
+ bar rescue nil
1026
1022
  end
1027
1023
  RUBY
1028
1024
 
@@ -1304,6 +1300,7 @@ describe Unparser do
1304
1300
  %w(|= ||= &= &&= += -= *= /= **= %=).each do |op|
1305
1301
  assert_source "self.foo #{op} bar"
1306
1302
  assert_source "foo[key] #{op} bar"
1303
+ assert_source "a #{op} (true\nfalse)"
1307
1304
  end
1308
1305
  end
1309
1306
 
@@ -1351,13 +1348,12 @@ describe Unparser do
1351
1348
  end
1352
1349
 
1353
1350
  context 'match operators' do
1354
- assert_source <<-'RUBY'
1355
- /bar/ =~ foo
1356
- RUBY
1357
-
1358
- assert_source <<-'RUBY'
1359
- foo =~ /bar/
1360
- RUBY
1351
+ assert_source '/bar/ =~ foo'
1352
+ assert_source '/bar/ =~ :foo'
1353
+ assert_source '(/bar/ =~ :foo).foo'
1354
+ assert_source 'foo =~ /bar/'
1355
+ assert_source 'foo(foo =~ /bar/)'
1356
+ assert_source '(foo =~ /bar/).foo'
1361
1357
  end
1362
1358
 
1363
1359
  context 'binary operator methods' do
@@ -1480,6 +1476,11 @@ describe Unparser do
1480
1476
  end
1481
1477
 
1482
1478
  context 'for' do
1479
+ assert_source <<-'RUBY'
1480
+ bar(for a in bar do
1481
+ baz
1482
+ end)
1483
+ RUBY
1483
1484
  assert_source <<-'RUBY'
1484
1485
  for a in bar do
1485
1486
  baz
@@ -1519,6 +1520,12 @@ describe Unparser do
1519
1520
  end
1520
1521
 
1521
1522
  context 'post conditions' do
1523
+ assert_source <<-'RUBY'
1524
+ x = (begin
1525
+ foo
1526
+ end while baz)
1527
+ RUBY
1528
+
1522
1529
  assert_source <<-'RUBY'
1523
1530
  begin
1524
1531
  foo