parser: add setters for non-list attributes
[nit.git] / src / parser / xss / prods.xss
1 $ // This file is part of NIT ( http://www.nitlanguage.org ).
2 $ //
3 $ // Copyright 2008 Jean Privat <jean@pryen.org>
4 $ // Based on algorithms developped for ( http://www.sablecc.org/ ).
5 $ //
6 $ // Licensed under the Apache License, Version 2.0 (the "License");
7 $ // you may not use this file except in compliance with the License.
8 $ // You may obtain a copy of the License at
9 $ //
10 $ //     http://www.apache.org/licenses/LICENSE-2.0
11 $ //
12 $ // Unless required by applicable law or agreed to in writing, software
13 $ // distributed under the License is distributed on an "AS IS" BASIS,
14 $ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 $ // See the License for the specific language governing permissions and
16 $ // limitations under the License.
17
18 $ template make_abs_prods()
19 $ set baseprod = {//prod/@ename}
20
21 $ foreach {//prod}
22 class @ename super Prod end
23 $ end
24
25 $ foreach {//alt}
26 class @ename
27         super ${../@ename}
28 $ foreach {elem}
29 $   if @is_list
30     readable var _n_@name: List[@etype] = new List[@etype]
31 $   else
32 $   if @modifier
33     readable var _n_@name: nullable @etype = null
34 $   else
35     readable var _n_@name: @etype
36 $   end
37 $   end
38 $ end
39 end
40 $ end
41
42 class Start
43         super Prod
44     readable var _n_base: nullable $baseprod
45     readable var _n_eof: EOF
46     init(
47         n_base: nullable $baseprod,
48         n_eof: EOF)
49     do
50         _n_base = n_base
51         _n_eof = n_eof
52     end
53
54 end
55 $ end template
56
57 $ template make_prods()
58 $ set baseprod = {//prod/@ename}
59 $ foreach {//alt}
60 redef class @ename
61     private init empty_init do end
62
63 $ if {count(elem)!=0}
64     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
65 $ foreach {elem}
66 $   if {@is_list}
67             n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
68 $   else
69             n_@{name}: nullable @etype[-sep ','-]
70 $   end
71 $ end
72     )
73 $ else
74     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
75 $ end
76     do
77         empty_init
78 $ foreach {elem}
79 $   if @is_list
80         for n in n_@{name} do
81                 assert n isa @{etype}
82                 _n_@{name}.add(n)
83                 n.parent = self
84         end
85 $   else
86 $   if {@modifier}
87         _n_@name = n_@{name}
88         if n_@{name} != null then
89                 n_@{name}.parent = self
90         end
91 $   else
92         _n_@name = n_@{name}.as(not null)
93         n_@{name}.parent = self
94 $   end
95 $   end
96 $ end
97     end
98
99     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
100     do
101 $ foreach {elem}
102 $   if @is_list
103         for i in [0.._n_@{name}.length[ do
104             if _n_@{name}[i] == old_child then
105                 if new_child != null then
106                     assert new_child isa @etype
107                     _n_@{name}[i] = new_child
108                     new_child.parent = self
109                 else
110                     _n_@{name}.remove_at(i)
111                 end
112                 return
113             end
114         end
115 $   else
116         if _n_@{name} == old_child then
117             if new_child != null then
118                 new_child.parent = self
119                 assert new_child isa @etype
120                 _n_@{name} = new_child
121             else
122 $   if @modifier
123                 _n_@{name} = null
124 $   else
125                 abort
126 $   end
127             end
128             return
129         end
130 $   end
131 $ end foreach
132     end
133
134 $   foreach {elem}
135 $     if @is_list
136 $     else
137                 redef fun n_@{name}=(node)
138                 do
139                         _n_@{name} = node
140 $       if @modifier
141                         if node != null then
142                                 node.parent = self
143                         end
144 $       else
145                         node.parent = self
146 $       end
147                 end
148 $     end
149 $   end foreach
150
151
152     redef fun visit_all(v: Visitor)
153     do
154 $   foreach {elem}
155 $     if @is_list
156             for n in _n_@{name} do
157                 v.enter_visit(n)
158             end
159 $     else
160 $       if @modifier
161         if _n_@{name} != null then
162             v.enter_visit(_n_@{name}.as(not null))
163         end
164 $       else
165         v.enter_visit(_n_@{name})
166 $       end
167 $     end
168 $   end foreach
169     end
170 end
171 $ end foreach
172
173 redef class Start
174     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
175     do
176         if _n_base == old_child then
177             if new_child == null then
178             else
179                 new_child.parent = self
180                 assert new_child isa $baseprod
181                 _n_base = new_child
182             end
183             old_child.parent = null
184             return
185         end
186     end
187
188     redef fun visit_all(v: Visitor)
189     do
190         if _n_base != null then
191             v.enter_visit(_n_base.as(not null))
192         end
193         v.enter_visit(_n_eof)
194     end
195 end
196 $ end template