ruby2ruby 2.4.2 → 2.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 831b366b64498b5f2783288fbccbf4feac9c87b80ab472f1d7561fb3c1a9a807
4
- data.tar.gz: a0a44de2c917acb356f92b0fb81c9bb97b68f255810b91218fb4ef4a57f7bd8a
3
+ metadata.gz: 3f72338e1430e938dcc3c0934ecef41cd7a1a589d8c67cde7419f05b9eb8b247
4
+ data.tar.gz: 2be6fc2a82fe2ca73fe59d9025ba6c3734d7571dcc867f2e3da800537cf71758
5
5
  SHA512:
6
- metadata.gz: 766278dc4ca1886b5a9e5dca83f2d025d21d16ec100423d784ad7992dee41f0fd1573a82c2535ddd592e278b109099dcc44d9663a4e33d5a7116c6f7e9f4df04
7
- data.tar.gz: 44875a9e97d38517f51adc6f16015d50f94d4daf854286f6ebc73b8f7dfb9fc446fb98408ac76680abfafe8746961177e47b1f16b794e59586d097ce137ef465
6
+ metadata.gz: fe9fe4523da05005533346ba4ba1806e3f1ba22c7d36faff48623d7827b108d4dc195ae77bf3124369fed874b28229cefcbfcc00d9c2596b7a638b2931d8f5c9
7
+ data.tar.gz: 314e0287a424263e3f05e013d06bde2e8f9c9b9dd3b69ce1d9c9358c820f23571c5a66cdd621200ff0315c25082886ef124f870f9fb9d38d403d607b2b77d747
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,10 +1,18 @@
1
- === 4.12.0 / 2019-03-12
1
+ === 2.4.3 / 2019-06-03
2
2
 
3
- * 3 bug fixes:
3
+ * 4 bug fixes:
4
+
5
+ * Added shadow block args. (jaynetics)
6
+ * Fixed generation for block args w/ trailing commas.
7
+ * Fixed nested masgn block args and arrays. (jaynetics)
8
+ * Fixes for stabby proc / lambda changes.
9
+
10
+ === 2.4.2 / 2019-03-12
11
+
12
+ * 2 bug fixes:
4
13
 
5
- * Fixed sexp_body to return empty sexp instead of nil when using STRICT_SEXP.
6
- * STRICT_SEXP=4+ fails w/ current use of concat. Removed concat from strictness for now.
7
- * Use concat internally instead of splat. Some people have 20000 node sexps! (presidentbeef)
14
+ * Rewrote process_masgn to fix problems with nesting masgn in block args.
15
+ * Use RubyParser directly instead of versioned parsers.
8
16
 
9
17
  === 2.4.1 / 2018-02-15
10
18
 
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby -w
2
2
 
3
- require 'rubygems'
4
- require 'sexp_processor'
3
+ require "rubygems"
4
+ require "sexp_processor"
5
5
 
6
6
  # :stopdoc:
7
7
  # REFACTOR: stolen from ruby_parser
@@ -15,13 +15,13 @@ class Regexp
15
15
 
16
16
  unless defined? CODES then
17
17
  CODES = {
18
- EXTENDED => 'x',
19
- IGNORECASE => 'i',
20
- MULTILINE => 'm',
21
- ENC_NONE => 'n',
22
- ENC_EUC => 'e',
23
- ENC_SJIS => 's',
24
- ENC_UTF8 => 'u',
18
+ EXTENDED => "x",
19
+ IGNORECASE => "i",
20
+ MULTILINE => "m",
21
+ ENC_NONE => "n",
22
+ ENC_EUC => "e",
23
+ ENC_SJIS => "s",
24
+ ENC_UTF8 => "u",
25
25
  }
26
26
  end
27
27
  end
@@ -31,13 +31,13 @@ end
31
31
  # Generate ruby code from a sexp.
32
32
 
33
33
  class Ruby2Ruby < SexpProcessor
34
- VERSION = "2.4.2" # :nodoc:
34
+ VERSION = "2.4.3" # :nodoc:
35
35
 
36
36
  # cutoff for one-liners
37
37
  LINE_LENGTH = 78
38
38
 
39
39
  # binary operation messages
