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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +13 -5
- data/lib/ruby2ruby.rb +120 -110
- data/test/test_ruby2ruby.rb +64 -17
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f72338e1430e938dcc3c0934ecef41cd7a1a589d8c67cde7419f05b9eb8b247
|
4
|
+
data.tar.gz: 2be6fc2a82fe2ca73fe59d9025ba6c3734d7571dcc867f2e3da800537cf71758
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe9fe4523da05005533346ba4ba1806e3f1ba22c7d36faff48623d7827b108d4dc195ae77bf3124369fed874b28229cefcbfcc00d9c2596b7a638b2931d8f5c9
|
7
|
+
data.tar.gz: 314e0287a424263e3f05e013d06bde2e8f9c9b9dd3b69ce1d9c9358c820f23571c5a66cdd621200ff0315c25082886ef124f870f9fb9d38d403d607b2b77d747
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/History.rdoc
CHANGED
@@ -1,10 +1,18 @@
|
|
1
|
-
=== 4.
|
1
|
+
=== 2.4.3 / 2019-06-03
|
2
2
|
|
3
|
-
*
|
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
|
-
*
|
6
|
-
*
|
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
|
|
data/lib/ruby2ruby.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby -w
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
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 =>
|
19
|
-
IGNORECASE =>
|
20
|
-
MULTILINE =>
|
21
|
-
ENC_NONE =>
|
22
|
-
ENC_EUC =>
|
23
|
-
ENC_SJIS =>
|
24
|
-
ENC_UTF8 =>
|
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.
|
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
|
-
"(
|
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 =~
|
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(
|
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(
|
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
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
[
|
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
|
-
|
624
|
-
|
625
|
-
|
626
|
-
result << "
|
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
|
-
|
636
|
-
|
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
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
case
|
686
|
-
when
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
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
|
-
|
724
|
+
process sexp
|
712
725
|
end
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
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
|
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,
|
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
|
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
|
1248
|
-
|
1249
|
-
|
1250
|
-
|
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 "
|
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
|
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
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
|
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"
|
data/test/test_ruby2ruby.rb
CHANGED
@@ -2,22 +2,22 @@
|
|
2
2
|
|
3
3
|
$TESTING = true
|
4
4
|
|
5
|
-
$: <<
|
5
|
+
$: << "lib"
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
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,
|
20
|
-
output_name = data.
|
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
|
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
|
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/,
|
841
|
-
ruby = morph_and_eval ir2r, /Ruby2Ruby/,
|
842
|
-
____ = morph_and_eval ruby, /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.
|
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-
|
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
|