ParseTree 1.3.4 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +8 -0
- data/Manifest.txt +1 -0
- data/bin/parse_tree_show +1 -0
- data/lib/composite_sexp_processor.rb +6 -0
- data/lib/parse_tree.rb +1 -1
- data/lib/sexp_processor.rb +37 -8
- data/validate.sh +31 -0
- metadata +16 -7
- data/ParseTree.gemspec +0 -39
data/History.txt
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
*** 1.3.5 / 2005-04-19
|
2
|
+
|
3
|
+
+ 2 minor enhancement
|
4
|
+
+ Added dynamic exception handling on a per node-type basis (BIG).
|
5
|
+
+ Added -c=classname to parse_tree_show to help w/ core classes.
|
6
|
+
+ 1 bug fix
|
7
|
+
+ Fixed dependency specification error in gemspec.
|
8
|
+
|
1
9
|
*** 1.3.4 / 2005-02-09
|
2
10
|
|
3
11
|
+ 2 bug fixes
|
data/Manifest.txt
CHANGED
data/bin/parse_tree_show
CHANGED
data/lib/parse_tree.rb
CHANGED
data/lib/sexp_processor.rb
CHANGED
@@ -310,6 +310,7 @@ class SexpProcessor
|
|
310
310
|
@expected = Sexp
|
311
311
|
@require_empty = true
|
312
312
|
@sexp_accessors = {}
|
313
|
+
@exceptions = {}
|
313
314
|
|
314
315
|
# we do this on an instance basis so we can subclass it for
|
315
316
|
# different processors.
|
@@ -334,7 +335,7 @@ class SexpProcessor
|
|
334
335
|
def process(exp)
|
335
336
|
return nil if exp.nil?
|
336
337
|
|
337
|
-
exp_orig = exp.deep_clone if $DEBUG
|
338
|
+
exp_orig = exp.deep_clone if $DEBUG or @exceptions.has_key?(exp.first)
|
338
339
|
result = self.expected.new
|
339
340
|
|
340
341
|
type = exp.first
|
@@ -355,9 +356,12 @@ class SexpProcessor
|
|
355
356
|
raise UnsupportedNodeError, "'#{type}' is not a supported node type" if @unsupported.include? type
|
356
357
|
|
357
358
|
# do a pass through the rewriter first, if any, reassign back to exp
|
359
|
+
# TODO: maybe the whole rewriting thing needs to be nuked
|
358
360
|
meth = @rewriters[type]
|
359
361
|
if meth then
|
360
|
-
new_exp =
|
362
|
+
new_exp = error_handler(type, exp_orig) do
|
363
|
+
self.send(meth, exp)
|
364
|
+
end
|
361
365
|
# REFACTOR: duplicated from below
|
362
366
|
if @require_empty and not exp.empty? then
|
363
367
|
msg = "exp not empty after #{self.class}.#{meth} on #{exp.inspect}"
|
@@ -379,14 +383,15 @@ class SexpProcessor
|
|
379
383
|
|
380
384
|
exp.shift if @auto_shift_type and meth != @default_method
|
381
385
|
|
382
|
-
result =
|
386
|
+
result = error_handler(type, exp_orig) do
|
387
|
+
self.send(meth, exp)
|
388
|
+
end
|
389
|
+
|
383
390
|
raise TypeError, "Result must be a #{@expected}, was #{result.class}:#{result.inspect}" unless @expected === result
|
384
391
|
|
385
392
|
if @require_empty and not exp.empty? then
|
386
393
|
msg = "exp not empty after #{self.class}.#{meth} on #{exp.inspect}"
|
387
|
-
if $DEBUG
|
388
|
-
msg += " from #{exp_orig.inspect}"
|
389
|
-
end
|
394
|
+
msg += " from #{exp_orig.inspect}" if $DEBUG
|
390
395
|
raise NotEmptyError, msg
|
391
396
|
end
|
392
397
|
else
|
@@ -395,7 +400,9 @@ class SexpProcessor
|
|
395
400
|
sub_exp = exp.shift
|
396
401
|
sub_result = nil
|
397
402
|
if Array === sub_exp then
|
398
|
-
sub_result =
|
403
|
+
sub_result = error_handler(type, exp_orig) do
|
404
|
+
process(sub_exp)
|
405
|
+
end
|
399
406
|
raise "Result is a bad type" unless Array === sub_exp
|
400
407
|
raise "Result does not have a type in front: #{sub_exp.inspect}" unless Symbol === sub_exp.first unless sub_exp.empty?
|
401
408
|
else
|
@@ -413,7 +420,9 @@ class SexpProcessor
|
|
413
420
|
# nothing to do, on purpose
|
414
421
|
end
|
415
422
|
else
|
416
|
-
|
423
|
+
msg = "Bug! Unknown node-type #{type.inspect} to #{self.class}"
|
424
|
+
msg += " in #{exp_orig.inspect} from #{caller.inspect}" if $DEBUG
|
425
|
+
raise UnknownNodeError, msg
|
417
426
|
end
|
418
427
|
end
|
419
428
|
result
|
@@ -431,6 +440,26 @@ class SexpProcessor
|
|
431
440
|
list.first != typ
|
432
441
|
end
|
433
442
|
|
443
|
+
def error_handler(type, exp=nil) # :nodoc:
|
444
|
+
if @exceptions.has_key? type then
|
445
|
+
begin
|
446
|
+
return yield
|
447
|
+
rescue Exception => err
|
448
|
+
return @exceptions[type].call(self, exp, err)
|
449
|
+
end
|
450
|
+
else
|
451
|
+
return yield
|
452
|
+
end
|
453
|
+
end
|
454
|
+
private :error_handler
|
455
|
+
|
456
|
+
##
|
457
|
+
# Registers an error handler for +node+
|
458
|
+
|
459
|
+
def on(node, &block)
|
460
|
+
@exceptions[node] = block
|
461
|
+
end
|
462
|
+
|
434
463
|
##
|
435
464
|
# A fairly generic processor for a dummy node. Dummy nodes are used
|
436
465
|
# when your processor is doing a complicated rewrite that replaces
|
data/validate.sh
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# set -xv
|
4
|
+
|
5
|
+
trap "exit 1" 1 2 3 15
|
6
|
+
|
7
|
+
DIRS="-I../../metaruby/dev/tests/builtin -I../../metaruby/dev/tests -Ilib"
|
8
|
+
for d in $(ls -d ../../*/dev); do
|
9
|
+
DIRS="-I$d $DIRS"
|
10
|
+
done
|
11
|
+
|
12
|
+
if [ -f rb.bad.txt ]; then
|
13
|
+
mv rb.bad.txt rb.files.txt
|
14
|
+
else
|
15
|
+
find ../../*/dev /usr/local/lib/ruby/1.8/ -name \*.rb > rb.files.txt
|
16
|
+
fi
|
17
|
+
|
18
|
+
total_count=$(wc -l rb.files.txt | awk '{print $1}')
|
19
|
+
curr_count=0
|
20
|
+
for f in $(cat rb.files.txt); do
|
21
|
+
curr_count=$(($curr_count + 1))
|
22
|
+
if GEM_SKIP=ParseTree ruby $DIRS ./bin/parse_tree_show -q $f > /dev/null 2> rb.err.txt < /dev/null; then
|
23
|
+
echo $f >> rb.good.txt
|
24
|
+
status=pass
|
25
|
+
else
|
26
|
+
echo $f >> rb.bad.txt
|
27
|
+
status=fail
|
28
|
+
fi
|
29
|
+
fname=`basename $f`
|
30
|
+
printf "%4d/%4d: %s %s\n" $curr_count $total_count $status $fname
|
31
|
+
done
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.8.
|
2
|
+
rubygems_version: 0.8.10
|
3
3
|
specification_version: 1
|
4
4
|
name: ParseTree
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.3.
|
7
|
-
date: 2005-
|
6
|
+
version: 1.3.5
|
7
|
+
date: 2005-04-19
|
8
8
|
summary: Extract and enumerate ruby parse trees.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,7 +34,6 @@ files:
|
|
34
34
|
- Makefile
|
35
35
|
- Manifest.txt
|
36
36
|
- README.txt
|
37
|
-
- ParseTree.gemspec
|
38
37
|
- bin/parse_tree_abc
|
39
38
|
- bin/parse_tree_deps
|
40
39
|
- bin/parse_tree_show
|
@@ -46,6 +45,7 @@ files:
|
|
46
45
|
- test/test_composite_sexp_processor.rb
|
47
46
|
- test/test_parse_tree.rb
|
48
47
|
- test/test_sexp_processor.rb
|
48
|
+
- validate.sh
|
49
49
|
test_files:
|
50
50
|
- test/test_all.rb
|
51
51
|
rdoc_options: []
|
@@ -55,6 +55,15 @@ executables:
|
|
55
55
|
- parse_tree_deps
|
56
56
|
- parse_tree_show
|
57
57
|
extensions: []
|
58
|
-
requirements:
|
59
|
-
|
60
|
-
|
58
|
+
requirements: []
|
59
|
+
dependencies:
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: RubyInline
|
62
|
+
version_requirement:
|
63
|
+
version_requirements: !ruby/object:Gem::Version::Requirement
|
64
|
+
requirements:
|
65
|
+
-
|
66
|
+
- ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.2.0
|
69
|
+
version:
|
data/ParseTree.gemspec
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
$: << "./lib"
|
5
|
-
require 'parse_tree'
|
6
|
-
|
7
|
-
spec = Gem::Specification.new do |s|
|
8
|
-
|
9
|
-
s.name = 'ParseTree'
|
10
|
-
s.version = ParseTree::VERSION
|
11
|
-
s.summary = "Extract and enumerate ruby parse trees."
|
12
|
-
|
13
|
-
paragraphs = File.read("README.txt").split(/\n\n+/)
|
14
|
-
s.description = paragraphs[2]
|
15
|
-
puts "Description = #{s.description}"
|
16
|
-
|
17
|
-
s.requirements << "RubyInline."
|
18
|
-
s.files = IO.readlines("Manifest.txt").map {|f| f.chomp }
|
19
|
-
|
20
|
-
s.require_paths = ['lib', 'test']
|
21
|
-
s.autorequire = 'parse_tree'
|
22
|
-
|
23
|
-
s.bindir = "bin"
|
24
|
-
s.executables = s.files.grep(Regexp.new(s.bindir)) { |f| File.basename(f) }
|
25
|
-
puts "Executables = #{s.executables.join(", ")}"
|
26
|
-
|
27
|
-
s.has_rdoc = true
|
28
|
-
s.test_suite_file = "test/test_all.rb"
|
29
|
-
|
30
|
-
s.author = "Ryan Davis"
|
31
|
-
s.email = "ryand-ruby@zenspider.com"
|
32
|
-
s.homepage = "http://www.zenspider.com/ZSS/Products/ParseTree/"
|
33
|
-
s.rubyforge_project = "parsetree"
|
34
|
-
end
|
35
|
-
|
36
|
-
if $0 == __FILE__
|
37
|
-
Gem.manage_gems
|
38
|
-
Gem::Builder.new(spec).build
|
39
|
-
end
|