gf-treevisitor 0.0.8 → 0.0.10
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/VERSION +1 -1
- data/bin/tree.rb +9 -9
- data/lib/gf_utilities/kwartzhelper.rb +90 -90
- data/lib/gf_utilities/md5.rb +24 -24
- data/lib/gf_utilities/numeric.rb +17 -17
- data/lib/treevisitor/abs_node.rb +116 -116
- data/lib/treevisitor/cli/cli_tree.rb +2 -1
- data/lib/treevisitor/dir_processor.rb +40 -40
- data/lib/treevisitor/dir_tree_walker.rb +116 -116
- data/lib/treevisitor/leaf_node.rb +31 -27
- data/lib/treevisitor/tree_node.rb +134 -134
- data/lib/treevisitor/tree_node_visitor.rb +31 -31
- data/lib/treevisitor/visitors/block_tree_node_visitor.rb +4 -5
- data/lib/treevisitor/visitors/build_dir_tree_visitor.rb +44 -46
- data/lib/treevisitor/visitors/callback_tree_node_visitor.rb +6 -4
- data/lib/treevisitor/visitors/callback_tree_node_visitor2.rb +6 -4
- data/lib/treevisitor/visitors/clone_tree_node_visitor.rb +4 -5
- data/lib/treevisitor/visitors/depth_tree_node_visitor.rb +4 -4
- data/lib/treevisitor/visitors/flat_print_tree_node_visitors.rb +4 -5
- data/lib/treevisitor/visitors/print_dir_tree_visitor.rb +6 -6
- data/lib/treevisitor/visitors/print_tree_node_visitor.rb +6 -3
- data/lib/treevisitor/visitors/{print_node_visitor2.rb → print_tree_node_visitor2.rb} +9 -6
- data/lib/treevisitor.rb +3 -3
- data/test/gf_utilities/tc_md5.rb +14 -14
- data/test/treevisitor/cli/tc_cli_tree.rb +1 -1
- data/test/treevisitor/tc_dir_processor.rb +2 -2
- data/test/treevisitor/tc_tree_node.rb +3 -0
- metadata +5 -5
@@ -1,116 +1,116 @@
|
|
1
|
-
require 'treevisitor/visitors/block_tree_node_visitor'
|
2
|
-
|
3
|
-
class DirTreeWalker
|
4
|
-
|
5
|
-
def initialize( dirname )
|
6
|
-
@dirname = dirname
|
7
|
-
unless File.directory?( dirname )
|
8
|
-
raise "#{dirname} is not a directory!"
|
9
|
-
end
|
10
|
-
|
11
|
-
@visitor = nil
|
12
|
-
|
13
|
-
#
|
14
|
-
# pattern
|
15
|
-
#
|
16
|
-
@ignore_dir_patterns = []
|
17
|
-
@ignore_file_patterns = []
|
18
|
-
|
19
|
-
@inspect_file_patterns = []
|
20
|
-
|
21
|
-
#
|
22
|
-
# options
|
23
|
-
#
|
24
|
-
|
25
|
-
@visit_leaf = true
|
26
|
-
end
|
27
|
-
|
28
|
-
##########################################################################
|
29
|
-
# Pattern
|
30
|
-
#
|
31
|
-
def add_ignore_pattern(pattern)
|
32
|
-
@ignore_dir_patterns << pattern
|
33
|
-
@ignore_file_patterns << pattern
|
34
|
-
end
|
35
|
-
|
36
|
-
def add_ignore_dir( pattern )
|
37
|
-
@ignore_dir_patterns << pattern
|
38
|
-
end
|
39
|
-
|
40
|
-
def add_ignore_file( pattern )
|
41
|
-
@ignore_file_patterns << pattern
|
42
|
-
end
|
43
|
-
|
44
|
-
#
|
45
|
-
# quali file bisogna prendere in considerazione
|
46
|
-
# inspect opposto di ignore :-)
|
47
|
-
#
|
48
|
-
def add_inspect_file( pattern )
|
49
|
-
@inspect_file_patterns << pattern
|
50
|
-
end
|
51
|
-
|
52
|
-
##########################################################################
|
53
|
-
# Options
|
54
|
-
|
55
|
-
attr_accessor :visit_leaf
|
56
|
-
|
57
|
-
##########################################################################
|
58
|
-
|
59
|
-
|
60
|
-
def ignore_dir?( dirname )
|
61
|
-
include?( @ignore_dir_patterns, File.basename( dirname ) )
|
62
|
-
end
|
63
|
-
|
64
|
-
def ignore_file?( filename )
|
65
|
-
include?( @ignore_file_patterns, File.basename( filename ) )
|
66
|
-
end
|
67
|
-
|
68
|
-
def inspect_file?( filename )
|
69
|
-
return true if @inspect_file_patterns.empty?
|
70
|
-
include?( @inspect_file_patterns, File.basename( filename ) )
|
71
|
-
end
|
72
|
-
|
73
|
-
def run( treeNodeVisitor )
|
74
|
-
@visitor = treeNodeVisitor
|
75
|
-
process_directory( File.expand_path( @dirname ) )
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def include?(patterns, basename)
|
81
|
-
# return false if the patters.empty?
|
82
|
-
patterns.find{ |pattern|
|
83
|
-
if pattern.respond_to?(:match) # or if pattern.kind_of? Regexp
|
84
|
-
pattern.match( basename )
|
85
|
-
else
|
86
|
-
basename == pattern
|
87
|
-
end
|
88
|
-
}
|
89
|
-
end
|
90
|
-
|
91
|
-
#
|
92
|
-
# recurse on other directories
|
93
|
-
#
|
94
|
-
# def process_directory( parentNode, dirname )
|
95
|
-
def process_directory( dirname )
|
96
|
-
@visitor.
|
97
|
-
# return if ignore_dir?( dirname )
|
98
|
-
|
99
|
-
Dir.entries( dirname ).each { |basename|
|
100
|
-
next if basename == "." or basename == ".." # ignore always "." and ".."
|
101
|
-
pathname = File.join( dirname, basename )
|
102
|
-
|
103
|
-
if File.directory?( pathname )
|
104
|
-
# directory
|
105
|
-
process_directory( pathname ) unless ignore_dir?( basename )
|
106
|
-
else
|
107
|
-
if @visit_leaf
|
108
|
-
if inspect_file?( basename ) && ! ignore_file?( basename )
|
109
|
-
@visitor.
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
}
|
114
|
-
@visitor.
|
115
|
-
end
|
116
|
-
end
|
1
|
+
require 'treevisitor/visitors/block_tree_node_visitor'
|
2
|
+
|
3
|
+
class DirTreeWalker
|
4
|
+
|
5
|
+
def initialize( dirname )
|
6
|
+
@dirname = dirname
|
7
|
+
unless File.directory?( dirname )
|
8
|
+
raise "#{dirname} is not a directory!"
|
9
|
+
end
|
10
|
+
|
11
|
+
@visitor = nil
|
12
|
+
|
13
|
+
#
|
14
|
+
# pattern
|
15
|
+
#
|
16
|
+
@ignore_dir_patterns = []
|
17
|
+
@ignore_file_patterns = []
|
18
|
+
|
19
|
+
@inspect_file_patterns = []
|
20
|
+
|
21
|
+
#
|
22
|
+
# options
|
23
|
+
#
|
24
|
+
|
25
|
+
@visit_leaf = true
|
26
|
+
end
|
27
|
+
|
28
|
+
##########################################################################
|
29
|
+
# Pattern
|
30
|
+
#
|
31
|
+
def add_ignore_pattern(pattern)
|
32
|
+
@ignore_dir_patterns << pattern
|
33
|
+
@ignore_file_patterns << pattern
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_ignore_dir( pattern )
|
37
|
+
@ignore_dir_patterns << pattern
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_ignore_file( pattern )
|
41
|
+
@ignore_file_patterns << pattern
|
42
|
+
end
|
43
|
+
|
44
|
+
#
|
45
|
+
# quali file bisogna prendere in considerazione
|
46
|
+
# inspect opposto di ignore :-)
|
47
|
+
#
|
48
|
+
def add_inspect_file( pattern )
|
49
|
+
@inspect_file_patterns << pattern
|
50
|
+
end
|
51
|
+
|
52
|
+
##########################################################################
|
53
|
+
# Options
|
54
|
+
|
55
|
+
attr_accessor :visit_leaf
|
56
|
+
|
57
|
+
##########################################################################
|
58
|
+
|
59
|
+
|
60
|
+
def ignore_dir?( dirname )
|
61
|
+
include?( @ignore_dir_patterns, File.basename( dirname ) )
|
62
|
+
end
|
63
|
+
|
64
|
+
def ignore_file?( filename )
|
65
|
+
include?( @ignore_file_patterns, File.basename( filename ) )
|
66
|
+
end
|
67
|
+
|
68
|
+
def inspect_file?( filename )
|
69
|
+
return true if @inspect_file_patterns.empty?
|
70
|
+
include?( @inspect_file_patterns, File.basename( filename ) )
|
71
|
+
end
|
72
|
+
|
73
|
+
def run( treeNodeVisitor )
|
74
|
+
@visitor = treeNodeVisitor
|
75
|
+
process_directory( File.expand_path( @dirname ) )
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
|
80
|
+
def include?(patterns, basename)
|
81
|
+
# return false if the patters.empty?
|
82
|
+
patterns.find{ |pattern|
|
83
|
+
if pattern.respond_to?(:match) # or if pattern.kind_of? Regexp
|
84
|
+
pattern.match( basename )
|
85
|
+
else
|
86
|
+
basename == pattern
|
87
|
+
end
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
#
|
92
|
+
# recurse on other directories
|
93
|
+
#
|
94
|
+
# def process_directory( parentNode, dirname )
|
95
|
+
def process_directory( dirname )
|
96
|
+
@visitor.enter_tree_node( dirname )
|
97
|
+
# return if ignore_dir?( dirname )
|
98
|
+
|
99
|
+
Dir.entries( dirname ).each { |basename|
|
100
|
+
next if basename == "." or basename == ".." # ignore always "." and ".."
|
101
|
+
pathname = File.join( dirname, basename )
|
102
|
+
|
103
|
+
if File.directory?( pathname )
|
104
|
+
# directory
|
105
|
+
process_directory( pathname ) unless ignore_dir?( basename )
|
106
|
+
else
|
107
|
+
if @visit_leaf
|
108
|
+
if inspect_file?( basename ) && ! ignore_file?( basename )
|
109
|
+
@visitor.visit_leaf_node( pathname )
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
}
|
114
|
+
@visitor.exit_tree_node( dirname )
|
115
|
+
end
|
116
|
+
end
|
@@ -1,27 +1,31 @@
|
|
1
|
-
# common
|
2
|
-
require "treevisitor/abs_node"
|
3
|
-
|
4
|
-
#
|
5
|
-
# Deriva da AbsNode
|
6
|
-
#
|
7
|
-
# definisce un metodo to_str
|
8
|
-
#
|
9
|
-
#
|
10
|
-
class LeafNode < AbsNode
|
11
|
-
|
12
|
-
def initialize( name, parent = nil )
|
13
|
-
super( name )
|
14
|
-
if parent
|
15
|
-
parent.add_leaf( self )
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
def
|
24
|
-
|
25
|
-
end
|
26
|
-
|
27
|
-
|
1
|
+
# common
|
2
|
+
require "treevisitor/abs_node"
|
3
|
+
|
4
|
+
#
|
5
|
+
# Deriva da AbsNode
|
6
|
+
#
|
7
|
+
# definisce un metodo to_str
|
8
|
+
#
|
9
|
+
#
|
10
|
+
class LeafNode < AbsNode
|
11
|
+
|
12
|
+
def initialize( name, parent = nil )
|
13
|
+
super( name )
|
14
|
+
if parent
|
15
|
+
parent.add_leaf( self )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def root?
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def accept( visitor )
|
24
|
+
visitor.visit_leaf_node( self )
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_str
|
28
|
+
name.to_str
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -1,134 +1,134 @@
|
|
1
|
-
# common
|
2
|
-
require 'treevisitor/leaf_node'
|
3
|
-
|
4
|
-
#
|
5
|
-
# Un treeNode e' come un AbsNode
|
6
|
-
# in piu' ha la possibilita' di contenere
|
7
|
-
# altri treeNode e LeafNode
|
8
|
-
#
|
9
|
-
# TreeNode @childs -1---n-> TreeNode
|
10
|
-
# @leaves -1---n-> LeafNode
|
11
|
-
#
|
12
|
-
class TreeNode < AbsNode
|
13
|
-
|
14
|
-
attr_reader :leaves
|
15
|
-
attr_reader :childs
|
16
|
-
|
17
|
-
def initialize( name, parent = nil )
|
18
|
-
@leaves = []
|
19
|
-
@childs = []
|
20
|
-
super( name )
|
21
|
-
if parent
|
22
|
-
parent.add_child( self )
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def root?
|
27
|
-
@parent.nil?
|
28
|
-
end
|
29
|
-
|
30
|
-
#
|
31
|
-
# invalidate cached info
|
32
|
-
#
|
33
|
-
def invalidate
|
34
|
-
super
|
35
|
-
@childs.each{ |c| c.invalidate }
|
36
|
-
@leaves.each{ |l| l.invalidate }
|
37
|
-
end
|
38
|
-
|
39
|
-
def nr_nodes
|
40
|
-
nr = @leaves.length + @childs.length
|
41
|
-
@childs.inject( nr ) { |nr,c| nr + c.nr_nodes }
|
42
|
-
end
|
43
|
-
|
44
|
-
def nr_leaves
|
45
|
-
@leaves.length + @childs.inject(0) { |sum, child| sum + child.nr_leaves }
|
46
|
-
end
|
47
|
-
|
48
|
-
def nr_childs
|
49
|
-
@childs.length + @childs.inject(0) { |sum, child| sum + child.nr_childs }
|
50
|
-
end
|
51
|
-
|
52
|
-
def add_leaf( leaf )
|
53
|
-
return if leaf.parent == self
|
54
|
-
if not leaf.parent.nil?
|
55
|
-
leaf.remove_from_parent()
|
56
|
-
end
|
57
|
-
leaf.parent = self
|
58
|
-
if @leaves.length > 0
|
59
|
-
@leaves.last.next = leaf
|
60
|
-
leaf.prev = @leaves.last
|
61
|
-
leaf.next = nil
|
62
|
-
end
|
63
|
-
leaf.invalidate
|
64
|
-
@leaves << leaf
|
65
|
-
end
|
66
|
-
|
67
|
-
def add_child( treeNode )
|
68
|
-
return if treeNode.parent == self
|
69
|
-
if not treeNode.parent.nil?
|
70
|
-
treeNode.remove_from_parent()
|
71
|
-
end
|
72
|
-
treeNode.invalidate
|
73
|
-
treeNode.parent = self
|
74
|
-
@childs << treeNode
|
75
|
-
end
|
76
|
-
|
77
|
-
def find( name )
|
78
|
-
if self.name == name
|
79
|
-
return self
|
80
|
-
end
|
81
|
-
|
82
|
-
leaf = @leaves.find { |l| l.name == name }
|
83
|
-
if leaf
|
84
|
-
return leaf
|
85
|
-
end
|
86
|
-
|
87
|
-
@childs.each {|c|
|
88
|
-
node = c.find(name)
|
89
|
-
return node if node
|
90
|
-
}
|
91
|
-
nil
|
92
|
-
end
|
93
|
-
|
94
|
-
def accept( visitor )
|
95
|
-
visitor.
|
96
|
-
@leaves.each{ |l|
|
97
|
-
l.accept( visitor )
|
98
|
-
}
|
99
|
-
@childs.each { |tn|
|
100
|
-
tn.accept( visitor )
|
101
|
-
}
|
102
|
-
visitor.
|
103
|
-
end
|
104
|
-
|
105
|
-
def to_str( depth = 0 )
|
106
|
-
str = ""
|
107
|
-
(0...depth).step {
|
108
|
-
str << " |-"
|
109
|
-
}
|
110
|
-
|
111
|
-
str << @name
|
112
|
-
str << "\n"
|
113
|
-
|
114
|
-
if ! @leaves.empty?
|
115
|
-
@leaves.each{ |l|
|
116
|
-
(0...depth-1).step {
|
117
|
-
str << " |-"
|
118
|
-
}
|
119
|
-
if @childs.empty?
|
120
|
-
str << " | "
|
121
|
-
else
|
122
|
-
str << " | | "
|
123
|
-
end
|
124
|
-
str << l.to_str
|
125
|
-
str << "\n"
|
126
|
-
}
|
127
|
-
end
|
128
|
-
|
129
|
-
@childs.each { |tn|
|
130
|
-
str << tn.to_str( depth + 1 )
|
131
|
-
}
|
132
|
-
str
|
133
|
-
end
|
134
|
-
end
|
1
|
+
# common
|
2
|
+
require 'treevisitor/leaf_node'
|
3
|
+
|
4
|
+
#
|
5
|
+
# Un treeNode e' come un AbsNode
|
6
|
+
# in piu' ha la possibilita' di contenere
|
7
|
+
# altri treeNode e LeafNode
|
8
|
+
#
|
9
|
+
# TreeNode @childs -1---n-> TreeNode
|
10
|
+
# @leaves -1---n-> LeafNode
|
11
|
+
#
|
12
|
+
class TreeNode < AbsNode
|
13
|
+
|
14
|
+
attr_reader :leaves
|
15
|
+
attr_reader :childs
|
16
|
+
|
17
|
+
def initialize( name, parent = nil )
|
18
|
+
@leaves = []
|
19
|
+
@childs = []
|
20
|
+
super( name )
|
21
|
+
if parent
|
22
|
+
parent.add_child( self )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def root?
|
27
|
+
@parent.nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# invalidate cached info
|
32
|
+
#
|
33
|
+
def invalidate
|
34
|
+
super
|
35
|
+
@childs.each{ |c| c.invalidate }
|
36
|
+
@leaves.each{ |l| l.invalidate }
|
37
|
+
end
|
38
|
+
|
39
|
+
def nr_nodes
|
40
|
+
nr = @leaves.length + @childs.length
|
41
|
+
@childs.inject( nr ) { |nr,c| nr + c.nr_nodes }
|
42
|
+
end
|
43
|
+
|
44
|
+
def nr_leaves
|
45
|
+
@leaves.length + @childs.inject(0) { |sum, child| sum + child.nr_leaves }
|
46
|
+
end
|
47
|
+
|
48
|
+
def nr_childs
|
49
|
+
@childs.length + @childs.inject(0) { |sum, child| sum + child.nr_childs }
|
50
|
+
end
|
51
|
+
|
52
|
+
def add_leaf( leaf )
|
53
|
+
return if leaf.parent == self
|
54
|
+
if not leaf.parent.nil?
|
55
|
+
leaf.remove_from_parent()
|
56
|
+
end
|
57
|
+
leaf.parent = self
|
58
|
+
if @leaves.length > 0
|
59
|
+
@leaves.last.next = leaf
|
60
|
+
leaf.prev = @leaves.last
|
61
|
+
leaf.next = nil
|
62
|
+
end
|
63
|
+
leaf.invalidate
|
64
|
+
@leaves << leaf
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_child( treeNode )
|
68
|
+
return if treeNode.parent == self
|
69
|
+
if not treeNode.parent.nil?
|
70
|
+
treeNode.remove_from_parent()
|
71
|
+
end
|
72
|
+
treeNode.invalidate
|
73
|
+
treeNode.parent = self
|
74
|
+
@childs << treeNode
|
75
|
+
end
|
76
|
+
|
77
|
+
def find( name )
|
78
|
+
if self.name == name
|
79
|
+
return self
|
80
|
+
end
|
81
|
+
|
82
|
+
leaf = @leaves.find { |l| l.name == name }
|
83
|
+
if leaf
|
84
|
+
return leaf
|
85
|
+
end
|
86
|
+
|
87
|
+
@childs.each {|c|
|
88
|
+
node = c.find(name)
|
89
|
+
return node if node
|
90
|
+
}
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
|
94
|
+
def accept( visitor )
|
95
|
+
visitor.enter_tree_node( self )
|
96
|
+
@leaves.each{ |l|
|
97
|
+
l.accept( visitor )
|
98
|
+
}
|
99
|
+
@childs.each { |tn|
|
100
|
+
tn.accept( visitor )
|
101
|
+
}
|
102
|
+
visitor.exit_tree_node( self )
|
103
|
+
end
|
104
|
+
|
105
|
+
def to_str( depth = 0 )
|
106
|
+
str = ""
|
107
|
+
(0...depth).step {
|
108
|
+
str << " |-"
|
109
|
+
}
|
110
|
+
|
111
|
+
str << @name
|
112
|
+
str << "\n"
|
113
|
+
|
114
|
+
if ! @leaves.empty?
|
115
|
+
@leaves.each{ |l|
|
116
|
+
(0...depth-1).step {
|
117
|
+
str << " |-"
|
118
|
+
}
|
119
|
+
if @childs.empty?
|
120
|
+
str << " | "
|
121
|
+
else
|
122
|
+
str << " | | "
|
123
|
+
end
|
124
|
+
str << l.to_str
|
125
|
+
str << "\n"
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
@childs.each { |tn|
|
130
|
+
str << tn.to_str( depth + 1 )
|
131
|
+
}
|
132
|
+
str
|
133
|
+
end
|
134
|
+
end
|
@@ -1,31 +1,31 @@
|
|
1
|
-
# rubygems
|
2
|
-
require 'rubygems'
|
3
|
-
require 'abstract'
|
4
|
-
|
5
|
-
#
|
6
|
-
# Classe astratta per visitare un TreeNode
|
7
|
-
#
|
8
|
-
class TreeNodeVisitor
|
9
|
-
|
10
|
-
def
|
11
|
-
not_implemented
|
12
|
-
end
|
13
|
-
|
14
|
-
def
|
15
|
-
not_implemented
|
16
|
-
end
|
17
|
-
|
18
|
-
def
|
19
|
-
not_implemented
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
1
|
+
# rubygems
|
2
|
+
require 'rubygems'
|
3
|
+
require 'abstract'
|
4
|
+
|
5
|
+
#
|
6
|
+
# Classe astratta per visitare un TreeNode
|
7
|
+
#
|
8
|
+
class TreeNodeVisitor
|
9
|
+
|
10
|
+
def enter_tree_node( treeNode )
|
11
|
+
not_implemented
|
12
|
+
end
|
13
|
+
|
14
|
+
def exit_tree_node( treeNode )
|
15
|
+
not_implemented
|
16
|
+
end
|
17
|
+
|
18
|
+
def visit_leaf_node( leafNode )
|
19
|
+
not_implemented
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'treevisitor/tree_node_visitor.rb'
|
2
2
|
|
3
3
|
#
|
4
|
-
#
|
5
|
-
# per chimare un blocco su tutti i TreeNode
|
4
|
+
# It call a block when visit a tree_node or leaf_node
|
6
5
|
#
|
7
6
|
class BlockTreeNodeVisitor < TreeNodeVisitor
|
8
7
|
|
@@ -10,14 +9,14 @@ class BlockTreeNodeVisitor < TreeNodeVisitor
|
|
10
9
|
@block = action
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
12
|
+
def enter_tree_node( treeNode )
|
14
13
|
@block.call( treeNode )
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
16
|
+
def exit_tree_node( treeNode )
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
19
|
+
def visit_leaf_node( leafNode )
|
21
20
|
@block.call( leafNode )
|
22
21
|
end
|
23
22
|
|