ParseTree 1.6.1 → 1.6.2
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.
- data/History.txt +8 -0
- data/Rakefile +1 -1
- data/lib/parse_tree.rb +53 -36
- data/test/pt_testcase.rb +56 -20
- metadata +3 -3
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
*** 1.6.2 / 2006-12-19
|
2
|
+
|
3
|
+
+ 2 minor enhancements:
|
4
|
+
+ ParseTree::translate can now take :"self.method".
|
5
|
+
* Improved PT tests for [], []=
|
6
|
+
+ 1 bug fixes:
|
7
|
+
* Fixed a bug in ParseTree where cases w/o exprs were malformed.
|
8
|
+
|
1
9
|
*** 1.6.1 / 2006-11-11
|
2
10
|
|
3
11
|
+ 2 minor enhancements:
|
data/Rakefile
CHANGED
@@ -12,7 +12,7 @@ Hoe.new("ParseTree", ParseTree::VERSION) do |p|
|
|
12
12
|
p.changes = p.paragraphs_of("History.txt", 1).join("\n\n")
|
13
13
|
p.clean_globs << File.expand_path("~/.ruby_inline")
|
14
14
|
p.extra_deps << ['RubyInline', '>= 3.2.0']
|
15
|
-
p.spec_extras[:require_paths] = proc { |paths| paths << 'test'
|
15
|
+
p.spec_extras[:require_paths] = proc { |paths| paths << 'test' }
|
16
16
|
end
|
17
17
|
|
18
18
|
desc 'Run against ruby 1.9 (from a multiruby install) with -d.'
|
data/lib/parse_tree.rb
CHANGED
@@ -25,10 +25,10 @@ require 'inline'
|
|
25
25
|
|
26
26
|
class ParseTree
|
27
27
|
|
28
|
-
VERSION = '1.6.
|
28
|
+
VERSION = '1.6.2'
|
29
29
|
|
30
30
|
##
|
31
|
-
# Front end translation method.
|
31
|
+
# Front end translation method.
|
32
32
|
|
33
33
|
def self.translate(klass_or_str, method=nil)
|
34
34
|
pt = self.new(false)
|
@@ -37,7 +37,12 @@ class ParseTree
|
|
37
37
|
pt.parse_tree_for_string(klass_or_str).first
|
38
38
|
else
|
39
39
|
unless method.nil? then
|
40
|
-
|
40
|
+
if method.to_s =~ /^self\./ then
|
41
|
+
method = method.to_s[5..-1].intern
|
42
|
+
pt.parse_tree_for_method(klass_or_str, method, true)
|
43
|
+
else
|
44
|
+
pt.parse_tree_for_method(klass_or_str, method)
|
45
|
+
end
|
41
46
|
else
|
42
47
|
pt.parse_tree(klass_or_str).first
|
43
48
|
end
|
@@ -245,6 +250,7 @@ class ParseTree
|
|
245
250
|
|
246
251
|
builder.prefix %{
|
247
252
|
#define nd_3rd u3.node
|
253
|
+
static VALUE current_case = Qnil;
|
248
254
|
}
|
249
255
|
|
250
256
|
builder.prefix %{
|
@@ -372,12 +378,17 @@ again_no_block:
|
|
372
378
|
break;
|
373
379
|
|
374
380
|
case NODE_CASE:
|
375
|
-
|
381
|
+
current_case = current;
|
382
|
+
if (node->nd_head != NULL) {
|
383
|
+
add_to_parse_tree(current, node->nd_head, newlines, locals); /* expr */
|
384
|
+
} else {
|
385
|
+
rb_ary_push(current, Qnil);
|
386
|
+
}
|
376
387
|
node = node->nd_body;
|
377
388
|
while (node) {
|
378
389
|
add_to_parse_tree(current, node, newlines, locals);
|
379
390
|
if (nd_type(node) == NODE_WHEN) { /* when */
|
380
|
-
node = node->nd_next;
|
391
|
+
node = node->nd_next;
|
381
392
|
} else {
|
382
393
|
break; /* else */
|
383
394
|
}
|
@@ -385,9 +396,15 @@ again_no_block:
|
|
385
396
|
rb_ary_push(current, Qnil); /* no else */
|
386
397
|
}
|
387
398
|
}
|
399
|
+
current_case = Qnil;
|
388
400
|
break;
|
389
401
|
|
390
402
|
case NODE_WHEN:
|
403
|
+
if (current_case == Qnil) { /* when without case, ie, no expr in case */
|
404
|
+
rb_ary_pop(ary); /* reset what current is pointing at */
|
405
|
+
node = NEW_CASE(0, node);
|
406
|
+
goto again;
|
407
|
+
}
|
391
408
|
add_to_parse_tree(current, node->nd_head, newlines, locals); /* args */
|
392
409
|
if (node->nd_body) {
|
393
410
|
add_to_parse_tree(current, node->nd_body, newlines, locals); /* body */
|
@@ -400,7 +417,7 @@ again_no_block:
|
|
400
417
|
case NODE_UNTIL:
|
401
418
|
add_to_parse_tree(current, node->nd_cond, newlines, locals);
|
402
419
|
if (node->nd_body) {
|
403
|
-
add_to_parse_tree(current, node->nd_body, newlines, locals);
|
420
|
+
add_to_parse_tree(current, node->nd_body, newlines, locals);
|
404
421
|
} else {
|
405
422
|
rb_ary_push(current, Qnil);
|
406
423
|
}
|
@@ -439,7 +456,7 @@ again_no_block:
|
|
439
456
|
break;
|
440
457
|
|
441
458
|
// rescue body:
|
442
|
-
// begin stmt rescue exception => var; stmt; [rescue e2 => v2; s2;]* end
|
459
|
+
// begin stmt rescue exception => var; stmt; [rescue e2 => v2; s2;]* end
|
443
460
|
// stmt rescue stmt
|
444
461
|
// a = b rescue c
|
445
462
|
|
@@ -452,7 +469,7 @@ again_no_block:
|
|
452
469
|
add_to_parse_tree(current, node->nd_2nd, newlines, locals);
|
453
470
|
add_to_parse_tree(current, node->nd_1st, newlines, locals);
|
454
471
|
break;
|
455
|
-
|
472
|
+
|
456
473
|
case NODE_ENSURE:
|
457
474
|
add_to_parse_tree(current, node->nd_head, newlines, locals);
|
458
475
|
if (node->nd_ensr) {
|
@@ -575,7 +592,7 @@ again_no_block:
|
|
575
592
|
add_to_parse_tree(current, node->nd_head, newlines, locals);
|
576
593
|
if (node->nd_args) {
|
577
594
|
if (node->nd_args != (NODE *)-1) {
|
578
|
-
|
595
|
+
add_to_parse_tree(current, node->nd_args, newlines, locals);
|
579
596
|
}
|
580
597
|
}
|
581
598
|
add_to_parse_tree(current, node->nd_value, newlines, locals);
|
@@ -613,22 +630,22 @@ again_no_block:
|
|
613
630
|
case NODE_HASH:
|
614
631
|
{
|
615
632
|
NODE *list;
|
616
|
-
|
633
|
+
|
617
634
|
list = node->nd_head;
|
618
635
|
while (list) {
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
636
|
+
add_to_parse_tree(current, list->nd_head, newlines, locals);
|
637
|
+
list = list->nd_next;
|
638
|
+
if (list == 0)
|
639
|
+
rb_bug("odd number list for Hash");
|
640
|
+
add_to_parse_tree(current, list->nd_head, newlines, locals);
|
641
|
+
list = list->nd_next;
|
625
642
|
}
|
626
643
|
}
|
627
644
|
break;
|
628
645
|
|
629
646
|
case NODE_ARRAY:
|
630
647
|
while (node) {
|
631
|
-
|
648
|
+
add_to_parse_tree(current, node->nd_head, newlines, locals);
|
632
649
|
node = node->nd_next;
|
633
650
|
}
|
634
651
|
break;
|
@@ -642,20 +659,20 @@ again_no_block:
|
|
642
659
|
NODE *list = node->nd_next;
|
643
660
|
rb_ary_push(current, rb_str_new3(node->nd_lit));
|
644
661
|
while (list) {
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
662
|
+
if (list->nd_head) {
|
663
|
+
switch (nd_type(list->nd_head)) {
|
664
|
+
case NODE_STR:
|
665
|
+
add_to_parse_tree(current, list->nd_head, newlines, locals);
|
666
|
+
break;
|
667
|
+
case NODE_EVSTR:
|
668
|
+
add_to_parse_tree(current, list->nd_head->nd_body, newlines, locals);
|
669
|
+
break;
|
670
|
+
default:
|
671
|
+
add_to_parse_tree(current, list->nd_head, newlines, locals);
|
672
|
+
break;
|
673
|
+
}
|
674
|
+
}
|
675
|
+
list = list->nd_next;
|
659
676
|
}
|
660
677
|
}
|
661
678
|
break;
|
@@ -664,7 +681,7 @@ again_no_block:
|
|
664
681
|
case NODE_DEFS:
|
665
682
|
if (node->nd_defn) {
|
666
683
|
if (nd_type(node) == NODE_DEFS)
|
667
|
-
|
684
|
+
add_to_parse_tree(current, node->nd_recv, newlines, locals);
|
668
685
|
rb_ary_push(current, ID2SYM(node->nd_mid));
|
669
686
|
add_to_parse_tree(current, node->nd_defn, newlines, locals);
|
670
687
|
}
|
@@ -705,8 +722,8 @@ again_no_block:
|
|
705
722
|
while (optnode) {
|
706
723
|
// optional arg names
|
707
724
|
rb_ary_push(current, ID2SYM(locals[i + 3]));
|
708
|
-
|
709
|
-
|
725
|
+
i++;
|
726
|
+
optnode = optnode->nd_next;
|
710
727
|
}
|
711
728
|
|
712
729
|
if (arg_count > 0) {
|
@@ -727,11 +744,11 @@ again_no_block:
|
|
727
744
|
optnode = node->nd_opt;
|
728
745
|
// block?
|
729
746
|
if (optnode) {
|
730
|
-
|
747
|
+
add_to_parse_tree(current, node->nd_opt, newlines, locals);
|
731
748
|
}
|
732
749
|
}
|
733
750
|
} break;
|
734
|
-
|
751
|
+
|
735
752
|
case NODE_LVAR:
|
736
753
|
case NODE_DVAR:
|
737
754
|
case NODE_IVAR:
|
data/test/pt_testcase.rb
CHANGED
@@ -14,11 +14,11 @@ class Examples
|
|
14
14
|
x + 1
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
17
|
+
|
18
18
|
def self.dmethod_maker
|
19
19
|
define_method :dmethod_added, self.method(:bmethod_maker)
|
20
20
|
end if RUBY_VERSION < "1.9"
|
21
|
-
|
21
|
+
|
22
22
|
bmethod_maker
|
23
23
|
dmethod_maker if RUBY_VERSION < "1.9"
|
24
24
|
end
|
@@ -59,7 +59,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
59
59
|
@@testcase_order = %w(Ruby ParseTree)
|
60
60
|
|
61
61
|
@@testcases = {
|
62
|
-
|
62
|
+
|
63
63
|
"alias" => {
|
64
64
|
"Ruby" => "class X\n alias :y :x\nend",
|
65
65
|
"ParseTree" => [:class, :X, nil,
|
@@ -87,7 +87,6 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
87
87
|
[:vcall, :a],
|
88
88
|
:[]=,
|
89
89
|
[:argspush, [:splat, [:vcall, :b]], [:vcall, :c]]],
|
90
|
-
"Ruby2Ruby" => "a.[]=(*b, c)" # HACK until we can get things ironed out
|
91
90
|
},
|
92
91
|
|
93
92
|
"array" => {
|
@@ -96,18 +95,23 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
96
95
|
},
|
97
96
|
|
98
97
|
"attrasgn" => {
|
99
|
-
"Ruby" => "y = 0\n42.method=
|
98
|
+
"Ruby" => "y = 0\n42.method = y\n",
|
100
99
|
"ParseTree" => [:block,
|
101
100
|
[:lasgn, :y, [:lit, 0]],
|
102
101
|
[:attrasgn, [:lit, 42], :method=, [:array, [:lvar, :y]]]],
|
103
102
|
},
|
104
103
|
|
104
|
+
"attrasgn_index_equals" => {
|
105
|
+
"Ruby" => "a[42] = 24",
|
106
|
+
"ParseTree" => [:attrasgn, [:vcall, :a], :[]=, [:array, [:lit, 42], [:lit, 24]]],
|
107
|
+
},
|
108
|
+
|
105
109
|
"attrset" => {
|
106
110
|
"Ruby" => [Examples, :writer=],
|
107
111
|
"ParseTree" => [:defn, :writer=, [:attrset, :@writer]],
|
108
112
|
"Ruby2Ruby" => "attr_writer :writer"
|
109
113
|
},
|
110
|
-
|
114
|
+
|
111
115
|
"back_ref" => {
|
112
116
|
"Ruby" => "[$&, $`, $', $+]",
|
113
117
|
"ParseTree" => [:array,
|
@@ -116,7 +120,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
116
120
|
[:back_ref, "'".intern], # s->e
|
117
121
|
[:back_ref, :+]],
|
118
122
|
},
|
119
|
-
|
123
|
+
|
120
124
|
"begin" => {
|
121
125
|
"Ruby" => "begin\n (1 + 1)\nend",
|
122
126
|
"ParseTree" => [:begin, [:call, [:lit, 1], :+, [:array, [:lit, 1]]]],
|
@@ -142,14 +146,14 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
142
146
|
"ParseTree" => [:iter,
|
143
147
|
[:fcall, :loop], nil, [:if, [:true], [:break], nil]],
|
144
148
|
},
|
145
|
-
|
149
|
+
|
146
150
|
"break_arg" => {
|
147
151
|
"Ruby" => "loop do\n if true then\n break 42\n end\nend",
|
148
152
|
"ParseTree" => [:iter,
|
149
153
|
[:fcall, :loop], nil,
|
150
154
|
[:if, [:true], [:break, [:lit, 42]], nil]],
|
151
155
|
},
|
152
|
-
|
156
|
+
|
153
157
|
"call" => {
|
154
158
|
"Ruby" => "self.method",
|
155
159
|
"ParseTree" => [:call, [:self], :method],
|
@@ -160,6 +164,11 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
160
164
|
"ParseTree" => [:fcall, :puts, [:array, [:lit, 42]]],
|
161
165
|
},
|
162
166
|
|
167
|
+
"call_index" => { # see attrasgn_index_equals for opposite
|
168
|
+
"Ruby" => "a[42]",
|
169
|
+
"ParseTree" => [:call, [:vcall, :a], :[], [:array, [:lit, 42]]],
|
170
|
+
},
|
171
|
+
|
163
172
|
"case" => {
|
164
173
|
"Ruby" => "var = 2\nresult = \"\"\ncase var\nwhen 1 then\n puts(\"something\")\n result = \"red\"\nwhen 2, 3 then\n result = \"yellow\"\nwhen 4 then\n # do nothing\nelse\n result = \"green\"\nend\ncase result\nwhen \"red\" then\n var = 1\nwhen \"yellow\" then\n var = 2\nwhen \"green\" then\n var = 3\nelse\n # do nothing\nend\n",
|
165
174
|
"ParseTree" => [:block,
|
@@ -188,6 +197,17 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
188
197
|
nil]]
|
189
198
|
},
|
190
199
|
|
200
|
+
"case_no_expr" => { # TODO: nested
|
201
|
+
"Ruby" => "case\nwhen 1 then\n :a\nwhen 2 then\n :b\nelse\n :c\nend",
|
202
|
+
"ParseTree" => [:case, nil,
|
203
|
+
[:when,
|
204
|
+
[:array, [:lit, 1]],
|
205
|
+
[:lit, :a]],
|
206
|
+
[:when,
|
207
|
+
[:array, [:lit, 2]], [:lit, :b]],
|
208
|
+
[:lit, :c]],
|
209
|
+
},
|
210
|
+
|
191
211
|
"cdecl" => {
|
192
212
|
"Ruby" => "X = 42",
|
193
213
|
"ParseTree" => [:cdecl, :X, [:lit, 42]],
|
@@ -335,7 +355,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
335
355
|
[:array, [:lvar, :a], [:lvar, :b],
|
336
356
|
[:lvar, :c], [:lvar, :d]]]]]]
|
337
357
|
},
|
338
|
-
|
358
|
+
|
339
359
|
"defn_empty" => {
|
340
360
|
"Ruby" => "def empty\n # do nothing\nend",
|
341
361
|
"ParseTree" => [:defn, :empty, [:scope, [:block, [:args], [:nil]]]],
|
@@ -359,7 +379,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
359
379
|
"Ruby" => "def |(o)\n # do nothing\nend",
|
360
380
|
"ParseTree" => [:defn, :|, [:scope, [:block, [:args, :o], [:nil]]]],
|
361
381
|
},
|
362
|
-
|
382
|
+
|
363
383
|
"defn_zarray" => { # tests memory allocation for returns
|
364
384
|
"Ruby" => "def zarray\n a = []\n return a\nend",
|
365
385
|
"ParseTree" => [:defn, :zarray,
|
@@ -396,12 +416,12 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
396
416
|
|
397
417
|
"dot2" => {
|
398
418
|
"Ruby" => "(a..b)",
|
399
|
-
"ParseTree" => [:dot2, [:vcall, :a], [:vcall, :b]],
|
419
|
+
"ParseTree" => [:dot2, [:vcall, :a], [:vcall, :b]],
|
400
420
|
},
|
401
421
|
|
402
422
|
"dot3" => {
|
403
423
|
"Ruby" => "(a...b)",
|
404
|
-
"ParseTree" => [:dot3, [:vcall, :a], [:vcall, :b]],
|
424
|
+
"ParseTree" => [:dot3, [:vcall, :a], [:vcall, :b]],
|
405
425
|
},
|
406
426
|
|
407
427
|
"dregx" => {
|
@@ -436,7 +456,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
436
456
|
[:lasgn, :t, [:lit, 5]],
|
437
457
|
[:dxstr, 'touch ', [:lvar, :t]]],
|
438
458
|
},
|
439
|
-
|
459
|
+
|
440
460
|
"ensure" => {
|
441
461
|
"Ruby" => "begin
|
442
462
|
(1 + 1)
|
@@ -686,7 +706,7 @@ end",
|
|
686
706
|
"Ruby" => "a, b = c, d",
|
687
707
|
"ParseTree" => [:masgn,
|
688
708
|
[:array, [:lasgn, :a], [:lasgn, :b]],
|
689
|
-
[:array, [:vcall, :c], [:vcall, :d]]],
|
709
|
+
[:array, [:vcall, :c], [:vcall, :d]]],
|
690
710
|
},
|
691
711
|
|
692
712
|
"match" => {
|
@@ -749,13 +769,13 @@ end",
|
|
749
769
|
:new, [:array, [:lit, :var]]]],
|
750
770
|
[:lasgn, :c,
|
751
771
|
[:call, [:lvar, :s], :new, [:array, [:nil]]]],
|
752
|
-
|
772
|
+
|
753
773
|
[:op_asgn2, [:lvar, :c], :var=, "||".intern, # s->e
|
754
774
|
[:lit, 20]],
|
755
775
|
[:op_asgn2, [:lvar, :c], :var=, "&&".intern, # s->e
|
756
776
|
[:lit, 21]],
|
757
777
|
[:op_asgn2, [:lvar, :c], :var=, :+, [:lit, 22]],
|
758
|
-
|
778
|
+
|
759
779
|
[:op_asgn2,
|
760
780
|
[:call,
|
761
781
|
[:call, [:lvar, :c], :d], :e], :f=, "||".intern,
|
@@ -786,6 +806,22 @@ end",
|
|
786
806
|
"ParseTree" => [:iter, [:postexe], nil, [:lit, 1]],
|
787
807
|
},
|
788
808
|
|
809
|
+
"proc_no_args" => {
|
810
|
+
"Ruby" => "proc do\n (x + 1)\nend",
|
811
|
+
"ParseTree" => [:iter,
|
812
|
+
[:fcall, :proc],
|
813
|
+
nil,
|
814
|
+
[:call, [:vcall, :x], :+, [:array, [:lit, 1]]]],
|
815
|
+
},
|
816
|
+
|
817
|
+
"proc_args" => {
|
818
|
+
"Ruby" => "proc do |x|\n (x + 1)\nend",
|
819
|
+
"ParseTree" => [:iter,
|
820
|
+
[:fcall, :proc],
|
821
|
+
[:dasgn_curr, :x],
|
822
|
+
[:call, [:dvar, :x], :+, [:array, [:lit, 1]]]],
|
823
|
+
},
|
824
|
+
|
789
825
|
"redo" => {
|
790
826
|
"Ruby" => "loop do\n if false then\n redo\n end\nend",
|
791
827
|
"ParseTree" => [:iter,
|
@@ -963,7 +999,7 @@ end",
|
|
963
999
|
# # HACK
|
964
1000
|
# nodes -= [:alloca, :argspush, :cfunc, :cref, :evstr, :ifunc, :last, :memo, :newline, :opt_n, :method].map { |s| s.to_s }
|
965
1001
|
# end
|
966
|
-
|
1002
|
+
|
967
1003
|
# untested = nodes-tested
|
968
1004
|
|
969
1005
|
# puts
|
@@ -977,7 +1013,7 @@ end",
|
|
977
1013
|
# },
|
978
1014
|
# )
|
979
1015
|
# end
|
980
|
-
|
1016
|
+
|
981
1017
|
# flunk
|
982
1018
|
# end
|
983
1019
|
|
@@ -1038,7 +1074,7 @@ end",
|
|
1038
1074
|
|
1039
1075
|
_, expected, extra_expected = *expected if Array === expected and expected.first == :defx
|
1040
1076
|
_, input, extra_input = *input if Array === input and input.first == :defx
|
1041
|
-
|
1077
|
+
|
1042
1078
|
debug = input.deep_clone
|
1043
1079
|
assert_equal expected, processor.process(input), "failed on input: #{debug.inspect}"
|
1044
1080
|
extra_input.each do |input| processor.process(input) end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ParseTree
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.6.
|
7
|
-
date: 2006-
|
6
|
+
version: 1.6.2
|
7
|
+
date: 2006-12-19 00:00:00 -08:00
|
8
8
|
summary: Extract and enumerate ruby parse trees.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -75,7 +75,7 @@ dependencies:
|
|
75
75
|
requirements:
|
76
76
|
- - ">="
|
77
77
|
- !ruby/object:Gem::Version
|
78
|
-
version: 1.1.
|
78
|
+
version: 1.1.4
|
79
79
|
version:
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: RubyInline
|