40
- BINARY = [:<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :**, :'!=', :^, :|, :&]
40
+ BINARY = [:<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :**, :"!=", :^, :|, :&]
41
41
 
42
42
  ##
43
43
  # Nodes that represent assignment and probably need () around them.
@@ -76,7 +76,7 @@ class Ruby2Ruby < SexpProcessor
76
76
  :lvar,
77
77
  :nil,
78
78
  :str,
79
- :true
79
+ :true,
80
80
  ]
81
81
 
82
82
  def initialize # :nodoc:
@@ -118,6 +118,8 @@ class Ruby2Ruby < SexpProcessor
118
118
  def process_args exp # :nodoc:
119
119
  _, *args = exp
120
120
 
121
+ shadow = []
122
+
121
123
  args = args.map { |arg|
122
124
  case arg
123
125
  when Symbol then
@@ -131,15 +133,24 @@ class Ruby2Ruby < SexpProcessor
131
133
  when :kwarg then
132
134
  _, k, v = arg
133
135
  "#{k}: #{process v}"
136
+ when :shadow then
137
+ shadow << arg[1]
138
+ next
134
139
  else
135
140
  raise "unknown arg type #{arg.first.inspect}"
136
141
  end
142
+ when nil then
143
+ ""
137
144
  else
138
145
  raise "unknown arg type #{arg.inspect}"
139
146
  end
140
- }
147
+ }.compact
148
+
149
+ args = args.join(", ").strip
150
+ shadow = shadow.join(", ").strip
151
+ shadow = "; #{shadow}" unless shadow.empty?
141
152
 
142
- "(#{args.join ', '})"
153
+ "(%s%s)" % [args, shadow]
143
154
  end
144
155
 
145
156
  def process_array exp # :nodoc:
@@ -180,7 +191,7 @@ class Ruby2Ruby < SexpProcessor
180
191
 
181
192
  code = rest.map { |sexp|
182
193
  src = process sexp
183
- src = indent src unless src =~ /(^|\n)(rescue|ensure)/ # ensure no level 0 rescues
194
+ src = indent src unless src =~ /(^|\n)(rescue|ensure)/ # ensure no level 0 rescues
184
195
  src
185
196
  }
186
197
  code.unshift "begin"
@@ -238,7 +249,7 @@ class Ruby2Ruby < SexpProcessor
238
249
  @calls.push name
239
250
 
240
251
  in_context :arglist do
241
- max = args.size-1
252
+ max = args.size - 1
242
253
  args = args.map.with_index { |arg, i|
243
254
  arg_type = arg.sexp_type
244
255
  is_empty_hash = arg == s(:hash)
@@ -249,7 +260,7 @@ class Ruby2Ruby < SexpProcessor
249
260
  strip_hash = (arg_type == :hash and
250
261
  not BINARY.include? name and
251
262
  not is_empty_hash and
252
- (i == max or args[i+1].sexp_type == :splat))
263
+ (i == max or args[i + 1].sexp_type == :splat))
253
264
  wrap_arg = Ruby2Ruby::ASSIGN_NODES.include? arg_type
254
265
 
255
266
  arg = arg[2..-3] if strip_hash
@@ -262,19 +273,19 @@ class Ruby2Ruby < SexpProcessor
262
273
  case name
263
274
  when *BINARY then
264
275
  if safe_call
265
- "#{receiver}&.#{name}(#{args.join(', ')})"
276
+ "#{receiver}&.#{name}(#{args.join(", ")})"
266
277
  elsif args.length > 1
267
- "#{receiver}.#{name}(#{args.join(', ')})"
278
+ "#{receiver}.#{name}(#{args.join(", ")})"
268
279
  else
269
- "(#{receiver} #{name} #{args.join(', ')})"
280
+ "(#{receiver} #{name} #{args.join(", ")})"
270
281
  end
271
282
  when :[] then
272
283
  receiver ||= "self"
273
- "#{receiver}[#{args.join(', ')}]"
284
+ "#{receiver}[#{args.join(", ")}]"
274
285
  when :[]= then
275
286
  receiver ||= "self"
276
287
  rhs = args.pop
277
- "#{receiver}[#{args.join(', ')}] = #{rhs}"
288
+ "#{receiver}[#{args.join(", ")}] = #{rhs}"
278
289
  when :"!" then
