sexp2ruby 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.travis.yml +1 -2
  4. data/README.md +9 -0
  5. data/lib/{sexp2ruby/core_extensions → core_extensions}/regexp.rb +0 -0
  6. data/lib/sexp2ruby/node/alias.rb +9 -0
  7. data/lib/sexp2ruby/node/and.rb +9 -0
  8. data/lib/sexp2ruby/node/arglist.rb +16 -0
  9. data/lib/sexp2ruby/node/args.rb +33 -0
  10. data/lib/sexp2ruby/node/array.rb +9 -0
  11. data/lib/sexp2ruby/node/attrasgn.rb +27 -0
  12. data/lib/sexp2ruby/node/back_ref.rb +9 -0
  13. data/lib/sexp2ruby/node/base.rb +36 -0
  14. data/lib/sexp2ruby/node/begin.rb +19 -0
  15. data/lib/sexp2ruby/node/block.rb +24 -0
  16. data/lib/sexp2ruby/node/block_pass.rb +10 -0
  17. data/lib/sexp2ruby/node/break.rb +14 -0
  18. data/lib/sexp2ruby/node/call.rb +70 -0
  19. data/lib/sexp2ruby/node/case.rb +27 -0
  20. data/lib/sexp2ruby/node/cdecl.rb +17 -0
  21. data/lib/sexp2ruby/node/class.rb +9 -0
  22. data/lib/sexp2ruby/node/colon2.rb +9 -0
  23. data/lib/sexp2ruby/node/colon3.rb +9 -0
  24. data/lib/sexp2ruby/node/const.rb +9 -0
  25. data/lib/sexp2ruby/node/cvar.rb +9 -0
  26. data/lib/sexp2ruby/node/cvasgn.rb +9 -0
  27. data/lib/sexp2ruby/node/cvdecl.rb +9 -0
  28. data/lib/sexp2ruby/node/defined.rb +9 -0
  29. data/lib/sexp2ruby/node/defn.rb +66 -0
  30. data/lib/sexp2ruby/node/defs.rb +17 -0
  31. data/lib/sexp2ruby/node/dot2.rb +9 -0
  32. data/lib/sexp2ruby/node/dot3.rb +9 -0
  33. data/lib/sexp2ruby/node/dregx.rb +19 -0
  34. data/lib/sexp2ruby/node/dregx_once.rb +9 -0
  35. data/lib/sexp2ruby/node/dstr.rb +9 -0
  36. data/lib/sexp2ruby/node/dsym.rb +9 -0
  37. data/lib/sexp2ruby/node/dxstr.rb +9 -0
  38. data/lib/sexp2ruby/node/ensure.rb +18 -0
  39. data/lib/sexp2ruby/node/evstr.rb +9 -0
  40. data/lib/sexp2ruby/node/false.rb +9 -0
  41. data/lib/sexp2ruby/node/flip2.rb +9 -0
  42. data/lib/sexp2ruby/node/flip3.rb +9 -0
  43. data/lib/sexp2ruby/node/for.rb +17 -0
  44. data/lib/sexp2ruby/node/gasgn.rb +9 -0
  45. data/lib/sexp2ruby/node/gvar.rb +9 -0
  46. data/lib/sexp2ruby/node/hash.rb +53 -0
  47. data/lib/sexp2ruby/node/iasgn.rb +14 -0
  48. data/lib/sexp2ruby/node/if.rb +41 -0
  49. data/lib/sexp2ruby/node/iter.rb +50 -0
  50. data/lib/sexp2ruby/node/ivar.rb +9 -0
  51. data/lib/sexp2ruby/node/kwsplat.rb +9 -0
  52. data/lib/sexp2ruby/node/lasgn.rb +11 -0
  53. data/lib/sexp2ruby/node/lit.rb +15 -0
  54. data/lib/sexp2ruby/node/lvar.rb +9 -0
  55. data/lib/sexp2ruby/node/masgn.rb +46 -0
  56. data/lib/sexp2ruby/node/match.rb +9 -0
  57. data/lib/sexp2ruby/node/match2.rb +11 -0
  58. data/lib/sexp2ruby/node/match3.rb +17 -0
  59. data/lib/sexp2ruby/node/module.rb +9 -0
  60. data/lib/sexp2ruby/node/next.rb +14 -0
  61. data/lib/sexp2ruby/node/nil.rb +9 -0
  62. data/lib/sexp2ruby/node/not.rb +9 -0
  63. data/lib/sexp2ruby/node/nth_ref.rb +9 -0
  64. data/lib/sexp2ruby/node/op_asgn1.rb +16 -0
  65. data/lib/sexp2ruby/node/op_asgn2.rb +17 -0
  66. data/lib/sexp2ruby/node/op_asgn_and.rb +13 -0
  67. data/lib/sexp2ruby/node/op_asgn_or.rb +13 -0
  68. data/lib/sexp2ruby/node/or.rb +9 -0
  69. data/lib/sexp2ruby/node/postexe.rb +9 -0
  70. data/lib/sexp2ruby/node/redo.rb +9 -0
  71. data/lib/sexp2ruby/node/resbody.rb +19 -0
  72. data/lib/sexp2ruby/node/rescue.rb +32 -0
  73. data/lib/sexp2ruby/node/retry.rb +9 -0
  74. data/lib/sexp2ruby/node/return.rb +13 -0
  75. data/lib/sexp2ruby/node/sclass.rb +9 -0
  76. data/lib/sexp2ruby/node/self.rb +9 -0
  77. data/lib/sexp2ruby/node/splat.rb +13 -0
  78. data/lib/sexp2ruby/node/str.rb +9 -0
  79. data/lib/sexp2ruby/node/super.rb +10 -0
  80. data/lib/sexp2ruby/node/svalue.rb +13 -0
  81. data/lib/sexp2ruby/node/to_ary.rb +9 -0
  82. data/lib/sexp2ruby/node/true.rb +9 -0
  83. data/lib/sexp2ruby/node/undef.rb +9 -0
  84. data/lib/sexp2ruby/node/until.rb +9 -0
  85. data/lib/sexp2ruby/node/valias.rb +9 -0
  86. data/lib/sexp2ruby/node/when.rb +24 -0
  87. data/lib/sexp2ruby/node/while.rb +9 -0
  88. data/lib/sexp2ruby/node/xstr.rb +9 -0
  89. data/lib/sexp2ruby/node/yield.rb +18 -0
  90. data/lib/sexp2ruby/node/zsuper.rb +9 -0
  91. data/lib/sexp2ruby/processor.rb +121 -912
  92. data/lib/sexp2ruby/version.rb +1 -1
  93. data/lib/sexp2ruby.rb +88 -1
  94. data/sexp2ruby.gemspec +1 -0
  95. data/spec/lib/processor_spec.rb +478 -1
  96. metadata +104 -8
  97. data/Rakefile +0 -92
  98. data/test/test_ruby2ruby.rb +0 -496
