ParseTree 1.6.0 → 1.6.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|