279
290
  "(not #{receiver})"
280
291
  when :"-@" then
@@ -283,7 +294,7 @@ class Ruby2Ruby < SexpProcessor
283
294
  "+#{receiver}"
284
295
  else
285
296
  args = nil if args.empty?
286
- args = "(#{args.join(', ')})" if args
297
+ args = "(#{args.join(", ")})" if args
287
298
  receiver = "#{receiver}." if receiver and not safe_call
288
299
  receiver = "#{receiver}&." if receiver and safe_call
289
300
 
@@ -304,11 +315,11 @@ class Ruby2Ruby < SexpProcessor
304
315
 
305
316
  expr = process expr
306
317
 
307
- if expr then
308
- result << "case #{expr}"
309
- else
310
- result << "case"
311
- end
318
+ result << if expr then
319
+ "case #{expr}"
320
+ else
321
+ "case"
322
+ end
312
323
 
313
324
  result.concat rest.map { |pt|
314
325
  if pt and pt.sexp_type == :when
@@ -416,7 +427,7 @@ class Ruby2Ruby < SexpProcessor
416
427
  simple && body =~ /^\Abegin/ && body =~ /^end\z/
417
428
  body = indent(body) unless simple && body =~ /(^|\n)rescue/
418
429
 
419
- return "#{comm}def #{name}#{args}\n#{body}\nend".gsub(/\n\s*\n+/, "\n")
430
+ "#{comm}def #{name}#{args}\n#{body}\nend".gsub(/\n\s*\n+/, "\n")
420
431
  end
421
432
 
422
433
  def process_defs exp # :nodoc:
@@ -475,10 +486,10 @@ class Ruby2Ruby < SexpProcessor
475
486
  ens = process(ens) || "# do nothing"
476
487
  ens = "begin\n#{ens}\nend\n" if ens =~ /(^|\n)rescue/
477
488
 
478
- body.sub!(/\n\s*end\z/, '')
489
+ body.sub!(/\n\s*end\z/, "")
479
490
  body = indent(body) unless body =~ /(^|\n)rescue/
480
491
 
481
- return "#{body}\nensure\n#{indent ens}"
492
+ "#{body}\nensure\n#{indent ens}"
482
493
  end
483
494
 
484
495
  def process_evstr exp # :nodoc:
@@ -530,8 +541,6 @@ class Ruby2Ruby < SexpProcessor
530
541
  def process_hash(exp) # :nodoc:
531
542
  _, *pairs = exp
532
543
 
533
- result = []
534
-
535
544
  result = pairs.each_slice(2).map { |k, v|
536
545
  if k.sexp_type == :kwsplat then
537
546
  "%s" % process(k)
@@ -546,7 +555,7 @@ class Ruby2Ruby < SexpProcessor
546
555
  end
547
556
  }
548
557
 
549
- return result.empty? ? "{}" : "{ #{result.join(', ')} }"
558
+ result.empty? ? "{}" : "{ #{result.join(", ")} }"
550
559
  end
551
560
 
552
561
  def process_iasgn(exp) # :nodoc:
@@ -577,7 +586,7 @@ class Ruby2Ruby < SexpProcessor
577
586
  else
578
587
  r = "#{t} if #{c}"
579
588
  end
580
- return r if r and (@indent+r).size < LINE_LENGTH and r !~ /\n/
589
+ return r if r and (@indent + r).size < LINE_LENGTH and r !~ /\n/
581
590
  end
582
591
 
583
592
  r = "if #{c} then\n#{indent(t)}\n"
@@ -588,52 +597,74 @@ class Ruby2Ruby < SexpProcessor
588
597
  elsif f
589
598
  unless expand then
590
599
  r = "#{f} unless #{c}"
591
- return r if (@indent+r).size < LINE_LENGTH and r !~ /\n/
600
+ return r if (@indent + r).size < LINE_LENGTH and r !~ /\n/
592
601
  end
593
602
  "unless #{c} then\n#{indent(f)}\nend"
594
603
  else
595
604
  # empty if statement, just do it in case of side effects from condition
596
- "if #{c} then\n#{indent '# do nothing'}\nend"
605
+ "if #{c} then\n#{indent "# do nothing"}\nend"
597
606
  end
598
607
  end
599
608
 
609
+ def process_lambda exp # :nodoc:
610
+ "->"
611
+ end
612
+
600
613
  def process_iter(exp) # :nodoc:
601
614
  _, iter, args, body = exp
602
615
 
616
+ is_lambda = iter.sexp_type == :lambda
617
+
603
618
  iter = process iter
604
619
  body = process body if body
605
620
 
606
- args = case args
607
- when 0 then
621
+ args = case
622
+ when args == 0 then
608
623
  ""
624
+ when is_lambda then
625
+ " (#{process(args)[1..-2]})"
609
626
  else
610
627
  " |#{process(args)[1..-2]}|"
611
628
  end
612
629
 
613
630
  b, e = if iter == "END" then
614
- [ "{", "}" ]
631
+ %w[ { } ]
615
632
  else
616
- [ "do", "end" ]
633
+ %w[ do end ]
617
634
  end
618
635
 
619
- iter.sub!(/\(\)$/, '')
636
+ iter.sub!(/\(\)$/, "")
620
637
 
621
638
  # REFACTOR: ugh
622
639
  result = []
623
- result << "#{iter} {"
624
- result << args
625
- if body then
626
- result << " #{body.strip} "
640
+ if is_lambda then
641
+ result << iter
642
+ result << args
643
+ result << " {"
627
644
  else
628
- result << ' '
645
+ result << "#{iter} {"
646
+ result << args
629
647
  end
648
+ result << if body then
649
+ " #{body.strip} "
650
+ else
651
+ " "
652
+ end
630
653
  result << "}"
631
654
  result = result.join
632
655
  return result if result !~ /\n/ and result.size < LINE_LENGTH
633
656
 
634
657
  result = []
635
- result << "#{iter} #{b}"
636
- result << args
658
+
659
+ if is_lambda then
660
+ result << iter
661
+ result << args
662
+ result << " #{b}"
663
+ else
664
+ result << "#{iter} #{b}"
665
+ result << args
666
+ end
667
+
637
668
  result << "\n"
638
669
  if body then
639
670
  result << indent(body.strip)
@@ -677,43 +708,28 @@ class Ruby2Ruby < SexpProcessor
677
708
  end
678
709
 
679
710
  def process_masgn(exp) # :nodoc:
680
- _, (type, *), * = exp # ugly, but STRICT_SEXP=1+ requires this
681
-
682
- if type == :array then
683
- _, lhs, rhs = exp
684
-
685
- case exp.length
686
- when 3 then # a, b = c, d
687
- lhs = lhs.sexp_body.map { |e|
688
- process e
689
- }
690
-
691
- rhs = case rhs && rhs.sexp_type
692
- when :array then # a, b = [c, d]
693
- process(rhs)[1..-2]
694
- else # a, b = c
695
- process rhs
696
- end
697
- "%s = %s" % [lhs.join(", "), rhs]
698
- when 2 then # a, (b, c) = ...
699
- "(%s)" % [process(lhs)[1..-2]]
700
- else
701
- raise "unknown masgn length: %p" % [exp]
702
- end
703
- else # a { |(b, c)| ... }
704
- lhs = exp.sexp_body.map { |e|
705
- case e
706
- when Symbol then
707
- e
708
- when Sexp then
709
- process e
711
+ # s(:masgn, s(:array, s(:lasgn, :var), ...), s(:to_ary, <val>, ...))
712
+ # s(:iter, <call>, s(:args, s(:masgn, :a, :b)), <body>)
713
+ parenthesize = true
714
+
715
+ result = exp.sexp_body.map { |sexp|
716
+ case sexp
717
+ when Sexp then
718
+ if sexp.sexp_type == :array then
719
+ parenthesize = context.grep(:masgn).size > 1
720
+ res = process sexp
721
+
722
+ res[1..-2]
710
723
  else
711
- raise "unknown masgn type: %p" % [e]
724
+ process sexp
712
725
  end
713
- }
714
-
715
- "(%s)" % [lhs.join(", ")]
716
- end
726
+ when Symbol then
727
+ sexp
728
+ else
729
+ raise "unknown masgn: #{sexp.inspect}"
730
+ end
731
+ }
732
+ parenthesize ? "(#{result.join ", "})" : result.join(" = ")
717
733
  end
718
734
 
719
735
  def process_match exp # :nodoc:
@@ -811,14 +827,14 @@ class Ruby2Ruby < SexpProcessor
811
827
  # a &&= 1
812
828
  # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]]
813
829
  _, _lhs, rhs = exp
814
- process(rhs).sub(/\=/, '&&=')
830
+ process(rhs).sub(/\=/, "&&=")
815
831
  end
816
832
 
817
833
  def process_op_asgn_or(exp) # :nodoc:
818
834
  # a ||= 1
819
835
  # [[:lvar, :a], [:lasgn, :a, [:lit, 1]]]
820
836
  _, _lhs, rhs = exp
821
- process(rhs).sub(/\=/, '||=')
837
+ process(rhs).sub(/\=/, "||=")
822
838
  end
823
839
 
824
840
  def process_or(exp) # :nodoc:
@@ -856,10 +872,9 @@ class Ruby2Ruby < SexpProcessor
856
872
 
857
873
  def process_rescue exp # :nodoc:
858
874
  _, *rest = exp
859
- exp = nil
860
875
 
861
876
  body = process rest.shift unless rest.first.sexp_type == :resbody
862
- els = process rest.pop unless rest.last && rest.last.sexp_type == :resbody
877
+ els = process rest.pop unless rest.last && rest.last.sexp_type == :resbody
863
878
 
864
879
  body ||= "# do nothing"
865
880
 
@@ -878,7 +893,7 @@ class Ruby2Ruby < SexpProcessor
878
893
  if els then
879
894
  "#{indent body}\n#{resbodies.join("\n")}\nelse\n#{indent els}"
880
895
  elsif simple then
881
- resbody = resbodies.first.sub(/\n\s*/, ' ')
896
+ resbody = resbodies.first.sub(/\n\s*/, " ")
882
897
  "#{body} #{resbody}"
883
898
  else
884
899
  "#{indent body}\n#{resbodies.join("\n")}"
@@ -911,7 +926,7 @@ class Ruby2Ruby < SexpProcessor
911
926
 
912
927
  raise "dunno what to do: #{args.inspect}" if args
913
928
 
914
- name = name.to_s.sub(/=$/, '')
929
+ name = name.to_s.sub(/=$/, "")
915
930
 
916
931
  if rhs && rhs != s(:arglist) then
917
932
  "#{receiver}&.#{name} = #{process rhs}"
@@ -1004,7 +1019,7 @@ class Ruby2Ruby < SexpProcessor
1004
1019
  end
1005
1020
 
1006
1021
  def process_until(exp) # :nodoc:
1007
- cond_loop(exp, 'until')
1022
+ cond_loop(exp, "until")
1008
1023
  end
1009
1024
 
1010
1025
  def process_valias exp # :nodoc:
@@ -1048,7 +1063,7 @@ class Ruby2Ruby < SexpProcessor
1048
1063
  }