@@ -1,3 +1,3 @@
1
1
  module Sexp2Ruby
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/sexp2ruby.rb CHANGED
@@ -1,4 +1,91 @@
1
+ require "active_support/core_ext/string/inflections"
2
+ require "active_support/core_ext/module/delegation"
3
+ require "core_extensions/regexp"
1
4
  require "sexp2ruby/version"
2
5
  require "sexp2ruby/errors"
3
- require "sexp2ruby/core_extensions/regexp"
4
6
  require "sexp2ruby/processor"
7
+ require "sexp2ruby/node/base"
8
+ require "sexp2ruby/node/alias"
9
+ require "sexp2ruby/node/and"
10
+ require "sexp2ruby/node/arglist"
11
+ require "sexp2ruby/node/args"
12
+ require "sexp2ruby/node/array"
13
+ require "sexp2ruby/node/attrasgn"
14
+ require "sexp2ruby/node/back_ref"
15
+ require "sexp2ruby/node/begin"
16
+ require "sexp2ruby/node/block"
17
+ require "sexp2ruby/node/block_pass"
18
+ require "sexp2ruby/node/break"
19
+ require "sexp2ruby/node/call"
20
+ require "sexp2ruby/node/case"
21
+ require "sexp2ruby/node/cdecl"
22
+ require "sexp2ruby/node/class"
23
+ require "sexp2ruby/node/colon2"
24
+ require "sexp2ruby/node/colon3"
25
+ require "sexp2ruby/node/const"
26
+ require "sexp2ruby/node/cvar"
27
+ require "sexp2ruby/node/cvasgn"
28
+ require "sexp2ruby/node/cvdecl"
29
+ require "sexp2ruby/node/defined"
30
+ require "sexp2ruby/node/defn"
31
+ require "sexp2ruby/node/defs"
32
+ require "sexp2ruby/node/dot2"
33
+ require "sexp2ruby/node/dot3"
34
+ require "sexp2ruby/node/dregx"
35
+ require "sexp2ruby/node/dregx_once"
36
+ require "sexp2ruby/node/dstr"
37
+ require "sexp2ruby/node/dsym"
38
+ require "sexp2ruby/node/dxstr"
39
+ require "sexp2ruby/node/ensure"
40
+ require "sexp2ruby/node/evstr"
41
+ require "sexp2ruby/node/false"
42
+ require "sexp2ruby/node/flip2"
43
+ require "sexp2ruby/node/flip3"
44
+ require "sexp2ruby/node/for"
45
+ require "sexp2ruby/node/gasgn"
46
+ require "sexp2ruby/node/gvar"
47
+ require "sexp2ruby/node/hash"
48
+ require "sexp2ruby/node/iasgn"
49
+ require "sexp2ruby/node/if"
50
+ require "sexp2ruby/node/iter"
51
+ require "sexp2ruby/node/ivar"
52
+ require "sexp2ruby/node/kwsplat"
53
+ require "sexp2ruby/node/lasgn"
54
+ require "sexp2ruby/node/lit"
55
+ require "sexp2ruby/node/lvar"
56
+ require "sexp2ruby/node/masgn"
57
+ require "sexp2ruby/node/match"
58
+ require "sexp2ruby/node/match2"
59
+ require "sexp2ruby/node/match3"
60
+ require "sexp2ruby/node/module"
61
+ require "sexp2ruby/node/next"
62
+ require "sexp2ruby/node/nil"
63
+ require "sexp2ruby/node/not"
64
+ require "sexp2ruby/node/nth_ref"
65
+ require "sexp2ruby/node/op_asgn1"
66
+ require "sexp2ruby/node/op_asgn2"
67
+ require "sexp2ruby/node/op_asgn_and"
68
+ require "sexp2ruby/node/op_asgn_or"
69
+ require "sexp2ruby/node/or"
70
+ require "sexp2ruby/node/postexe"
71
+ require "sexp2ruby/node/redo"
72
+ require "sexp2ruby/node/resbody"
73
+ require "sexp2ruby/node/rescue"
74
+ require "sexp2ruby/node/retry"
75
+ require "sexp2ruby/node/return"
76
+ require "sexp2ruby/node/sclass"
77
+ require "sexp2ruby/node/self"
78
+ require "sexp2ruby/node/splat"
79
+ require "sexp2ruby/node/str"
80
+ require "sexp2ruby/node/super"
81
+ require "sexp2ruby/node/svalue"
82
+ require "sexp2ruby/node/to_ary"
83
+ require "sexp2ruby/node/true"
84
+ require "sexp2ruby/node/undef"
85
+ require "sexp2ruby/node/until"
86
+ require "sexp2ruby/node/valias"
87
+ require "sexp2ruby/node/when"
88
+ require "sexp2ruby/node/while"
89
+ require "sexp2ruby/node/xstr"
90
+ require "sexp2ruby/node/yield"
91
+ require "sexp2ruby/node/zsuper"
data/sexp2ruby.gemspec CHANGED
@@ -23,6 +23,7 @@ It is a fork of ruby2ruby with slightly different goals.
23
23
 
