@@ -10,31 +10,20 @@ def initialize(ast_node)
1010 @ast_node = ast_node
1111 end
1212
13+ def self . new ( ast_node )
14+ ensure_ast_node! ( ast_node )
15+
16+ super ( ast_node )
17+ end
18+
1319 def extend_ast ( node_attr_name , new_node , stmt_type )
14- return if ast_node . nil?
15- if ast_node . attr_name_equal? ( node_attr_name )
16- create_node (
17- :statement ,
18- [
19- stmt_type ,
20- new_node ,
21- ast_node
22- ]
23- )
24- else
25- recreate_node ( node_attr_name , new_node , stmt_type )
26- end
20+ TreeTraverser . new ( ast_node ) . extend_ast ( node_attr_name , new_node , stmt_type )
2721 end
2822
29- def recreate_node ( node_attr_name , new_node , stmt_type )
30- create_node (
31- ast_node . type ,
32- [
33- ast_node . value ,
34- self . class . new ( ast_node . left ) . extend_ast ( node_attr_name , new_node , stmt_type ) ,
35- self . class . new ( ast_node . right ) . extend_ast ( node_attr_name , new_node , stmt_type )
36- ]
37- )
23+ def prepend_ast ( new_node , stmt_type )
24+ ensure_ast_root!
25+
26+ TreeTraverser . new ( ast_node ) . prepend_ast ( new_node , stmt_type )
3827 end
3928
4029 def to_ast
@@ -45,9 +34,72 @@ def to_s
4534 ast_node . to_s
4635 end
4736
37+ # @apir private
38+ def ensure_ast_root!
39+ raise 'Not a tree root!' if ast_node . type != :root
40+ end
41+
4842 # @api private
49- def create_node ( *args )
50- Filterly ::Node . new ( *args )
43+ def self . ensure_ast_node! ( ast_node )
44+ raise 'Not a Filterfly:Node!' if ast_node . nil? || !ast_node . is_a? ( Filterly ::Node )
45+ end
46+
47+ class TreeTraverser
48+ attr_reader :ast_node
49+
50+ def initialize ( ast_node )
51+ @ast_node = ast_node
52+ end
53+
54+ def extend_ast ( node_attr_name , new_node , stmt_type )
55+ return if ast_node . nil?
56+ if ast_node . attr_name_equal? ( node_attr_name )
57+ create_node (
58+ :statement ,
59+ [
60+ stmt_type ,
61+ new_node ,
62+ ast_node
63+ ]
64+ )
65+ else
66+ recreate_node ( node_attr_name , new_node , stmt_type )
67+ end
68+ end
69+
70+ def recreate_node ( node_attr_name , new_node , stmt_type )
71+ create_node (
72+ ast_node . type ,
73+ [
74+ ast_node . value ,
75+ self . class
76+ . new ( ast_node . left )
77+ . extend_ast ( node_attr_name , new_node , stmt_type ) ,
78+ self . class
79+ . new ( ast_node . right )
80+ . extend_ast ( node_attr_name , new_node , stmt_type )
81+ ]
82+ )
83+ end
84+
85+ def prepend_ast ( new_node , stmt_type )
86+ create_node (
87+ ast_node . type ,
88+ [
89+ ast_node . value ,
90+ create_node (
91+ :statement ,
92+ [ stmt_type , new_node , ast_node . left ]
93+ ) ,
94+ nil
95+ ]
96+ )
97+ end
98+
99+ # @api private
100+ def create_node ( *args )
101+ Filterly ::Node . new ( *args )
102+ end
51103 end
52104 end
53105end
0 commit comments