1049
1064
 
1050
1065
  unless args.empty? then
1051
- "yield(#{args.join(', ')})"
1066
+ "yield(#{args.join(", ")})"
1052
1067
  else
1053
1068
  "yield"
1054
1069
  end
@@ -1209,7 +1224,7 @@ class Ruby2Ruby < SexpProcessor
1209
1224
  # Wrap appropriate expressions in matching parens.
1210
1225
 
1211
1226
  def parenthesize exp
1212
- case self.context[1]
1227
+ case context[1]
1213
1228
  when nil, :defn, :defs, :class, :sclass, :if, :iter, :resbody, :when, :while then
1214
1229
  exp
1215
1230
  else
@@ -1243,18 +1258,13 @@ class Ruby2Ruby < SexpProcessor
1243
1258
  str = dthing_escape(type, str)
1244
1259
 
1245
1260
  rest = rest.map { |pt|
1246
- case pt
1247
- when Sexp then # TODO: what the fuck? why??
1248
- case pt.sexp_type
1249
- when :str then
1250
- dthing_escape(type, pt.last)
1251
- when :evstr then
1252
- '#{%s}' % [process(pt)]
1253
- else
1254
- raise "unknown type: #{pt.inspect}"
1255
- end
1261
+ case pt.sexp_type
1262
+ when :str then
1263
+ dthing_escape(type, pt.last)
1264
+ when :evstr then
1265
+ '#{%s}' % [process(pt)]
1256
1266
  else
1257
- raise "unhandled value in d-thing: #{pt.inspect}"
1267
+ raise "unknown type: #{pt.inspect}"
1258
1268
  end
1259
1269
  }