24
24
  spec.required_ruby_version = ">= 1.9.3"
25
25
 
26
+ spec.add_runtime_dependency "activesupport", "~> 4.2"
26
27
  spec.add_runtime_dependency "sexp_processor", "~> 4.6"
27
28
 
28
29
  spec.add_development_dependency "rspec-core", "~> 3.2"
@@ -113,13 +113,483 @@ module Sexp2Ruby
113
113
  end
114
114
 
115
115
  it "wraps method call with block (iter) in parens" do
116
- iter = s(:iter, s(:call, nil, :foo), s(:args), s(:str, "bar"))
116
+ iter = s(:iter, s(:call, nil, :foo), 0, s(:str, "bar"))
117
117
  inp = s(:hash, s(:lit, :k), iter)
118
118
  out = '{ :k => (foo { "bar" }) }'
119
119
  compare(inp, out, processor, false)
120
120
  end
121
121
  end
122
122
  end
123
+
124
+ it "and_alias" do
125
+ inn = s(:and, s(:true), s(:alias, s(:lit, :a), s(:lit, :b)))
126
+ out = "true and (alias :a :b)"
127
+ compare(inn, out, processor)
128
+ end
129
+
130
+ it "attr_reader_diff" do
131
+ inn = s(:defn, :same, s(:args), s(:ivar, :@diff))
132
+ out = "def same\n @diff\nend"
133
+ compare(inn, out, processor)
134
+ end
135
+
136
+ it "attr_reader_same" do
137
+ inn = s(:defn, :same, s(:args), s(:ivar, :@same))
138
+ out = "attr_reader :same"
139
+ compare(inn, out, processor, false)
140
+ end
141
+
142
+ it "attr_reader_double" do
143
+ inn = s(:defn, :same, s(:args), s(:ivar, :@same), s(:ivar, :@diff))
144
+ out = "def same\n @same\n @diff\nend"
145
+ compare(inn, out, processor)
146
+ end
147
+
148
+ it "attr_reader_same_name_diff_body" do
149
+ inn = s(:defn, :same, s(:args), s(:not, s(:ivar, :@same)))
150
+ out = "def same\n (not @same)\nend"
151
+ compare(inn, out, processor, false)
152
+ end
153
+
154
+ it "attr_writer_diff" do
155
+ inn = s(:defn, :same=, s(:args, :o), s(:iasgn, :@diff, s(:lvar, :o)))
156
+ out = "def same=(o)\n @diff = o\nend"
157
+ compare(inn, out, processor)
158
+ end
159
+
160
+ it "attr_writer_double" do
161
+ inn = s(:defn, :same=, s(:args, :o),
162
+ s(:iasgn, :@same, s(:lvar, :o)), s(:iasgn, :@diff, s(:lvar, :o)))
163
+ out = "def same=(o)\n @same = o\n @diff = o\nend"
164
+ compare(inn, out, processor)
165
+ end
166
+
167
+ it "attr_writer_same_name_diff_body" do
168
+ inn = s(:defn, :same=, s(:args, :o), s(:iasgn, :@same, s(:lit, 42)))
169
+ out = "def same=(o)\n @same = 42\nend"
170
+ compare(inn, out, processor)
171
+ end
172
+
173
+ it "attr_writer_same" do
174
+ inn = s(:defn, :same=, s(:args, :o), s(:iasgn, :@same , s(:lvar, :o)))
175
+ out = "attr_writer :same"
176
+ compare(inn, out, processor, false)
177
+ end
178
+
179
+ it "dregx_slash" do
180
+ inn = util_thingy(:dregx)
181
+ out = '/a"b#{(1 + 1)}c"d\/e/'
182
+ compare(inn, out, processor, false, /a"b2c"d\/e/)
183
+ end
184
+
185
+ it "dstr_quote" do
186
+ inn = util_thingy(:dstr)
187
+ out = '"a\"b#{(1 + 1)}c\"d/e"'
188
+ compare(inn, out, processor, true, 'a"b2c"d/e')
189
+ end
190
+
191
+ it "dsym_quote" do
192
+ inn = util_thingy(:dsym)
193
+ out = ':"a\"b#{(1 + 1)}c\"d/e"'
194
+ compare(inn, out, processor, true, :'a"b2c"d/e')
195
+ end
196
+
197
+ it "lit_regexp_slash" do
198
+ inp = s(:lit, /blah\/blah/)
199
+ compare(inp, '/blah\/blah/', processor, false, /blah\/blah/)
200
+ end
201
+
202
+ it "call_kwsplat" do
203
+ inn = s(:call, nil, :test_splat, s(:hash, s(:kwsplat, s(:call, nil, :testing))))
204
+ out = "test_splat(**testing)"
205
+ compare(inn, out, processor)
206
+ end
207
+
208
+ it "call_arg_assoc_kwsplat" do
209
+ inn = s(:call, nil, :f,
210
+ s(:lit, 1),
211
+ s(:hash, s(:lit, :kw), s(:lit, 2), s(:kwsplat, s(:lit, 3))))
212
+ out = "f(1, :kw => 2, **3)"
213
+
214
+ compare(inn, out, processor)
215
+ end
216
+
217
+ it "call_kwsplat_x" do
218
+ inn = s(:call, nil, :a, s(:hash, s(:kwsplat, s(:lit, 1))))
219
+ out = "a(**1)"
220
+
221
+ compare(inn, out, processor)
222
+ end
223
+
224
+ it "defn_kwargs" do
225
+ inn = s(:defn, :initialize,
226
+ s(:args, :arg, s(:kwarg, :keyword, s(:nil)), :"**args"),
227
+ s(:nil))
228
+ out = "def initialize(arg, keyword: nil, **args)\n # do nothing\nend"
229
+
230
+ compare(inn, out, processor)
231
+ end
232
+
233
+ it "defn_kwargs2" do
234
+ inn = s(:defn, :initialize,
235
+ s(:args, :arg,
236
+ s(:kwarg, :kw1, s(:nil)),
237
+ s(:kwarg, :kw2, s(:nil)),
238
+ :"**args"),
239
+ s(:nil))
240
+ out = "def initialize(arg, kw1: nil, kw2: nil, **args)\n # do nothing\nend"
241
+
242
+ compare(inn, out, processor)
243
+ end
244
+
245
+ it "call_self_index" do
246
+ compare(s(:call, nil, :[], s(:lit, 42)), "self[42]", processor)
247
+ end
248
+
249
+ it "call_self_index_equals" do
250
+ inp = s(:attrasgn, s(:self), :[]=, s(:lit, 42), s(:lit, 24))
251
+ compare(inp, "self[42] = 24", processor)
252
+ end
253
+
254
+ it "call_self_index_equals_array" do
255
+ inp = s(:attrasgn, s(:self), :[]=, s(:lit, 1), s(:lit, 2), s(:lit, 3))
256
+ compare(inp, "self[1, 2] = 3", processor)
257
+ end
258
+
259
+ it "call_arglist_hash_first" do
260
+ inn = s(:call, nil, :method,
261
+ s(:hash, s(:lit, :a), s(:lit, 1)),
262
+ s(:call, nil, :b))
263
+ out = "method({ :a => 1 }, b)"
264
+
265
+ compare(inn, out, processor)
266
+ end
267
+
268
+ it "call_arglist_hash_first_last" do
269
+ inn = s(:call, nil, :method,
270
+ s(:hash, s(:lit, :a), s(:lit, 1)),
271
+ s(:call, nil, :b),
272
+ s(:hash, s(:lit, :c), s(:lit, 1)))
273
+ out = "method({ :a => 1 }, b, :c => 1)"
274
+
275
+ compare(inn, out, processor)
276
+ end
277
+
278
+ it "call_arglist_hash_last" do
279
+ inn = s(:call, nil, :method,
280
+ s(:call, nil, :b),
281
+ s(:hash, s(:lit, :a), s(:lit, 1)))
282
+ out = "method(b, :a => 1)"
283
+
284
+ compare(inn, out, processor)
285
+ end
286
+
287
+ it "call_arglist_if" do
288
+ inn = s(:call,
289
+ s(:call, nil, :a),
290
+ :+,
291
+ s(:if,
292
+ s(:call, nil, :b),
293
+ s(:call, nil, :c),
294
+ s(:call, nil, :d)))
295
+
296
+ out = "(a + (b ? (c) : (d)))"
297
+ compare(inn, out, processor)
298
+ end
299
+
300
+ it "defn_kwsplat" do
301
+ inn = s(:defn, :test, s(:args, :"**testing"), s(:nil))
302
+ out = "def test(**testing)\n # do nothing\nend"
303
+ compare(inn, out, processor)
304
+ end
305
+
306
+ it "defn_rescue_return" do
307
+ inn = s(:defn, :blah, s(:args),
308
+ s(:rescue,
309
+ s(:lasgn, :a, s(:lit, 1)),
310
+ s(:resbody, s(:array), s(:return, s(:str, "a")))))
311
+ out = "def blah\n a = 1\nrescue\n return \"a\"\nend"
312
+
313
+ compare(inn, out, processor)
314
+ end
315
+
316
+ it "masgn_block_arg" do
317
+ inn = s(:iter,
318
+ s(:call,
319
+ s(:nil),
320
+ :x),
321
+ s(:args, s(:masgn, :a, :b)),
322
+ s(:dstr, "",
323
+ s(:evstr, s(:lvar, :a)),
324
+ s(:str, "="),
325
+ s(:evstr, s(:lvar, :b))))
326
+ out = 'nil.x { |(a, b)| "#{a}=#{b}" }'
327
+
328
+ compare(inn, out, processor)
329
+ end
330
+
331
+ it "masgn_wtf" do
332
+ inn = s(:block,
333
+ s(:masgn,
334
+ s(:array, s(:lasgn, :k), s(:lasgn, :v)),
335
+ s(:splat,
336
+ s(:call,
337
+ s(:call, nil, :line),
338
+ :split,
339
+ s(:lit, /\=/), s(:lit, 2)))),
340
+ s(:attrasgn,
341
+ s(:self),
342
+ :[]=,
343
+ s(:lvar, :k),
344
+ s(:call, s(:lvar, :v), :strip)))
345
+
346
+ out = "k, v = *line.split(/\\=/, 2)\nself[k] = v.strip\n"
347
+
348
+ compare(inn, out, processor)
349
+ end
350
+
351
+ it "masgn_splat_wtf" do
352
+ inn = s(:masgn,
353
+ s(:array, s(:lasgn, :k), s(:lasgn, :v)),
354
+ s(:splat,
355
+ s(:call,
356
+ s(:call, nil, :line),
357
+ :split,
358
+ s(:lit, /\=/), s(:lit, 2))))
359
+ out = 'k, v = *line.split(/\\=/, 2)'
360
+ compare(inn, out, processor)
361
+ end
362
+
363
+ it "match3_asgn" do
364
+ inn = s(:match3, s(:lit, //), s(:lasgn, :y, s(:call, nil, :x)))
365
+ out = "(y = x) =~ //"
366
+ # "y = x =~ //", which matches on x and assigns to y (not what sexp says).
367
+ compare(inn, out, processor)
368
+ end
369
+
370
+ it "splat_call" do
371
+ inn = s(:call, nil, :x,
372
+ s(:splat,
373
+ s(:call,
374
+ s(:call, nil, :line),
375
+ :split,
376
+ s(:lit, /\=/), s(:lit, 2))))
377
+
378
+ out = 'x(*line.split(/\=/, 2))'
379
+ compare(inn, out, processor)
380
+ end
381
+
382
+ it "resbody_block" do
383
+ inn = s(:rescue,
384
+ s(:call, nil, :x1),
385
+ s(:resbody,
386
+ s(:array),
387
+ s(:call, nil, :x2),
388
+ s(:call, nil, :x3)))
389
+
390
+ out = "begin\n x1\nrescue\n x2\n x3\nend"
391
+ compare(inn, out, processor)
392
+ end
393
+
394
+ it "resbody_short_with_begin_end" do
395
+ # "begin; blah; rescue; []; end"
396
+ inn = s(:rescue,
397
+ s(:call, nil, :blah),
398
+ s(:resbody, s(:array), s(:array)))
399
+ out = "blah rescue []"
400
+ compare(inn, out, processor)
401
+ end
402
+
403
+ it "resbody_short_with_begin_end_multiple" do
404
+ # "begin; blah; rescue; []; end"
405
+ inn = s(:rescue,
406
+ s(:call, nil, :blah),
407
+ s(:resbody, s(:array),
408
+ s(:call, nil, :log),
409
+ s(:call, nil, :raise)))
410
+ out = "begin\n blah\nrescue\n log\n raise\nend"
411
+ compare(inn, out, processor)
412
+ end
413
+
414
+ it "resbody_short_with_defn_multiple" do
415
+ inn = s(:defn,
416
+ :foo,
417
+ s(:args),
418
+ s(:rescue,
419
+ s(:lasgn, :a, s(:lit, 1)),
420
+ s(:resbody,
421
+ s(:array),
422
+ s(:call, nil, :log),
423
+ s(:call, nil, :raise))))
424
+ out = "def foo\n a = 1\nrescue\n log\n raise\nend"
425
+ compare(inn, out, processor)
426
+ end
427
+
428
+ it "regexp_options" do
429
+ inn = s(:match3,
430
+ s(:dregx,
431
+ "abc",
432
+ s(:evstr, s(:call, nil, :x)),
433
+ s(:str, "def"),
434
+ 4),
435
+ s(:str, "a"))
436
+ out = '"a" =~ /abc#{x}def/m'
437
+ compare(inn, out, processor)
438
+ end
439
+
440
+ it "resbody_short_with_rescue_args" do
441
+ inn = s(:rescue,
442
+ s(:call, nil, :blah),
443
+ s(:resbody, s(:array, s(:const, :A), s(:const, :B)), s(:array)))
444
+ out = "begin\n blah\nrescue A, B\n []\nend"
445
+ compare(inn, out, processor)
446
+ end
447
+
448
+ it "call_binary_call_with_hash_arg" do
449
+ # if 42
450
+ # args << {:key => 24}
451
+ # end
452
+
453
+ inn = s(:if, s(:lit, 42),
454
+ s(:call, s(:call, nil, :args),
455
+ :<<,
456
+ s(:hash, s(:lit, :key), s(:lit, 24))),
457
+ nil)
458
+
459
+ out = "(args << { :key => 24 }) if 42"
460
+
461
+ compare(inn, out, processor)
462
+ end
463
+
464
+ it "binary_operators" do
465
+ # (1 > 2)
466
+ Node::Call::BINARY.each do |op|
467
+ inn = s(:call, s(:lit, 1), op, s(:lit, 2))
468
+ out = "(1 #{op} 2)"
469
+ compare(inn, out, processor)
470
+ end
471
+ end
472
+
473
+ it "call_empty_hash" do
474
+ inn = s(:call, nil, :foo, s(:hash))
475
+ out = "foo({})"
476
+ compare(inn, out, processor)
477
+ end
478
+
479
+ it "if_empty" do
480
+ inn = s(:if, s(:call, nil, :x), nil, nil)
481
+ out = "if x then\n # do nothing\nend"
482
+ compare(inn, out, processor)
483
+ end
484
+
485
+ it "interpolation_and_escapes" do
486
+ # log_entry = " \e[#{message_color}m#{message}\e[0m "
487
+ inn = s(:lasgn, :log_entry,
488
+ s(:dstr, " \e[",
489
+ s(:evstr, s(:call, nil, :message_color)),
490
+ s(:str, "m"),
491
+ s(:evstr, s(:call, nil, :message)),
492
+ s(:str, "\e[0m ")))
493
+ out = "log_entry = \" \e[#\{message_color}m#\{message}\e[0m \""
494
+
495
+ compare(inn, out, processor)
496
+ end
497
+
498
+ it "class_comments" do
499
+ inn = s(:class, :Z, nil)
500
+ inn.comments = "# x\n# y\n"
501
+ out = "# x\n# y\nclass Z\nend"
502
+ compare(inn, out, processor)
503
+ end
504
+
505
+ it "module_comments" do
506
+ inn = s(:module, :Z)
507
+ inn.comments = "# x\n# y\n"
508
+ out = "# x\n# y\nmodule Z\nend"
509
+ compare(inn, out, processor)
510
+ end
511
+
512
+ it "method_comments" do
513
+ inn = s(:defn, :z, s(:args), s(:nil))
514
+ inn.comments = "# x\n# y\n"
515
+ out = "# x\n# y\ndef z\n # do nothing\nend"
516
+ compare(inn, out, processor)
517
+ end
518
+
519
+ it "basic_ensure" do
520
+ inn = s(:ensure, s(:lit, 1), s(:lit, 2))
521
+ out = "begin\n 1\nensure\n 2\nend"
522
+ compare(inn, out, processor)
523
+ end
524
+
525
+ it "nested_ensure" do
526
+ inn = s(:ensure, s(:lit, 1), s(:ensure, s(:lit, 2), s(:lit, 3)))
527
+ out = "begin\n 1\nensure\n begin\n 2\n ensure\n 3\n end\nend"
528
+ compare(inn, out, processor)
529
+ end
530
+
531
+ it "nested_rescue" do
532
+ inn = s(:ensure, s(:lit, 1), s(:rescue, s(:lit, 2), s(:resbody, s(:array), s(:lit, 3))))
533
+ out = "begin\n 1\nensure\n 2 rescue 3\nend"
534
+ compare(inn, out, processor)
535
+ end
536
+
537
+ it "nested_rescue_exception" do
538
+ inn = s(:ensure, s(:lit, 1), s(:rescue, s(:lit, 2), s(:resbody, s(:array, s(:const, :Exception)), s(:lit, 3))))
539
+ out = "begin\n 1\nensure\n begin\n 2\n rescue Exception\n 3\n end\nend"
540
+ compare(inn, out, processor)
541
+ end
542
+
543
+ it "nested_rescue_exception2" do
544
+ inn = s(:ensure, s(:rescue, s(:lit, 2), s(:resbody, s(:array, s(:const, :Exception)), s(:lit, 3))), s(:lit, 1))
545
+ out = "begin\n 2\nrescue Exception\n 3\nensure\n 1\nend"
546
+ compare(inn, out, processor)
547
+ end
548
+
549
+ it "rescue_block" do
550
+ inn = s(:rescue,
551
+ s(:call, nil, :alpha),
552
+ s(:resbody, s(:array),
553
+ s(:call, nil, :beta),
554
+ s(:call, nil, :gamma)))
555
+ out = "begin\n alpha\nrescue\n beta\n gamma\nend"
556
+ compare(inn, out, processor)
557
+ end
558
+
559
+ it "array_adds_parens_around_rescue" do
560
+ inn = s(:array,
561
+ s(:call, nil, :a),
562
+ s(:rescue, s(:call, nil, :b), s(:resbody, s(:array), s(:call, nil, :c))))
563
+ out = "[a, (b rescue c)]"
564
+
565
+ compare(inn, out, processor)
566
+ end
567
+
568
+ it "call_arglist_rescue" do
569
+ inn = s(:call,
570
+ nil,
571
+ :method,
572
+ s(:rescue,
573
+ s(:call, nil, :a),
574
+ s(:resbody, s(:array), s(:call, nil, :b))))
575
+ out = "method((a rescue b))"
576
+ compare(inn, out, processor)
577
+ end
578
+
579
+ it "unless_vs_if_not" do
580
+ rb1 = "a unless b"
581
+ rb2 = "a if (not b)"
582
+ rb3 = "a if ! b"
583
+
584
+ compare(Ruby18Parser.new.parse(rb1), rb1, processor)
585
+ compare(Ruby19Parser.new.parse(rb1), rb1, processor)
586
+
587
+ compare(Ruby18Parser.new.parse(rb2), rb1, processor)
588
+ compare(Ruby19Parser.new.parse(rb2), rb2, processor)
589
+
590
+ compare(Ruby18Parser.new.parse(rb3), rb1, processor)
591
+ compare(Ruby19Parser.new.parse(rb3), rb2, processor)
592
+ end
123
593
  end
124
594
 
125
595
  describe "#ruby19_hash_key?" do
@@ -179,5 +649,12 @@ module Sexp2Ruby
179
649
  expect(eval(expected_ruby)).to eq(expected_eval)
180
650
  end
181
651
  end
652
+
653
+ def util_thingy(type)
654
+ s(type,
655
+ 'a"b',
656
+ s(:evstr, s(:call, s(:lit, 1), :+, s(:lit, 1))),
657
+ s(:str, 'c"d/e'))
658
+ end
182
659
  end
183
660
  end