ParseTree 1.3.4 → 1.3.5
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/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
|