1260
1270
 
@@ -1264,7 +1274,7 @@ class Ruby2Ruby < SexpProcessor
1264
1274
  ##
1265
1275
  # Utility method to generate ether a module or class.
1266
1276
 
1267
- def util_module_or_class(exp, is_class=false)
1277
+ def util_module_or_class exp, is_class = false
1268
1278
  result = []
1269
1279
 
1270
1280
  _, name, *body = exp
@@ -1285,11 +1295,11 @@ class Ruby2Ruby < SexpProcessor
1285
1295
  process(sexp).chomp
1286
1296
  }
1287
1297
 
1288
- unless body.empty? then
1289
- body = indent(body.join("\n\n")) + "\n"
1290
- else
1291
- body = ""
1292
- end
1298
+ body = unless body.empty? then
1299
+ indent(body.join("\n\n")) + "\n"
1300
+ else
1301
+ ""
1302
+ end
1293
1303
 
1294
1304
  result << body
1295
1305
  result << "end"
@@ -2,22 +2,22 @@
2
2
 
3
3
  $TESTING = true
4
4
 
5
- $: << 'lib'
5
+ $: << "lib"
6
6
 
7
- require 'minitest/autorun'
8
- require 'ruby2ruby'
9
- require 'pt_testcase'
10
- require 'fileutils'
11
- require 'tmpdir'
12
- require 'ruby_parser' if ENV["CHECK_SEXPS"]
7
+ require "minitest/autorun"
8
+ require "ruby2ruby"
9
+ require "pt_testcase"
10
+ require "fileutils"
11
+ require "tmpdir"
12
+ require "ruby_parser" if ENV["CHECK_SEXPS"]
13
13
 
