metamodel: rename 'universal' to 'enum'
[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 end
47 $ end template
48
49 $ template make_prods()
50 $ set baseprod = {//prod/@ename}
51 $ foreach {//alt}
52 redef class @ename
53     private init empty_init do end
54
55 $ if {count(elem)!=0}
56     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")} (
57 $ foreach {elem}
58 $   if {@is_list}
59             n_@{name}: Collection[Object][-sep ','-] # Should be Collection[@etype]
60 $   else
61             n_@{name}: nullable @etype[-sep ','-]
62 $   end
63 $ end
64     )
65 $ else
66     init init_${translate(@ename,"ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz")}
67 $ end
68     do
69         empty_init
70 $ foreach {elem}
71 $   if @is_list
72         for n in n_@{name} do
73                 assert n isa @{etype}
74                 _n_@{name}.add(n)
75                 n.parent = self
76         end
77 $   else
78 $   if {@modifier}
79         _n_@name = n_@{name}
80         if n_@{name} != null then
81                 n_@{name}.parent = self
82         end
83 $   else
84         _n_@name = n_@{name}.as(not null)
85         n_@{name}.parent = self
86 $   end
87 $   end
88 $ end
89     end
90
91     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
92     do
93 $ foreach {elem}
94 $   if @is_list
95         for i in [0.._n_@{name}.length[ do
96             if _n_@{name}[i] == old_child then
97                 if new_child != null then
98                     assert new_child isa @etype
99                     _n_@{name}[i] = new_child
100                     new_child.parent = self
101                 else
102                     _n_@{name}.remove_at(i)
103                 end
104                 return
105             end
106         end
107 $   else
108         if _n_@{name} == old_child then
109             if new_child != null then
110                 new_child.parent = self
111                 assert new_child isa @etype
112                 _n_@{name} = new_child
113             else
114 $   if @modifier
115                 _n_@{name} = null
116 $   else
117                 abort
118 $   end
119             end
120             return
121         end
122 $   end
123 $ end foreach
124     end
125
126     redef fun visit_all(v: Visitor)
127     do
128 $   foreach {elem}
129 $     if @is_list
130             for n in _n_@{name} do
131                 v.enter_visit(n)
132             end
133 $     else
134 $       if @modifier
135         if _n_@{name} != null then
136             v.enter_visit(_n_@{name}.as(not null))
137         end
138 $       else
139         v.enter_visit(_n_@{name})
140 $       end
141 $     end
142 $   end foreach
143     end
144 end
145 $ end foreach
146
147 redef class Start
148     init(
149         n_base: nullable $baseprod,
150         n_eof: EOF)
151     do
152         _n_base = n_base
153         _n_eof = n_eof
154     end
155
156     redef fun replace_child(old_child: PNode, new_child: nullable PNode)
157     do
158         if _n_base == old_child then
159             if new_child == null then
160             else
161                 new_child.parent = self
162                 assert new_child isa $baseprod
163                 _n_base = new_child
164             end
165             old_child.parent = null
166             return
167         end
168     end
169
170     redef fun visit_all(v: Visitor)
171     do
172         if _n_base != null then
173             v.enter_visit(_n_base.as(not null))
174         end
175         v.enter_visit(_n_eof)
176     end
177 end
178 $ end template