ParseTree 1.6.0 → 1.6.1
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 +10 -1
- data/Rakefile +1 -0
- data/lib/parse_tree.rb +8 -4
- data/lib/sexp.rb +13 -35
- data/lib/sexp_processor.rb +0 -14
- data/test/pt_testcase.rb +167 -91
- data/test/something.rb +0 -5
- data/test/test_parse_tree.rb +2 -2
- data/test/test_sexp.rb +17 -24
- data/test/test_sexp_processor.rb +0 -24
- metadata +3 -3
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
*** 1.6.1 / 2006-11-11
|
2
|
+
|
3
|
+
+ 2 minor enhancements:
|
4
|
+
+ Have been going insane on the tests, expect more soon.
|
5
|
+
+ Cleaned up using named nodes, now do: args = exp.scope.block.args(:delete).
|
6
|
+
+ 2 bug fixes:
|
7
|
+
+ Fixed #parse_tree to return superclass in :const node.
|
8
|
+
+ Fixed while/until with no bodies (now nil).
|
9
|
+
|
1
10
|
*** 1.6.0 / 2006-10-11
|
2
11
|
|
3
12
|
+ 2 major enhancements:
|
@@ -10,7 +19,7 @@
|
|
10
19
|
+ SexpProcessor's unsupported array now defaults to all the internal nodes.
|
11
20
|
+ Added Unique from ruby2c project.
|
12
21
|
+ something.rb got slimmed down to near nothing. About to be retired.
|
13
|
-
+
|
22
|
+
+ 3 bug fixes:
|
14
23
|
+ Added changeset to Hoe spec.
|
15
24
|
+ Fixed up description to use paragraphs_of.
|
16
25
|
+ Fixed op_asgn1, alias, undef, dsym, match.
|
data/Rakefile
CHANGED
@@ -12,6 +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'; p paths }
|
15
16
|
end
|
16
17
|
|
17
18
|
desc 'Run against ruby 1.9 (from a multiruby install) with -d.'
|
data/lib/parse_tree.rb
CHANGED
@@ -25,7 +25,7 @@ require 'inline'
|
|
25
25
|
|
26
26
|
class ParseTree
|
27
27
|
|
28
|
-
VERSION = '1.6.
|
28
|
+
VERSION = '1.6.1'
|
29
29
|
|
30
30
|
##
|
31
31
|
# Front end translation method.
|
@@ -82,7 +82,7 @@ class ParseTree
|
|
82
82
|
code = if Class === klass then
|
83
83
|
sc = klass.superclass
|
84
84
|
sc_name = ((sc.nil? or sc.name.empty?) ? "nil" : sc.name).intern
|
85
|
-
[:class, klassname, sc_name]
|
85
|
+
[:class, klassname, [:const, sc_name]]
|
86
86
|
else
|
87
87
|
[:module, klassname]
|
88
88
|
end
|
@@ -399,7 +399,11 @@ again_no_block:
|
|
399
399
|
case NODE_WHILE:
|
400
400
|
case NODE_UNTIL:
|
401
401
|
add_to_parse_tree(current, node->nd_cond, newlines, locals);
|
402
|
-
|
402
|
+
if (node->nd_body) {
|
403
|
+
add_to_parse_tree(current, node->nd_body, newlines, locals);
|
404
|
+
} else {
|
405
|
+
rb_ary_push(current, Qnil);
|
406
|
+
}
|
403
407
|
rb_ary_push(current, node->nd_3rd == 0 ? Qfalse : Qtrue);
|
404
408
|
break;
|
405
409
|
|
@@ -865,10 +869,10 @@ static VALUE parse_tree_for_meth(VALUE klass, VALUE method, VALUE newlines, VALU
|
|
865
869
|
NODE *node = NULL;
|
866
870
|
ID id;
|
867
871
|
VALUE result = rb_ary_new();
|
872
|
+
VALUE version = rb_const_get_at(rb_cObject,rb_intern("RUBY_VERSION"));
|
868
873
|
|
869
874
|
(void) self; // quell warnings
|
870
875
|
|
871
|
-
VALUE version = rb_const_get_at(rb_cObject,rb_intern("RUBY_VERSION"));
|
872
876
|
if (strcmp(StringValuePtr(version), #{RUBY_VERSION.inspect})) {
|
873
877
|
rb_fatal("bad version, %s != #{RUBY_VERSION}\\n", StringValuePtr(version));
|
874
878
|
}
|
data/lib/sexp.rb
CHANGED
@@ -10,16 +10,10 @@ class Sexp < Array # ZenTest FULL
|
|
10
10
|
|
11
11
|
@@array_types = [ :array, :args, ]
|
12
12
|
|
13
|
-
##
|
14
|
-
# Named positional parameters.
|
15
|
-
# Use with +SexpProcessor.require_empty=false+.
|
16
|
-
attr_accessor :accessors
|
17
|
-
|
18
13
|
##
|
19
14
|
# Create a new Sexp containing +args+.
|
20
15
|
|
21
16
|
def initialize(*args)
|
22
|
-
@accessors = []
|
23
17
|
super(args)
|
24
18
|
end
|
25
19
|
|
@@ -123,35 +117,19 @@ class Sexp < Array # ZenTest FULL
|
|
123
117
|
return "s(#{sexp_str})"
|
124
118
|
end
|
125
119
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
# ...
|
140
|
-
# end
|
141
|
-
#
|
142
|
-
# def process_call(exp)
|
143
|
-
# lhs = exp.lhs
|
144
|
-
# name = exp.name
|
145
|
-
# rhs = exp.rhs
|
146
|
-
# ...
|
147
|
-
# end
|
148
|
-
# end
|
149
|
-
|
150
|
-
def method_missing(meth, *a, &b)
|
151
|
-
super unless @accessors.include? meth
|
152
|
-
|
153
|
-
index = @accessors.index(meth) + 1 # skip type
|
154
|
-
return self.at(index)
|
120
|
+
def method_missing(meth, delete=false)
|
121
|
+
matches = find_all { | sexp | Sexp === sexp and sexp.first == meth }
|
122
|
+
|
123
|
+
case matches.size
|
124
|
+
when 0 then
|
125
|
+
nil
|
126
|
+
when 1 then
|
127
|
+
match = matches.first
|
128
|
+
delete match if delete
|
129
|
+
match
|
130
|
+
else
|
131
|
+
raise NoMethodError, "multiple nodes for #{meth} were found in #{inspect}"
|
132
|
+
end
|
155
133
|
end
|
156
134
|
|
157
135
|
def pretty_print(q) # :nodoc:
|
data/lib/sexp_processor.rb
CHANGED
@@ -121,11 +121,6 @@ class SexpProcessor
|
|
121
121
|
|
122
122
|
attr_accessor :require_empty
|
123
123
|
|
124
|
-
##
|
125
|
-
# Adds accessor methods to the Sexp
|
126
|
-
|
127
|
-
attr_accessor :sexp_accessors
|
128
|
-
|
129
124
|
##
|
130
125
|
# Creates a new SexpProcessor. Use super to invoke this
|
131
126
|
# initializer from SexpProcessor subclasses, then use the
|
@@ -142,7 +137,6 @@ class SexpProcessor
|
|
142
137
|
@debug = {}
|
143
138
|
@expected = Sexp
|
144
139
|
@require_empty = true
|
145
|
-
@sexp_accessors = {}
|
146
140
|
@exceptions = {}
|
147
141
|
|
148
142
|
# we do this on an instance basis so we can subclass it for
|
@@ -189,14 +183,6 @@ class SexpProcessor
|
|
189
183
|
exp_orig = exp.deep_clone if $DEBUG or
|
190
184
|
@debug.has_key? type or @exceptions.has_key?(type)
|
191
185
|
|
192
|
-
if Sexp === exp then
|
193
|
-
if @sexp_accessors.include? type then
|
194
|
-
exp.accessors = @sexp_accessors[type]
|
195
|
-
else
|
196
|
-
exp.accessors = [] # clean out accessor list in case it changed
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
186
|
raise UnsupportedNodeError, "'#{type}' is not a supported node type" if @unsupported.include? type
|
201
187
|
|
202
188
|
# do a pass through the rewriter first, if any, reassign back to exp
|
data/test/pt_testcase.rb
CHANGED
@@ -36,6 +36,26 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
36
36
|
Unique.reset
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.add_test name, data, klass = self.name[4..-1]
|
40
|
+
name = name.to_s
|
41
|
+
klass = klass.to_s
|
42
|
+
if testcases.has_key? name then
|
43
|
+
if testcases[name].has_key? klass then
|
44
|
+
warn "testcase #{klass}##{name} already has data"
|
45
|
+
else
|
46
|
+
testcases[name][klass] = data
|
47
|
+
end
|
48
|
+
else
|
49
|
+
warn "testcase #{name} does not exist"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.unsupported_tests *tests
|
54
|
+
tests.flatten.each do |name|
|
55
|
+
add_test name, :unsupported
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
39
59
|
@@testcase_order = %w(Ruby ParseTree)
|
40
60
|
|
41
61
|
@@testcases = {
|
@@ -44,7 +64,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
44
64
|
"Ruby" => "class X\n alias :y :x\nend",
|
45
65
|
"ParseTree" => [:class, :X, nil,
|
46
66
|
[:scope, [:alias, [:lit, :y], [:lit, :x]]]],
|
47
|
-
"Ruby2Ruby" => "class X\n alias_method :y, :x\
|
67
|
+
"Ruby2Ruby" => "class X\n alias_method :y, :x\nend", # FIX dbl \n
|
48
68
|
},
|
49
69
|
|
50
70
|
"and" => {
|
@@ -52,19 +72,6 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
52
72
|
"ParseTree" => [:and, [:vcall, :a], [:vcall, :b]],
|
53
73
|
},
|
54
74
|
|
55
|
-
"args" => {
|
56
|
-
"Ruby" => "def x(a, b = 42, \*c, &d)\n p(a, b, c, d)\nend",
|
57
|
-
"ParseTree" => [:defn, :x,
|
58
|
-
[:scope,
|
59
|
-
[:block,
|
60
|
-
[:args, :a, :b, "*c".intern, # s->e
|
61
|
-
[:block, [:lasgn, :b, [:lit, 42]]]],
|
62
|
-
[:block_arg, :d],
|
63
|
-
[:fcall, :p,
|
64
|
-
[:array, [:lvar, :a], [:lvar, :b],
|
65
|
-
[:lvar, :c], [:lvar, :d]]]]]]
|
66
|
-
},
|
67
|
-
|
68
75
|
"argscat" => {
|
69
76
|
"Ruby" => "a = b, c, *d",
|
70
77
|
"ParseTree" => [:lasgn, :a,
|
@@ -186,32 +193,44 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
186
193
|
"ParseTree" => [:cdecl, :X, [:lit, 42]],
|
187
194
|
},
|
188
195
|
|
189
|
-
"
|
190
|
-
"Ruby" => "class X
|
196
|
+
"class_plain" => {
|
197
|
+
"Ruby" => "class X\n puts((1 + 1))\n def blah\n puts(\"hello\")\n end\nend",
|
191
198
|
"ParseTree" => [:class,
|
192
199
|
:X,
|
193
|
-
|
200
|
+
nil,
|
194
201
|
[:scope,
|
195
|
-
[:
|
196
|
-
:
|
197
|
-
[:
|
198
|
-
|
199
|
-
|
200
|
-
[:
|
202
|
+
[:block,
|
203
|
+
[:fcall, :puts, [:array, [:call, [:lit, 1], :+, [:array, [:lit, 1]]]]],
|
204
|
+
[:defn,
|
205
|
+
:blah,
|
206
|
+
[:scope,
|
207
|
+
[:block,
|
208
|
+
[:args],
|
209
|
+
[:fcall, :puts, [:array, [:str, "hello"]]]]]]]]],
|
201
210
|
},
|
202
211
|
|
203
|
-
"
|
204
|
-
"Ruby" => "class X
|
212
|
+
"class_super_object" => {
|
213
|
+
"Ruby" => "class X < Object\nend",
|
205
214
|
"ParseTree" => [:class,
|
206
215
|
:X,
|
207
|
-
|
208
|
-
[:scope,
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
216
|
+
[:const, :Object],
|
217
|
+
[:scope]],
|
218
|
+
},
|
219
|
+
|
220
|
+
"class_super_array" => {
|
221
|
+
"Ruby" => "class X < Array\nend",
|
222
|
+
"ParseTree" => [:class,
|
223
|
+
:X,
|
224
|
+
[:const, :Array],
|
225
|
+
[:scope]],
|
226
|
+
},
|
227
|
+
|
228
|
+
"class_super_expr" => {
|
229
|
+
"Ruby" => "class X < expr\nend",
|
230
|
+
"ParseTree" => [:class,
|
231
|
+
:X,
|
232
|
+
[:vcall, :expr],
|
233
|
+
[:scope]],
|
215
234
|
},
|
216
235
|
|
217
236
|
"colon2" => {
|
@@ -256,6 +275,12 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
256
275
|
[:call, [:lit, 42], :<, [:array, [:lit, 0]]],
|
257
276
|
[:return, [:lit, 3]],
|
258
277
|
[:return, [:lit, 4]]]],
|
278
|
+
"Ruby2Ruby" => "if (42 == 0) then\n return 2\nelse\n if (42 < 0) then\n return 3\n else\n return 4\n end\nend",
|
279
|
+
},
|
280
|
+
|
281
|
+
"conditional5" => {
|
282
|
+
"Ruby" => "unless true then\n if false then\n return\n end\nend",
|
283
|
+
"ParseTree" => [:if, [:true], nil, [:if, [:false], [:return], nil]],
|
259
284
|
},
|
260
285
|
|
261
286
|
"const" => {
|
@@ -276,7 +301,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
276
301
|
},
|
277
302
|
|
278
303
|
"cvdecl" => {
|
279
|
-
"Ruby" => "class X\n @@blah = 1\
|
304
|
+
"Ruby" => "class X\n @@blah = 1\nend",
|
280
305
|
"ParseTree" => [:class, :X, nil,
|
281
306
|
[:scope, [:cvdecl, :@@blah, [:lit, 1]]]],
|
282
307
|
},
|
@@ -298,6 +323,19 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
298
323
|
"ParseTree" => [:defined, [:gvar, :$x]],
|
299
324
|
},
|
300
325
|
|
326
|
+
"defn_args" => {
|
327
|
+
"Ruby" => "def x(a, b = 42, \*c, &d)\n p(a, b, c, d)\nend",
|
328
|
+
"ParseTree" => [:defn, :x,
|
329
|
+
[:scope,
|
330
|
+
[:block,
|
331
|
+
[:args, :a, :b, "*c".intern, # s->e
|
332
|
+
[:block, [:lasgn, :b, [:lit, 42]]]],
|
333
|
+
[:block_arg, :d],
|
334
|
+
[:fcall, :p,
|
335
|
+
[:array, [:lvar, :a], [:lvar, :b],
|
336
|
+
[:lvar, :c], [:lvar, :d]]]]]]
|
337
|
+
},
|
338
|
+
|
301
339
|
"defn_empty" => {
|
302
340
|
"Ruby" => "def empty\n # do nothing\nend",
|
303
341
|
"ParseTree" => [:defn, :empty, [:scope, [:block, [:args], [:nil]]]],
|
@@ -308,14 +346,23 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
308
346
|
"ParseTree" => [:defn, :something?, [:scope, [:block, [:args], [:nil]]]],
|
309
347
|
},
|
310
348
|
|
349
|
+
# TODO:
|
350
|
+
# add_test("defn_optargs",
|
351
|
+
# s(:defn, :x,
|
352
|
+
# s(:args, :a, "*args".intern),
|
353
|
+
# s(:scope,
|
354
|
+
# s(:block,
|
355
|
+
# s(:call, nil, :p,
|
356
|
+
# s(:arglist, s(:lvar, :a), s(:lvar, :args)))))))
|
357
|
+
|
311
358
|
"defn_or" => {
|
312
|
-
"Ruby" => "def
|
313
|
-
"ParseTree" => [:defn, :|, [:scope, [:block, [:args], [:nil]]]],
|
359
|
+
"Ruby" => "def |(o)\n # do nothing\nend",
|
360
|
+
"ParseTree" => [:defn, :|, [:scope, [:block, [:args, :o], [:nil]]]],
|
314
361
|
},
|
315
362
|
|
316
363
|
"defn_zarray" => { # tests memory allocation for returns
|
317
|
-
"Ruby" => "def
|
318
|
-
"ParseTree" => [:defn, :
|
364
|
+
"Ruby" => "def zarray\n a = []\n return a\nend",
|
365
|
+
"ParseTree" => [:defn, :zarray,
|
319
366
|
[:scope,
|
320
367
|
[:block, [:args],
|
321
368
|
[:lasgn, :a, [:zarray]], [:return, [:lvar, :a]]]]],
|
@@ -391,23 +438,29 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
391
438
|
},
|
392
439
|
|
393
440
|
"ensure" => {
|
394
|
-
"Ruby" => "
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
441
|
+
"Ruby" => "begin
|
442
|
+
(1 + 1)
|
443
|
+
rescue SyntaxError => e1
|
444
|
+
2
|
445
|
+
rescue Exception => e2
|
446
|
+
3
|
447
|
+
else
|
448
|
+
4
|
449
|
+
ensure
|
450
|
+
5
|
451
|
+
end",
|
452
|
+
"ParseTree" => [:begin,
|
453
|
+
[:ensure,
|
454
|
+
[:rescue,
|
455
|
+
[:call, [:lit, 1], :+, [:array, [:lit, 1]]],
|
456
|
+
[:resbody,
|
457
|
+
[:array, [:const, :SyntaxError]],
|
458
|
+
[:block, [:lasgn, :e1, [:gvar, :$!]], [:lit, 2]],
|
459
|
+
[:resbody,
|
460
|
+
[:array, [:const, :Exception]],
|
461
|
+
[:block, [:lasgn, :e2, [:gvar, :$!]], [:lit, 3]]]],
|
462
|
+
[:lit, 4]],
|
463
|
+
[:lit, 5]]],
|
411
464
|
},
|
412
465
|
|
413
466
|
"false" => {
|
@@ -652,7 +705,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
652
705
|
},
|
653
706
|
|
654
707
|
"module" => {
|
655
|
-
"Ruby" => "module X\n def y\n # do nothing\n end\
|
708
|
+
"Ruby" => "module X\n def y\n # do nothing\n end\nend",
|
656
709
|
"ParseTree" => [:module, :X,
|
657
710
|
[:scope,
|
658
711
|
[:defn, :y, [:scope, [:block, [:args], [:nil]]]]]],
|
@@ -739,16 +792,21 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
739
792
|
[:fcall, :loop], nil, [:if, [:false], [:redo], nil]],
|
740
793
|
},
|
741
794
|
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
795
|
+
"rescue" => {
|
796
|
+
"Ruby" => "blah rescue nil",
|
797
|
+
"ParseTree" => [:rescue, [:vcall, :blah], [:resbody, nil, [:nil]]],
|
798
|
+
},
|
746
799
|
|
747
|
-
"
|
800
|
+
"rescue_block_nada" => {
|
748
801
|
"Ruby" => "begin\n blah\nrescue\n # do nothing\nend\n",
|
749
802
|
"ParseTree" => [:begin, [:rescue, [:vcall, :blah], [:resbody, nil]]]
|
750
803
|
},
|
751
804
|
|
805
|
+
"rescue_block_body" => {
|
806
|
+
"Ruby" => "begin\n blah\nrescue\n nil\nend\n",
|
807
|
+
"ParseTree" => [:begin, [:rescue, [:vcall, :blah], [:resbody, nil, [:nil]]]],
|
808
|
+
},
|
809
|
+
|
752
810
|
"rescue_exceptions" => {
|
753
811
|
"Ruby" => "begin\n blah\nrescue RuntimeError => r\n # do nothing\nend\n",
|
754
812
|
"ParseTree" => [:begin,
|
@@ -774,6 +832,7 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
774
832
|
"ParseTree" => [:fcall, :a, [:splat, [:vcall, :b]]],
|
775
833
|
},
|
776
834
|
|
835
|
+
# TODO: all supers need to pass args
|
777
836
|
"super" => {
|
778
837
|
"Ruby" => "def x\n super(4)\nend",
|
779
838
|
"ParseTree" => [:defn, :x,
|
@@ -823,12 +882,18 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
823
882
|
"Ruby2Ruby" => "undef :x\nundef :y\nundef :z\n",
|
824
883
|
},
|
825
884
|
|
826
|
-
"
|
885
|
+
"until_pre" => {
|
827
886
|
"Ruby" => "until false do\n (1 + 1)\nend",
|
828
887
|
"ParseTree" => [:until, [:false],
|
829
888
|
[:call, [:lit, 1], :+, [:array, [:lit, 1]]], true],
|
830
889
|
},
|
831
890
|
|
891
|
+
"until_post" => {
|
892
|
+
"Ruby" => "begin\n (1 + 1)\nend until false",
|
893
|
+
"ParseTree" => [:until, [:false],
|
894
|
+
[:call, [:lit, 1], :+, [:array, [:lit, 1]]], false],
|
895
|
+
},
|
896
|
+
|
832
897
|
"valias" => {
|
833
898
|
"Ruby" => "alias $y $x",
|
834
899
|
"ParseTree" => [:valias, :$y, :$x],
|
@@ -839,17 +904,21 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
839
904
|
"ParseTree" => [:vcall, :method],
|
840
905
|
},
|
841
906
|
|
842
|
-
"
|
843
|
-
"Ruby" => "
|
844
|
-
"ParseTree" => [:
|
845
|
-
:
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
907
|
+
"while_pre" => {
|
908
|
+
"Ruby" => "while false do\n (1 + 1)\nend",
|
909
|
+
"ParseTree" => [:while, [:false],
|
910
|
+
[:call, [:lit, 1], :+, [:array, [:lit, 1]]], true],
|
911
|
+
},
|
912
|
+
|
913
|
+
"while_pre_nil" => {
|
914
|
+
"Ruby" => "while false do\nend",
|
915
|
+
"ParseTree" => [:while, [:false], nil, true],
|
916
|
+
},
|
917
|
+
|
918
|
+
"while_post" => {
|
919
|
+
"Ruby" => "begin\n (1 + 1)\nend while false",
|
920
|
+
"ParseTree" => [:while, [:false],
|
921
|
+
[:call, [:lit, 1], :+, [:array, [:lit, 1]]], false],
|
853
922
|
},
|
854
923
|
|
855
924
|
"xstr" => {
|
@@ -912,8 +981,8 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
912
981
|
# flunk
|
913
982
|
# end
|
914
983
|
|
915
|
-
def self.previous(key)
|
916
|
-
idx = @@testcase_order.index(key)-1
|
984
|
+
def self.previous(key, extra=0)
|
985
|
+
idx = @@testcase_order.index(key)-1-extra
|
917
986
|
case key
|
918
987
|
when "RubyToRubyC" then
|
919
988
|
idx -= 1
|
@@ -921,36 +990,42 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
921
990
|
@@testcase_order[idx]
|
922
991
|
end
|
923
992
|
|
924
|
-
|
925
|
-
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
993
|
+
# # lets us used unprocessed :self outside of tests, called when subclassed
|
994
|
+
# def self.clone_same
|
995
|
+
# @@testcases.each do |node, data|
|
996
|
+
# data.each do |key, val|
|
997
|
+
# if val == :same then
|
998
|
+
# prev_key = self.previous(key)
|
999
|
+
# data[key] = data[prev_key].deep_clone
|
1000
|
+
# end
|
1001
|
+
# end
|
1002
|
+
# end
|
1003
|
+
# end
|
935
1004
|
|
936
1005
|
def self.inherited(c)
|
937
|
-
self.clone_same
|
938
|
-
|
939
1006
|
output_name = c.name.to_s.sub(/^Test/, '')
|
940
1007
|
raise "Unknown class #{c}" unless @@testcase_order.include? output_name
|
941
1008
|
|
942
1009
|
input_name = self.previous(output_name)
|
943
1010
|
|
944
1011
|
@@testcases.each do |node, data|
|
945
|
-
next if data[input_name]
|
1012
|
+
next if [:skip, :unsupported].include? data[input_name]
|
946
1013
|
next if data[output_name] == :skip
|
947
1014
|
|
948
1015
|
c.send(:define_method, "test_#{node}".intern) do
|
949
1016
|
flunk "Processor is nil" if processor.nil?
|
950
1017
|
assert data.has_key?(input_name), "Unknown input data"
|
1018
|
+
unless data.has_key?(output_name) then
|
1019
|
+
$stderr.puts "add_test(#{node.inspect}, :same)"
|
1020
|
+
end
|
951
1021
|
assert data.has_key?(output_name), "Unknown expected data"
|
952
1022
|
input = data[input_name].deep_clone
|
953
|
-
|
1023
|
+
|
1024
|
+
expected = if data[output_name] == :same then
|
1025
|
+
input
|
1026
|
+
else
|
1027
|
+
data[output_name]
|
1028
|
+
end.deep_clone
|
954
1029
|
|
955
1030
|
case expected
|
956
1031
|
when :unsupported then
|
@@ -964,7 +1039,8 @@ class ParseTreeTestCase < Test::Unit::TestCase
|
|
964
1039
|
_, expected, extra_expected = *expected if Array === expected and expected.first == :defx
|
965
1040
|
_, input, extra_input = *input if Array === input and input.first == :defx
|
966
1041
|
|
967
|
-
|
1042
|
+
debug = input.deep_clone
|
1043
|
+
assert_equal expected, processor.process(input), "failed on input: #{debug.inspect}"
|
968
1044
|
extra_input.each do |input| processor.process(input) end
|
969
1045
|
extra = processor.extra_methods rescue []
|
970
1046
|
assert_equal extra_expected, extra
|
data/test/something.rb
CHANGED
data/test/test_parse_tree.rb
CHANGED
@@ -37,7 +37,7 @@ class TestParseTree < ParseTreeTestCase
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_class_initialize
|
40
|
-
expected = [[:class, :SomethingWithInitialize, :Object,
|
40
|
+
expected = [[:class, :SomethingWithInitialize, [:const, :Object],
|
41
41
|
[:defn, :initialize, [:scope, [:block, [:args], [:nil]]]],
|
42
42
|
[:defn, :protected_meth, [:scope, [:block, [:args], [:nil]]]],
|
43
43
|
]]
|
@@ -159,7 +159,7 @@ class TestParseTree < ParseTreeTestCase
|
|
159
159
|
:type=,
|
160
160
|
[:array, [:call, [:vcall, :other], :type]]]]]]
|
161
161
|
|
162
|
-
@@__all = [:class, :Something, :Object]
|
162
|
+
@@__all = [:class, :Something, [:const, :Object]]
|
163
163
|
|
164
164
|
Something.instance_methods(false).sort.each do |meth|
|
165
165
|
if class_variables.include?("@@#{meth}") then
|
data/test/test_sexp.rb
CHANGED
@@ -59,25 +59,6 @@ class TestSexp < SexpTestCase # ZenTest FULL
|
|
59
59
|
# raise NotImplementedError, 'Need to write test_class_index'
|
60
60
|
end
|
61
61
|
|
62
|
-
def test_accessors; end # handled
|
63
|
-
|
64
|
-
def test_accessors_equals
|
65
|
-
a = s(:call, s(:lit, 1), "func", s(:array, s(:lit, 2)))
|
66
|
-
a.accessors = [:lhs, :name, :rhs]
|
67
|
-
|
68
|
-
assert_equal a.accessors, [:lhs, :name, :rhs]
|
69
|
-
|
70
|
-
assert_equal s(:lit, 1), a.lhs
|
71
|
-
assert_equal "func", a.name
|
72
|
-
assert_equal s(:array, s(:lit, 2)), a.rhs
|
73
|
-
|
74
|
-
a.accessors = []
|
75
|
-
|
76
|
-
assert_raises NoMethodError do
|
77
|
-
a.lhs
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
62
|
def test_array_type_eh
|
82
63
|
assert_equal false, @sexp.array_type?
|
83
64
|
@sexp.unshift :array
|
@@ -213,15 +194,27 @@ class TestSexp < SexpTestCase # ZenTest FULL
|
|
213
194
|
end
|
214
195
|
|
215
196
|
def test_method_missing
|
197
|
+
assert_nil @sexp.not_there
|
198
|
+
assert_equal s(:lit, 42), @basic_sexp.lit
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_method_missing_ambigious
|
216
202
|
assert_raises NoMethodError do
|
217
|
-
|
203
|
+
pirate = s(:says, s(:arrr!), s(:arrr!), s(:arrr!))
|
204
|
+
pirate.arrr!
|
218
205
|
end
|
206
|
+
end
|
219
207
|
|
220
|
-
|
208
|
+
def test_method_missing_deep
|
209
|
+
sexp = s(:blah, s(:a, s(:b, s(:c, :yay!))))
|
210
|
+
assert_equal(s(:c, :yay!), sexp.a.b.c)
|
211
|
+
end
|
221
212
|
|
222
|
-
|
223
|
-
|
224
|
-
|
213
|
+
def test_method_missing_delete
|
214
|
+
sexp = s(:blah, s(:a, s(:b, s(:c, :yay!))))
|
215
|
+
|
216
|
+
assert_equal(s(:c, :yay!), sexp.a.b.c(true))
|
217
|
+
assert_equal(s(:blah, s(:a, s(:b))), sexp)
|
225
218
|
end
|
226
219
|
|
227
220
|
def test_pretty_print
|
data/test/test_sexp_processor.rb
CHANGED
@@ -84,30 +84,6 @@ class TestSexpProcessor < Test::Unit::TestCase
|
|
84
84
|
@processor = TestProcessor.new
|
85
85
|
end
|
86
86
|
|
87
|
-
def test_sexp_accessors
|
88
|
-
@processor.sexp_accessors = {
|
89
|
-
:acc1 => [:thing_one, :thing_two, :thing_three]
|
90
|
-
}
|
91
|
-
|
92
|
-
a = s(:acc1, 1, 2, 3)
|
93
|
-
|
94
|
-
assert_equal s(:acc2, 3, 2, 1), @processor.process(a)
|
95
|
-
end
|
96
|
-
|
97
|
-
def test_sexp_accessors_reset
|
98
|
-
@processor.sexp_accessors = {
|
99
|
-
:acc1 => [:thing_one, :thing_two, :thing_three]
|
100
|
-
}
|
101
|
-
|
102
|
-
a = s(:acc1, 1, 2, 3)
|
103
|
-
b = @processor.process(a)
|
104
|
-
|
105
|
-
assert_raises NoMethodError do
|
106
|
-
@processor.process(b)
|
107
|
-
end
|
108
|
-
end
|
109
|
-
def test_sexp_accessors=; end # handled
|
110
|
-
|
111
87
|
def test_process_specific
|
112
88
|
a = [:specific, 1, 2, 3]
|
113
89
|
expected = a[1..-1]
|
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.1
|
7
|
+
date: 2006-11-13 00:00:00 -05: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.3
|
79
79
|
version:
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: RubyInline
|