14
14
  class R2RTestCase < ParseTreeTestCase
15
15
  def self.previous key
16
16
  "ParseTree"
17
17
  end
18
18
 
19
- def self.generate_test klass, node, data, input_name, output_name
20
- output_name = data.has_key?('Ruby2Ruby') ? 'Ruby2Ruby' : 'Ruby'
19
+ def self.generate_test klass, node, data, input_name, _output_name
20
+ output_name = data.key?("Ruby2Ruby") ? "Ruby2Ruby" : "Ruby"
21
21
 
22
22
  klass.class_eval <<-EOM
23
23
  def test_#{node}
@@ -170,7 +170,7 @@ class TestRuby2Ruby < R2RTestCase
170
170
  assert_equal exp, Ruby2Ruby.new.process(sexp)
171
171
  end
172
172
 
173
- def assert_rt src, exp=src.dup
173
+ def assert_rt src, exp = src.dup
174
174
  assert_equal exp, Ruby2Ruby.new.process(RubyParser.new.parse(src))
175
175
  end
176
176
 
@@ -297,7 +297,7 @@ class TestRuby2Ruby < R2RTestCase
297
297
  def test_attr_writer_same
298
298
  do_not_check_sexp!
299
299
 
300
- inn = s(:defn, :same=, s(:args, :o), s(:iasgn, :@same , s(:lvar, :o)))
300
+ inn = s(:defn, :same=, s(:args, :o), s(:iasgn, :@same, s(:lvar, :o)))
301
301
  out = "attr_writer :same"
302
302
  assert_parse inn, out
303
303
  end
@@ -443,6 +443,17 @@ class TestRuby2Ruby < R2RTestCase
443
443
  assert_parse inn, out
444
444
  end
445
445
 
446
+ def test_shadow_block_args
447
+ inn = s(:iter,
448
+ s(:call, nil, :a),
449
+ s(:args,
450
+ s(:shadow, :b),
451
+ s(:shadow, :c)))
452
+ out = 'a { |; b, c| }'
453
+
454
+ assert_parse inn, out
455
+ end
456
+
446
457
  def test_masgn_block_arg
