redparse 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +63 -4
- data/Makefile +43 -0
- data/README.txt +101 -166
- data/Rakefile +1 -1
- data/bin/redparse +49 -21
- data/lib/redparse.rb +88 -1654
- data/lib/redparse/cache.rb +172 -0
- data/lib/redparse/compile.rb +1648 -0
- data/lib/redparse/float_accurate_to_s.rb +162 -0
- data/lib/redparse/generate.rb +6 -2
- data/lib/redparse/node.rb +677 -397
- data/lib/redparse/parse_tree_server.rb +129 -0
- data/lib/redparse/pthelper.rb +43 -0
- data/lib/redparse/reg_more_sugar.rb +5 -5
- data/lib/redparse/version.rb +1 -1
- data/redparse.gemspec +43 -0
- data/test/data/skkdictools.rb +3 -0
- data/test/generate_parse_tree_server_rc.rb +43 -0
- data/test/rp-locatetest.rb +41 -1
- data/test/test_1.9.rb +114 -0
- data/test/test_all.rb +3 -0
- data/test/test_redparse.rb +283 -124
- data/test/test_xform_tree.rb +66 -0
- metadata +57 -56
data/test/test_all.rb
ADDED
data/test/test_redparse.rb
CHANGED
@@ -17,13 +17,19 @@
|
|
17
17
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
18
18
|
=end
|
19
19
|
|
20
|
+
$VERBOSE=1
|
21
|
+
$Debug=1
|
20
22
|
require 'test/unit'
|
21
|
-
require '
|
22
|
-
require 'parse_tree'
|
23
|
+
#require 'parse_tree'
|
23
24
|
require 'tempfile'
|
25
|
+
begin
|
26
|
+
require 'ron'
|
27
|
+
rescue LoadError
|
28
|
+
#do nothing
|
29
|
+
end
|
24
30
|
|
25
31
|
require "redparse"
|
26
|
-
|
32
|
+
require "redparse/pthelper"
|
27
33
|
require "rubylexer/test/testcases"
|
28
34
|
|
29
35
|
$VERBOSE=1
|
@@ -90,16 +96,29 @@ class Test::Unit::TestCase
|
|
90
96
|
end
|
91
97
|
|
92
98
|
#print output immediately on failing test (at end too....)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
99
|
+
begin
|
100
|
+
require 'test/unit/ui/console/testrunner'
|
101
|
+
class Test::Unit::UI::Console::TestRunner
|
102
|
+
alias add_fault__no_immed_output add_fault
|
103
|
+
def add_fault fault
|
104
|
+
@fault_count||=0
|
105
|
+
output("\n%3d) %s" % [@fault_count+=1, fault.long_display])
|
106
|
+
add_fault__no_immed_output fault
|
107
|
+
end
|
100
108
|
end
|
109
|
+
rescue LoadError; #do nothing; just skip this code if test/unit/ui/console/testrunner not present
|
101
110
|
end
|
102
111
|
|
112
|
+
class MiniTest::Unit
|
113
|
+
alias puke__without_immediate_output puke
|
114
|
+
def puke klass, meth, e
|
115
|
+
result=puke__without_immediate_output klass, meth, e
|
116
|
+
puts @report.last
|
117
|
+
return result
|
118
|
+
end
|
119
|
+
end if defined? MiniTest::Unit
|
120
|
+
|
121
|
+
|
103
122
|
=begin nice idea, don't work yet
|
104
123
|
class Test::Unit::TestResult
|
105
124
|
@@FAILING_CASES=[]
|
@@ -149,24 +168,24 @@ class Test::Unit::TestResult
|
|
149
168
|
end
|
150
169
|
=end
|
151
170
|
|
171
|
+
require 'redparse/parse_tree_server'
|
152
172
|
class ParseTree
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
def fork_server?
|
161
|
-
return if defined? @@out
|
173
|
+
class<<self
|
174
|
+
include ParseTreeComm
|
175
|
+
def old_fork_server?
|
176
|
+
@in||=nil; @out||=nil
|
177
|
+
return if @out
|
178
|
+
Process.kill "KILL",@server if @server
|
179
|
+
@server=nil
|
162
180
|
si,co=IO::pipe
|
163
181
|
ci,so=IO::pipe
|
164
|
-
fork{
|
182
|
+
@server=fork{
|
165
183
|
begin
|
166
184
|
co.close; ci.close
|
167
|
-
|
185
|
+
@out=so; @in=si
|
168
186
|
warnstash=Tempfile.new "warnstash"
|
169
187
|
STDERR.reopen warnstash
|
188
|
+
instance=new
|
170
189
|
while 1
|
171
190
|
str=get
|
172
191
|
exit! if str==:exit!
|
@@ -175,7 +194,7 @@ class ParseTree
|
|
175
194
|
|
176
195
|
tree=
|
177
196
|
begin
|
178
|
-
parse_tree_for_string(str) #tree
|
197
|
+
instance.parse_tree_for_string(str) #tree
|
179
198
|
rescue Exception=>e;
|
180
199
|
tree=e
|
181
200
|
end
|
@@ -191,19 +210,50 @@ class ParseTree
|
|
191
210
|
end
|
192
211
|
}
|
193
212
|
si.close; so.close
|
194
|
-
|
195
|
-
at_exit {
|
213
|
+
@out=co; @in=ci
|
214
|
+
at_exit {
|
215
|
+
begin
|
216
|
+
put :exit!
|
217
|
+
Process.wait(@server)
|
218
|
+
rescue Exception
|
219
|
+
end
|
220
|
+
}
|
221
|
+
end
|
222
|
+
|
223
|
+
def fork_server?
|
224
|
+
@in||=nil; @out||=nil; @server||=nil
|
225
|
+
return if @out
|
226
|
+
Process.kill "KILL",@server if @server
|
227
|
+
|
228
|
+
ruby=ENV["RUBY1_8"]||"ruby"
|
229
|
+
@out=@in=IO::popen("#{ruby} #{ParseTreeServer.path_to_server_command}", "r+")
|
230
|
+
@server=@in.pid
|
231
|
+
@server_running_187=nil
|
232
|
+
server_running_187?
|
233
|
+
|
234
|
+
at_exit {
|
235
|
+
begin
|
236
|
+
put :exit!
|
237
|
+
Process.wait(@server)
|
238
|
+
rescue Exception
|
239
|
+
end
|
240
|
+
}
|
196
241
|
end
|
197
242
|
|
198
243
|
#returns +[parse_tree|Exception, +[String.*]]
|
199
244
|
def parse_tree_and_warnings str
|
200
245
|
fork_server?
|
201
|
-
|
202
|
-
|
203
|
-
|
246
|
+
begin
|
247
|
+
put str
|
248
|
+
tree=get
|
249
|
+
warnings=get
|
250
|
+
rescue Exception
|
251
|
+
return nil,nil
|
252
|
+
end
|
204
253
|
raise tree if Exception===tree
|
205
254
|
return tree,warnings
|
206
255
|
end
|
256
|
+
end
|
207
257
|
|
208
258
|
#this way is bad enough, but there's a fd leak this way,
|
209
259
|
#so I have to use the even more complicated version above
|
@@ -246,6 +296,18 @@ class RedParseTest<Test::Unit::TestCase
|
|
246
296
|
FAILURE_EXAMPLES=[
|
247
297
|
]
|
248
298
|
RUBYBUG_EXAMPLES=[
|
299
|
+
|
300
|
+
#bugs in ruby itself
|
301
|
+
"c do p (110).m end",
|
302
|
+
"p = p m %(1)",
|
303
|
+
"p = p m %(1) ,&t",
|
304
|
+
"p = p m %(1) ,*t",
|
305
|
+
"p = p m %(1) ,t",
|
306
|
+
"p = p m %(1) do end",
|
307
|
+
"p=556;p (e) /a",
|
308
|
+
"z{|| p (1).m}",
|
309
|
+
|
310
|
+
#bugs in ParseTree
|
249
311
|
' case
|
250
312
|
when 0
|
251
313
|
guecoding
|
@@ -254,23 +316,84 @@ class RedParseTest<Test::Unit::TestCase
|
|
254
316
|
guing
|
255
317
|
end
|
256
318
|
end',
|
257
|
-
|
258
319
|
'case; when false; else case; when nil; else 5; end; end',
|
259
|
-
'def foo(a=b=c={}) end',
|
260
|
-
"$11111111111111111111111111111111111111111111111111111111111111111111",
|
261
|
-
"c do p (110).m end",
|
262
320
|
"case F;when G; else;case; when j; end;end",
|
263
|
-
|
264
|
-
"p = p m %(1) ,&t",
|
265
|
-
"p = p m %(1) ,*t",
|
266
|
-
"p = p m %(1) ,t",
|
267
|
-
"p = p m %(1) do end",
|
268
|
-
"p=556;p (e) /a",
|
269
|
-
"z{|| p (1).m}",
|
321
|
+
'def foo(a=b=c={}) end',
|
270
322
|
'def sum(options = {:weights => weights = Hash.new(1)}); options.empty? or options.keys.size > 1; end',
|
323
|
+
'def sum(options = {:weights => weights = Hash}); 1 end',
|
324
|
+
'def foo(a = 1) end; def foo(a=b=c={}) end; def bar(a=b=c=1,d=2) end',
|
325
|
+
'def bar(a=b=1,d=2) end',
|
326
|
+
'def bar a=b=1,d=2; end',
|
327
|
+
'x if /f/../o/',
|
328
|
+
'c while d and a8../2.a?(b)/',
|
329
|
+
'c while d and :a8..:b8',
|
330
|
+
'c while d and :a8..2.a?(b)',
|
331
|
+
'c while d and 8.8..2.a?(b)',
|
332
|
+
'c while d and 8../2.a?(b)/',
|
333
|
+
'c while d and 2.a?(b)..8',
|
334
|
+
'c while d and /8/..2.a?(b)',
|
335
|
+
'c while d and /8/../2.a?(b)/',
|
336
|
+
'a if 1..2',
|
337
|
+
|
338
|
+
#not sure which, doesn't really matter anyway
|
339
|
+
"$11111111111111111111111111111111111111111111111111111111111111111111",
|
271
340
|
]
|
272
341
|
|
273
342
|
ONELINERS=[
|
343
|
+
'yield [a_i, *p] '...'',
|
344
|
+
'0.113725'...'',
|
345
|
+
'0.777777'...'',
|
346
|
+
'if a; b; elsif c; else d end'...'',
|
347
|
+
'[a=>b,c=>d]'...'',
|
348
|
+
'[a=>b,c=>d,*e]'...'',
|
349
|
+
'class __FILE__::A; b end'...'',
|
350
|
+
'module __FILE__::A; b end'...'',
|
351
|
+
'class __LINE__::A; b end'...'',
|
352
|
+
'module __LINE__::A; b end'...'',
|
353
|
+
'class self::A; b end'...'',
|
354
|
+
'module self::A; b end'...'',
|
355
|
+
'class self::A<B; c end'...'',
|
356
|
+
'module self::A include B; c end'...'',
|
357
|
+
'class a.b.c.d.e.f::Quux; YYY=534 end'...'',
|
358
|
+
'class[Array][0]::Foo; Bazz=556 end'...'',
|
359
|
+
'=begin\r\nfoo\r\n=end\r\n'...'',
|
360
|
+
'a!`b'...'',
|
361
|
+
'fetch_named { {} }'...'',
|
362
|
+
'def subject::Builder.foo; bar end'...'',
|
363
|
+
'class subject::Builder<T; foo end'...'',
|
364
|
+
'module subject::Builder include T; foo end'...'',
|
365
|
+
'class subject::Builder; foo end'...'',
|
366
|
+
'module subject::Builder; foo end'...'',
|
367
|
+
'Hasnew{[]}'...'',
|
368
|
+
'foo::Bar'...'',
|
369
|
+
'x{foo=1; foo::Bar}'...'',
|
370
|
+
'$foo::Bar'...'',
|
371
|
+
'@foo::Bar'...'',
|
372
|
+
'@@foo::Bar'...'',
|
373
|
+
' (-6000)..476'...'',
|
374
|
+
"case;when 0;ng = 'JIS';else case; when sjis__length; ding = 'EUC-JP' ;end;end"...'',
|
375
|
+
'attribute :invisible do [] end'...'',
|
376
|
+
'"#{queect{|w| w.t{|w| w}}}"'...'',
|
377
|
+
'case z; when a=b=1,d=2; yy end'...'',
|
378
|
+
'begin z; rescue a=b=1,d=2; yy end'...'',
|
379
|
+
'{5=>a=b=1,d=2=>6}'...'',
|
380
|
+
'{a=b=1,d=2}'...'',
|
381
|
+
'a=b=1,d=2'...'',
|
382
|
+
'z=a=b=1,d=2'...'',
|
383
|
+
'p(){|a=b=1,d=2| e}'...'',
|
384
|
+
'p(a=b=1,d=2)'...'',
|
385
|
+
'p a=b=1,d=2'...'',
|
386
|
+
'z[a=b=1,d=2]=5'...'',
|
387
|
+
'z[a=b=1,d=2]'...'',
|
388
|
+
'[a=b=1,d=2]'...'',
|
389
|
+
'UnOpNode===arg and /^$/===arg'...'',
|
390
|
+
'a+b=c rescue d'...'',
|
391
|
+
'a=b=c=d=f rescue g'...'',
|
392
|
+
'z+a=b=c=d=f rescue g'...'',
|
393
|
+
'k=z=c,d'...'',
|
394
|
+
'd=a=b do end'...'',
|
395
|
+
't p = m do 666 end'...'',
|
396
|
+
'a if 1'...'',
|
274
397
|
'p (a,b=c,d); a +h'...'',
|
275
398
|
'x{return (a,b=c,d)}'...'',
|
276
399
|
'x{r (a,b=c,d)}'...'',
|
@@ -279,15 +402,10 @@ class RedParseTest<Test::Unit::TestCase
|
|
279
402
|
'case; when false; else case; when nil; else 5; end; end'...'',
|
280
403
|
'case;else case; else; end;end'...'',
|
281
404
|
'case; else; end'...'',
|
282
|
-
'c while d and 2.a?(b)..8'...'',
|
283
405
|
'c while d and 888888888888888888888888888888888888888888888888888888..2.a?(b)'...'',
|
284
|
-
'c while d and 8.8..2.a?(b)'...'',
|
285
406
|
'c while d and 8..2.a?(b)'...'',
|
286
|
-
'c while d and
|
287
|
-
'c while d and
|
288
|
-
'c while d and /8/../2.a?(b)/'...'',
|
289
|
-
'c while d and 8../2.a?(b)/'...'',
|
290
|
-
'c while d and a8../2.a?(b)/'...'',
|
407
|
+
'c while d and a8..:b8'...'',
|
408
|
+
'c while d and 8..:b8'...'',
|
291
409
|
'z = valueo_s rescue "?"'...'',
|
292
410
|
'"#{publi}#{}>"'...'',
|
293
411
|
'return (@images = @old_imgs)'...'',
|
@@ -295,6 +413,7 @@ class RedParseTest<Test::Unit::TestCase
|
|
295
413
|
'doc_status, err_args = Documeh_status{fcgi_state = 3; docespond do doc_response =fcgi_state = 1; end }'...'',
|
296
414
|
'print "coled: " + $! +" wiin #{@ray}\n";'...'',
|
297
415
|
'class A;def b;class <<self;@@p = false end;end;end'...'',
|
416
|
+
'class A;def b;class <<self;"#{@@p = false}" end;end;end'...'',
|
298
417
|
'def d; return (block_given? ? begin; yield f; ensure; f.close; end : f); end'...'',
|
299
418
|
'def sum(options = {:weights => weights = Hash.new(1)}); options.empty? or options.keys.size > 1; end'...'',
|
300
419
|
'def d;e install_dir;end'...'',
|
@@ -344,8 +463,6 @@ class RedParseTest<Test::Unit::TestCase
|
|
344
463
|
"begin begin; ync; p1; end;rr end"...'',
|
345
464
|
"begin;mode;rescue;o_chmod rescue nil;end"...'',
|
346
465
|
"%w![ ] { } ( ) | - * . \\\\ ? + ^ $ #!"...'',
|
347
|
-
|
348
|
-
'def foo(a = 1) end; def foo(a=b=c={}) end; def bar(a=b=c=1,d=2) end'...'',
|
349
466
|
'() until 1'...'',
|
350
467
|
'(a) until 1'...'',
|
351
468
|
'(a) while l 1'...'',
|
@@ -2013,7 +2130,6 @@ class RedParseTest<Test::Unit::TestCase
|
|
2013
2130
|
'p(a and b)'...'', #not legal
|
2014
2131
|
|
2015
2132
|
'1..2'...'',
|
2016
|
-
'a if 1..2'...'',
|
2017
2133
|
|
2018
2134
|
'nc=(nextchar unless eof?)'...'',
|
2019
2135
|
'super'...'',
|
@@ -2742,9 +2858,6 @@ class RedParseTest<Test::Unit::TestCase
|
|
2742
2858
|
'a,b=(*c=b,a)'...'',
|
2743
2859
|
|
2744
2860
|
]
|
2745
|
-
NOTWORKINGYET=[
|
2746
|
-
#later...
|
2747
|
-
]
|
2748
2861
|
|
2749
2862
|
|
2750
2863
|
PASSTHRU_BSLASHES_ENTIRE=<<'END'
|
@@ -2819,6 +2932,17 @@ class RedParseTest<Test::Unit::TestCase
|
|
2819
2932
|
END
|
2820
2933
|
|
2821
2934
|
STANZAS=PASSTHRU_BSLASHES_ENTIRE+%q[
|
2935
|
+
@@anon = Module.new
|
2936
|
+
class @@anon::I
|
2937
|
+
bindtextd
|
2938
|
+
def test2
|
2939
|
+
_()
|
2940
|
+
end
|
2941
|
+
end
|
2942
|
+
module @@anon::J
|
2943
|
+
bindt
|
2944
|
+
end
|
2945
|
+
|
2822
2946
|
module
|
2823
2947
|
=begin =end
|
2824
2948
|
=end
|
@@ -2840,15 +2964,6 @@ module A::
|
|
2840
2964
|
return @senders[1] =
|
2841
2965
|
2
|
2842
2966
|
|
2843
|
-
case
|
2844
|
-
when 0
|
2845
|
-
guecoding
|
2846
|
-
else case
|
2847
|
-
when eucjp_match_length
|
2848
|
-
guing
|
2849
|
-
end
|
2850
|
-
end
|
2851
|
-
|
2852
2967
|
%w[ ac
|
2853
2968
|
df]
|
2854
2969
|
|
@@ -3607,45 +3722,52 @@ EOS
|
|
3607
3722
|
|
3608
3723
|
WRAPPERS=[ #enable at most 2 or tests take forever!!!
|
3609
3724
|
'(...)', #normal mode, should usually be enabled
|
3610
|
-
|
3611
|
-
|
3612
|
-
|
3613
|
-
|
3614
|
-
|
3615
|
-
|
3616
|
-
|
3617
|
-
|
3618
|
-
|
3619
|
-
|
3620
|
-
|
3621
|
-
|
3622
|
-
|
3725
|
+
'a rescue (...)',
|
3726
|
+
"((...))",
|
3727
|
+
'def ((...)).foo; end',
|
3728
|
+
'a0 = (...) rescue b0',
|
3729
|
+
'a0 = ((...)) rescue b0',
|
3730
|
+
'(...) #with a comment',
|
3731
|
+
"(...)#with comment and newline\n",
|
3732
|
+
"(...)\n",
|
3733
|
+
"(...);p __LINE__",
|
3734
|
+
"defined? (...)",
|
3735
|
+
"a=a (...)",
|
3736
|
+
"b=1;b (...)",
|
3737
|
+
"return (...)",
|
3738
|
+
'"#{(...)}"',
|
3623
3739
|
]
|
3624
3740
|
INJECTABLES=[ #take it easy with these too
|
3625
|
-
|
3626
|
-
|
3627
|
-
|
3628
|
-
|
3741
|
+
'p (1..10).method(:each)',
|
3742
|
+
'a0 rescue b0',
|
3743
|
+
'begin; r; t end',
|
3744
|
+
'a=b,c=d',
|
3629
3745
|
]
|
3630
|
-
|
3746
|
+
if ENV['MANGLE']
|
3747
|
+
else
|
3748
|
+
WRAPPERS.slice!(1..-1)
|
3749
|
+
INJECTABLES.clear
|
3750
|
+
puts "warning: most data fuzzing is disabled; set MANGLE to enable"
|
3751
|
+
end
|
3631
3752
|
|
3632
3753
|
RUBYIDENT=/((?:$|@@?)?#{RubyLexer::LETTER}#{RubyLexer::LETTER_DIGIT}*[?!]?)/o
|
3633
3754
|
|
3634
3755
|
def self.snippet2testmethod(snippet,wrap=nil)
|
3635
3756
|
escaped=snippet.gsub(/[\\']/){"\\"+$&}
|
3636
3757
|
safe=escaped.gsub(/([^ -~])/){
|
3637
|
-
x=$1[0]
|
3758
|
+
x=$1[0]
|
3759
|
+
x=x.getbyte(0) if String===x
|
3760
|
+
x=x.to_s(16)
|
3638
3761
|
x.size==1 and x="0"+x
|
3639
3762
|
"\\x"+x
|
3640
3763
|
}
|
3641
3764
|
safe.gsub! /\\\\/,"__"
|
3642
3765
|
safe[/[^ -~]|\\\\/] and fail
|
3643
|
-
cp="check_parsing '#{escaped}'
|
3766
|
+
cp="check_parsing '#{escaped}'"
|
3644
3767
|
cp="#{wrap}{#{cp}}" if wrap
|
3645
3768
|
"
|
3646
3769
|
define_method 'test_parsing_of_#{safe}' do
|
3647
3770
|
#puts 'test_parsing_of_#{safe}'
|
3648
|
-
pt=ParseTree.new
|
3649
3771
|
#{cp}
|
3650
3772
|
end
|
3651
3773
|
"
|
@@ -3678,7 +3800,7 @@ EOS
|
|
3678
3800
|
end
|
3679
3801
|
}
|
3680
3802
|
wrapped+injected
|
3681
|
-
}.
|
3803
|
+
}.join
|
3682
3804
|
#puts code.split("\n")[5880..5890].join("\n")
|
3683
3805
|
eval code
|
3684
3806
|
|
@@ -3689,7 +3811,7 @@ EOS
|
|
3689
3811
|
/\A\s*x\s*\{(.*)\}\Z/===xmpl and xmpl=$1
|
3690
3812
|
|
3691
3813
|
snippet2testmethod(xmpl, :known_ruby_bug)
|
3692
|
-
}.
|
3814
|
+
}.join
|
3693
3815
|
eval error_code
|
3694
3816
|
|
3695
3817
|
error_code=ERROR_EXAMPLES.map{|xmpl|
|
@@ -3699,7 +3821,7 @@ EOS
|
|
3699
3821
|
/\A\s*x\s*\{(.*)\}\Z/===xmpl and xmpl=$1
|
3700
3822
|
|
3701
3823
|
snippet2testmethod(xmpl, :known_error)
|
3702
|
-
}.
|
3824
|
+
}.join
|
3703
3825
|
eval error_code
|
3704
3826
|
|
3705
3827
|
failure_code=FAILURE_EXAMPLES.map{|xmpl|
|
@@ -3709,9 +3831,11 @@ EOS
|
|
3709
3831
|
/\A\s*x\s*\{(.*)\}\Z/===xmpl and xmpl=$1
|
3710
3832
|
|
3711
3833
|
snippet2testmethod(xmpl, :known_failure)
|
3712
|
-
}.
|
3834
|
+
}.join
|
3713
3835
|
eval failure_code
|
3714
3836
|
|
3837
|
+
Test::Unit::AssertionFailedError=MiniTest::Assertion unless defined? Test::Unit::AssertionFailedError
|
3838
|
+
|
3715
3839
|
def known_ruby_bug
|
3716
3840
|
from=caller.first
|
3717
3841
|
from=from[/ in `.*'\Z/] || from[/\A[^:]*:[^:]*/]
|
@@ -3739,19 +3863,19 @@ EOS
|
|
3739
3863
|
def test_case_that_segfaults_ruby185
|
3740
3864
|
assert_equal \
|
3741
3865
|
[[:op_asgn1, [:call, [:vcall, :a], :b], [:zarray], :%, [:vcall, :d]]],
|
3742
|
-
RedParse.new('a.b[]%=d','
|
3866
|
+
RedParse.new('a.b[]%=d','(eval)',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
|
3743
3867
|
end
|
3744
3868
|
|
3745
3869
|
def test_case_that_segfaults_ruby186_slash_parsetree211
|
3746
3870
|
assert_equal [[:cdecl, [:colon3, :B], [:lit,1]]],
|
3747
|
-
RedParse.new('::B=1','-').parse.to_parsetree(:quirks)
|
3871
|
+
RedParse.new('::B=1','-',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
|
3748
3872
|
assert_equal [[:cdecl, [:colon2, [:const, :A], :B], [:lit,1]]],
|
3749
|
-
RedParse.new('A::B=1','-').parse.to_parsetree(:quirks)
|
3873
|
+
RedParse.new('A::B=1','-',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
|
3750
3874
|
end
|
3751
3875
|
|
3752
3876
|
def test_case_that_segfaults_ruby187_slash_parsetree220
|
3753
3877
|
assert_equal [[:iter, [:fcall, :Proc], [:block_pass, [:dasgn_curr, :b], 0]]],
|
3754
|
-
RedParse.new('Proc{|&b|}','-').parse.to_parsetree(:quirks)
|
3878
|
+
RedParse.new('Proc{|&b|}','-',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
|
3755
3879
|
end
|
3756
3880
|
|
3757
3881
|
def test_cases_misparsed_by_ruby186_slash_parsetree
|
@@ -3814,7 +3938,7 @@ EOS
|
|
3814
3938
|
|
3815
3939
|
|
3816
3940
|
}.each_pair{|code,tree|
|
3817
|
-
assert_equal tree,RedParse.new(code,'-').parse.to_parsetree(:quirks)
|
3941
|
+
assert_equal tree,RedParse.new(code,'-',1,[],:cache_mode=>:none).parse.to_parsetree(:quirks)
|
3818
3942
|
}
|
3819
3943
|
end
|
3820
3944
|
|
@@ -3842,8 +3966,8 @@ EOS
|
|
3842
3966
|
end
|
3843
3967
|
end
|
3844
3968
|
|
3845
|
-
BEGIN{File.unlink "problemexprs" rescue nil}
|
3846
3969
|
def problem_exprs
|
3970
|
+
return nil
|
3847
3971
|
@problem_exprs||=nil
|
3848
3972
|
return @problem_exprs if @problem_exprs
|
3849
3973
|
|
@@ -3853,9 +3977,26 @@ EOS
|
|
3853
3977
|
@problem_exprs=$stdout
|
3854
3978
|
end
|
3855
3979
|
|
3856
|
-
def
|
3980
|
+
def ParseTree.server_running_187?
|
3981
|
+
#@server_running_187||=nil
|
3982
|
+
return @server_running_187 unless @server_running_187.nil?
|
3983
|
+
put :version
|
3984
|
+
version=get
|
3985
|
+
if Exception===version
|
3986
|
+
puts "cannot find a ruby 1.8 interpreter with parse_tree available to it. set RUBY1_8 to the path of such an interpreter"
|
3987
|
+
puts "you might want to try running #{File.dirname(__FILE__)}/generate_parse_tree_server_rc.rb from your ruby 1.8 interpreter"
|
3988
|
+
Process.waitpid @server
|
3989
|
+
@server=@in=@out=nil
|
3990
|
+
raise version
|
3991
|
+
end
|
3992
|
+
return @server_running_187= version=="1.8.7"
|
3993
|
+
end
|
3994
|
+
|
3995
|
+
def check_parsing xmpl
|
3996
|
+
ParseTree.fork_server?
|
3997
|
+
xmpl=xmpl.dup.freeze
|
3857
3998
|
pt_opts=[:quirks]
|
3858
|
-
pt_opts<<:ruby187 if
|
3999
|
+
pt_opts<<:ruby187 if ParseTree.server_running_187?
|
3859
4000
|
/unparse/===xmpl and warn 'unparse in parser test data!'
|
3860
4001
|
problem_exprs=problem_exprs()
|
3861
4002
|
nodes=warnings=warnings2=nil
|
@@ -3878,31 +4019,34 @@ EOS
|
|
3878
4019
|
# catch(:never_exec_parse_data_try1){
|
3879
4020
|
# catch(:never_exec_parse_data_try2){
|
3880
4021
|
# catch(:never_exec_parse_data_try3){
|
3881
|
-
tree,warnings=
|
4022
|
+
tree,warnings=ParseTree.parse_tree_and_warnings(xmpl)
|
3882
4023
|
# }
|
3883
4024
|
# }
|
3884
4025
|
# }
|
3885
4026
|
# break if loops+=1 > 3
|
3886
4027
|
rescue Interrupt; raise
|
3887
4028
|
rescue Exception=>e
|
3888
|
-
#pp e
|
3889
|
-
#pp e.backtrace
|
3890
|
-
#raise "last gasp ParseTree exec catcher failed!"
|
3891
4029
|
tree=e
|
3892
4030
|
tree2=nodes=h=nil
|
3893
4031
|
assert_hopefully_raises_Exception(xmpl){
|
3894
|
-
nodes=RedParse.new(xmpl,"-").parse
|
4032
|
+
nodes=RedParse.new(xmpl,"-",1,[],:cache_mode=>:write_only).parse
|
3895
4033
|
h=nodes.hash
|
3896
4034
|
tree2,warnings2=nodes.to_parsetree_and_warnings(*pt_opts)
|
3897
4035
|
}
|
3898
4036
|
assert_equal h,nodes.hash if h
|
3899
4037
|
else
|
3900
4038
|
begin
|
3901
|
-
nodes=RedParse.new(xmpl,"-").parse
|
4039
|
+
nodes=RedParse.new(xmpl,"-",1,[],:cache_mode=>:write_only).parse
|
3902
4040
|
h=nodes.hash
|
3903
4041
|
tree2,warnings2=nodes.to_parsetree_and_warnings(*pt_opts)
|
3904
|
-
assert_equal h,nodes.hash
|
3905
|
-
|
4042
|
+
assert_equal h,nodes.hash #Node tree shouldn't be modified by to_parsetree
|
4043
|
+
if tree==tree2
|
4044
|
+
assert true
|
4045
|
+
else
|
4046
|
+
assert_equal tree, RedParse.remove_silly_begins(tree2)
|
4047
|
+
warn "parse_trees differed by a :begin in #{xmpl}"
|
4048
|
+
differed_by_begin=true
|
4049
|
+
end
|
3906
4050
|
assert_equal warnings, warnings2 if ENV['WARN_PICKINESS']
|
3907
4051
|
if warnings != warnings2
|
3908
4052
|
if defined? @@mismatched_warnings
|
@@ -3912,6 +4056,7 @@ EOS
|
|
3912
4056
|
at_exit{warn "mismatched warnings: #@@mismatched_warnings (set WARN_PICKINESS for details)"}
|
3913
4057
|
end
|
3914
4058
|
end
|
4059
|
+
rescue Interrupt; raise
|
3915
4060
|
rescue Exception=>e
|
3916
4061
|
if problem_exprs
|
3917
4062
|
problem_exprs.write xmpl+"\n"
|
@@ -3927,35 +4072,49 @@ EOS
|
|
3927
4072
|
|
3928
4073
|
end #until output.equal? tree
|
3929
4074
|
|
3930
|
-
|
3931
|
-
|
3932
|
-
|
3933
|
-
|
3934
|
-
|
3935
|
-
|
4075
|
+
if nodes
|
4076
|
+
#test reading back form the cache just created
|
4077
|
+
nodes2=RedParse.new(xmpl,"-",1,[],:cache_mode=>:read_only).parse
|
4078
|
+
assert_equal nodes,nodes2
|
4079
|
+
|
4080
|
+
begin
|
4081
|
+
unparsed=nodes.unparse
|
4082
|
+
if unparsed==xmpl
|
4083
|
+
assert true
|
4084
|
+
done_already=true
|
4085
|
+
end
|
4086
|
+
rescue Exception
|
4087
|
+
raise unless Exception===tree
|
3936
4088
|
end
|
3937
|
-
|
3938
|
-
|
3939
|
-
|
3940
|
-
|
3941
|
-
|
3942
|
-
|
4089
|
+
begin
|
4090
|
+
reparsed= RedParse.new(unparsed,"-",1,[],:cache_mode=>:none).parse
|
4091
|
+
if nodes.delete_extraneous_ivars! != reparsed.delete_extraneous_ivars!
|
4092
|
+
assert_equal nodes.delete_linenums!, reparsed.delete_linenums!
|
4093
|
+
warn "unparser doesn't preserve linenums perfectly in #{xmpl}"
|
4094
|
+
if defined? @@unparse_mismatched_linenums
|
4095
|
+
@@unparse_mismatched_linenums+=1
|
4096
|
+
else
|
4097
|
+
@@unparse_mismatched_linenums=1
|
4098
|
+
at_exit{warn "unparse mismatched linenums: #@@unparse_mismatched_linenums"}
|
4099
|
+
end
|
3943
4100
|
else
|
3944
|
-
|
3945
|
-
at_exit{warn "unparse mismatched linenums: #@@unparse_mismatched_linenums"}
|
4101
|
+
assert true
|
3946
4102
|
end
|
3947
|
-
|
3948
|
-
|
4103
|
+
rescue Exception
|
4104
|
+
raise unless Exception===tree
|
4105
|
+
end unless done_already
|
4106
|
+
|
4107
|
+
assert_equal nodes, Marshal.load(Marshal.dump(nodes))
|
4108
|
+
assert_equal nodes, Ron.load(Ron.dump(nodes)) if defined? Ron
|
4109
|
+
assert_equal nodes, nodes.deep_copy
|
4110
|
+
|
4111
|
+
unless done_already or Exception===tree or differed_by_begin
|
4112
|
+
tree3=reparsed.to_parsetree(*pt_opts)
|
4113
|
+
assert_equal tree, tree3
|
4114
|
+
else #missing a syntax errr, but that's been noted already
|
3949
4115
|
end
|
3950
|
-
rescue Exception
|
3951
|
-
raise unless Exception===tree
|
3952
4116
|
end
|
3953
4117
|
|
3954
|
-
unless Exception===tree
|
3955
|
-
tree3=reparsed.to_parsetree(*pt_opts)
|
3956
|
-
assert_equal tree, tree3
|
3957
|
-
else #missing a syntax errr, but that's been noted already
|
3958
|
-
end
|
3959
4118
|
|
3960
4119
|
# rescue Exception=>e:
|
3961
4120
|
# raise "error: #{e}:#{e.class} while testing '#{xmpl}'"
|