447
458
  inn = s(:iter,
448
459
  s(:call,
@@ -458,6 +469,42 @@ class TestRuby2Ruby < R2RTestCase
458
469
  assert_parse inn, out
459
470
  end
460
471
 
472
+ def test_single_nested_masgn_block_arg
473
+ inn = s(:iter,
474
+ s(:call, nil, :a),
475
+ s(:args,
476
+ s(:masgn,
477
+ s(:masgn,
478
+ s(:masgn, :b)))))
479
+ out = "a { |(((b)))| }"
480
+
481
+ assert_parse inn, out
482
+ end
483
+
484
+ def test_multiple_nested_masgn_block_arg
485
+ inn = s(:iter,
486
+ s(:call, nil, :a),
487
+ s(:args, :b,
488
+ s(:masgn,
489
+ s(:masgn, :c, :d),
490
+ :e,
491
+ s(:masgn, :f, :g))))
492
+ out = "a { |b, ((c, d), e, (f, g))| }"
493
+
494
+ assert_parse inn, out
495
+ end
496
+
497
+ def test_multiple_nested_masgn_array
498
+ inn = s(:masgn,
499
+ s(:array,
500
+ s(:masgn, s(:array, s(:lasgn, :a), s(:lasgn, :b))),
501
+ s(:lasgn, :c)),
502
+ s(:to_ary, s(:call, nil, :fn)))
503
+ out = "(a, b), c = fn"
504
+
505
+ assert_parse inn, out
506
+ end
507
+
461
508
  def test_masgn_wtf
462
509
  inn = s(:block,
463
510
  s(:masgn,
@@ -516,7 +563,7 @@ class TestRuby2Ruby < R2RTestCase
516
563
  :z,
517
564
  s(:lit, 1))
518
565
 
519
- out ="x&.y&.z(1)"
566
+ out = "x&.y&.z(1)"
520
567
  assert_parse inn, out
521
568
  end
522
569
 
@@ -817,10 +864,10 @@ end
817
864
  # s
818
865
  # t new 2 3
819
866
 
820
- tr2r = File.read(__FILE__).split(/\n/)[start+1..__LINE__-2].join("\n")
867
+ tr2r = File.read(__FILE__).split(/\n/)[start + 1..__LINE__ - 2].join("\n")
821
868
  ir2r = File.read("lib/ruby2ruby.rb")
822
869
 
823
- require 'ruby_parser'
870
+ require "ruby_parser"
824
871
 
825
872
  def silent_eval ruby
826
873
  old, $-w = $-w, nil
@@ -837,9 +884,9 @@ def morph_and_eval src, from, to, processor
837
884
  end
838
885
 
839
886
  unless ENV["SIMPLE"] then
840
- ____ = morph_and_eval tr2r, /TestRuby2Ruby/, 'TestRuby2Ruby2', Ruby2Ruby
841
- ruby = morph_and_eval ir2r, /Ruby2Ruby/, 'Ruby2Ruby2', Ruby2Ruby
842
- ____ = morph_and_eval ruby, /Ruby2Ruby2/, 'Ruby2Ruby3', Ruby2Ruby2
887
+ ____ = morph_and_eval tr2r, /TestRuby2Ruby/, "TestRuby2Ruby2", Ruby2Ruby
888
+ ruby = morph_and_eval ir2r, /Ruby2Ruby/, "Ruby2Ruby2", Ruby2Ruby
889
+ ____ = morph_and_eval ruby, /Ruby2Ruby2/, "Ruby2Ruby3", Ruby2Ruby2
843
890
 
844
891
  class TestRuby2Ruby1 < TestRuby2Ruby
845
892
  def setup
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby2ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.2
4
+ version: 2.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -29,7 +29,7 @@ cert_chain:
29
29
  Em82dBUFsipwMLCYj39kcyHWAxyl6Ae1Cn9r/ItVBCxoeFdrHjfavnrIEoXUt4bU
30
30
  UfBugfLD19bu3nvL+zTAGx/U
31
31
  -----END CERTIFICATE-----
32
- date: 2019-03-13 00:00:00.000000000 Z
32
+ date: 2019-06-04 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: sexp_processor
metadata.gz.sig CHANGED
Binary file