1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Jean Privat <jean@pryen.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Model exploration and traversing facilities
24 # The list of intro mclassdef in the module.
25 # with visibility >= to min_visibility
26 fun intro_mclassdefs
(min_visibility
: MVisibility): Set[MClassDef] do
27 var res
= new HashSet[MClassDef]
28 for mclassdef
in mclassdefs
do
29 if not mclassdef
.is_intro
then continue
30 if mclassdef
.mclass
.visibility
< min_visibility
then continue
36 # The list of redef mclassdef in the module.
37 # with visibility >= to min_visibility
38 fun redef_mclassdefs
(min_visibility
: MVisibility): Set[MClassDef] do
39 var res
= new HashSet[MClassDef]
40 for mclassdef
in mclassdefs
do
41 if mclassdef
.is_intro
then continue
42 if mclassdef
.mclass
.visibility
< min_visibility
then continue
48 # Get the list of mclasses refined in 'self'.
49 fun redef_mclasses
: Set[MClass] do
50 var mclasses
= new HashSet[MClass]
51 for c
in mclassdefs
do
52 if not c
.is_intro
then mclasses
.add
(c
.mclass
)
57 # Get the list of all mclasses imported by 'self'.
58 fun imported_mclasses
: Set[MClass] do
59 var mclasses
= new HashSet[MClass]
60 for m
in in_importation
.greaters
do
61 if m
== self then continue
62 for c
in m
.mclassdefs
do mclasses
.add
(c
.mclass
)
70 # Get the public owner of 'self'.
71 fun public_owner
: MModule do
72 var public_owner
= self.intro_mmodule
.public_owner
73 if public_owner
== null then
74 return self.intro_mmodule
80 # Get direct parents of 'self'.
81 fun parents
: Set[MClass] do
82 var ret
= new HashSet[MClass]
83 for mclassdef
in mclassdefs
do
84 for mclasstype
in mclassdef
.supertypes
do
85 ret
.add
(mclasstype
.mclass
)
91 # Get all ancestors of 'self'.
92 fun ancestors
: Set[MClass] do
93 var lst
= new HashSet[MClass]
94 for mclassdef
in self.mclassdefs
do
95 for super_mclassdef
in mclassdef
.in_hierarchy
.greaters
do
96 if super_mclassdef
== mclassdef
then continue # skip self
97 lst
.add
(super_mclassdef
.mclass
)
103 # Get direct children of 'self'.
104 fun children
: Set[MClass] do
105 var lst
= new HashSet[MClass]
106 for mclassdef
in self.mclassdefs
do
107 for sub_mclassdef
in mclassdef
.in_hierarchy
.direct_smallers
do
108 if sub_mclassdef
== mclassdef
then continue # skip self
109 lst
.add
(sub_mclassdef
.mclass
)
115 # Get all children of 'self'.
116 fun descendants
: Set[MClass] do
117 var lst
= new HashSet[MClass]
118 for mclassdef
in self.mclassdefs
do
119 for sub_mclassdef
in mclassdef
.in_hierarchy
.smallers
do
120 if sub_mclassdef
== mclassdef
then continue # skip self
121 lst
.add
(sub_mclassdef
.mclass
)
127 # Get the list of constructors available for 'self'.
128 fun constructors
: Set[MMethod] do
129 var res
= new HashSet[MMethod]
130 for mclassdef
in mclassdefs
do
131 for mpropdef
in mclassdef
.mpropdefs
do
132 if mpropdef
isa MMethodDef then
133 if mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
140 # Get the list of methods introduced in 'self'.
141 fun intro_methods
: Set[MMethod] do
142 var res
= new HashSet[MMethod]
143 for mclassdef
in mclassdefs
do
144 for mpropdef
in mclassdef
.mpropdefs
do
145 if mpropdef
isa MMethodDef then
146 if mpropdef
.is_intro
and not mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
153 # the set of properties introduced in 'self'.
154 fun intro_mproperties
(min_visibility
: MVisibility): Set[MProperty] do
155 var set
= new HashSet[MProperty]
156 for mclassdef
in mclassdefs
do
157 for mprop
in mclassdef
.intro_mproperties
do
158 if mprop
.visibility
< min_visibility
then continue
165 # the set of locally refined properties in 'self'.
166 fun redef_mproperties
(min_visibility
: MVisibility): Set[MProperty] do
167 var set
= new HashSet[MProperty]
168 for mclassdef
in mclassdefs
do
169 for mpropdef
in mclassdef
.mpropdefs
do
170 if mpropdef
.mproperty
.visibility
< min_visibility
then continue
171 if mpropdef
.mproperty
.intro_mclassdef
.mclass
!= self then set
.add
(mpropdef
.mproperty
)
177 # the set of methods inherited by 'self'.
178 fun inherited_mproperties
(mainmodule
: MModule, min_visibility
: MVisibility): Set[MProperty] do
179 var set
= new HashSet[MProperty]
180 for parent
in in_hierarchy
(mainmodule
).direct_greaters
do
181 set
.add_all
(parent
.intro_mproperties
(min_visibility
))
182 set
.add_all
(parent
.inherited_mproperties
(mainmodule
, min_visibility
))
187 # the set of introduced and redefined mproperties
188 fun local_mproperties
(min_visibility
: MVisibility): Set[MProperty] do
189 var set
= new HashSet[MProperty]
190 set
.add_all
(intro_mproperties
(min_visibility
))
191 set
.add_all
(redef_mproperties
(min_visibility
))
195 # the set of all accessible mproperties for this class
196 fun all_mproperties
(mainmodule
: MModule, min_visibility
: MVisibility): Set[MProperty] do
197 var set
= new HashSet[MProperty]
198 set
.add_all
(local_mproperties
(min_visibility
))
199 set
.add_all
(inherited_mproperties
(mainmodule
, min_visibility
))
203 # the set of all accessible mattributes for this class
204 fun all_mattributes
(mainmodule
: MModule, min_visibility
: MVisibility): Set[MAttribute] do
205 var set
= new HashSet[MAttribute]
206 for mprop
in all_mproperties
(mainmodule
, min_visibility
) do
207 if mprop
isa MAttribute then set
.add
(mprop
)
212 # Get the list of locally refined methods in 'self'.
213 fun redef_methods
: Set[MMethod] do
214 var res
= new HashSet[MMethod]
215 for mclassdef
in mclassdefs
do
216 for mpropdef
in mclassdef
.mpropdefs
do
217 if mpropdef
isa MMethodDef then
218 if not mpropdef
.is_intro
and not mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
225 fun inherited_methods
: Set[MMethod] do
226 var res
= new HashSet[MMethod]
227 for s
in ancestors
do
228 for m
in s
.intro_methods
do
229 if not self.intro_methods
.has
(m
) and not self.redef_methods
.has
(m
) then res
.add
(m
)
235 # Get the list of all virtual types available in 'self'.
236 fun virtual_types
: Set[MVirtualTypeProp] do
237 var res
= new HashSet[MVirtualTypeProp]
238 for mclassdef
in mclassdefs
do
239 for mpropdef
in mclassdef
.mpropdefs
do
240 if mpropdef
isa MVirtualTypeDef then
241 res
.add
(mpropdef
.mproperty
)
245 for ancestor
in ancestors
do
246 for mclassdef
in ancestor
.mclassdefs
do
247 for mpropdef
in mclassdef
.mpropdefs
do
248 if mpropdef
isa MVirtualTypeDef then
249 res
.add
(mpropdef
.mproperty
)
257 # Get the list of all parameter types in 'self'.
258 fun parameter_types
: Map[String, MType] do
259 var res
= new HashMap[String, MType]
260 for i
in [0..intro
.parameter_names
.length
[ do
261 res
[intro
.parameter_names
[i
]] = intro
.bound_mtype
.arguments
[i
]
266 fun is_class
: Bool do
267 return self.kind
== concrete_kind
or self.kind
== abstract_kind
270 fun is_interface
: Bool do
271 return self.kind
== interface_kind
275 return self.kind
== enum_kind
278 fun is_abstract
: Bool do
279 return self.kind
== abstract_kind
283 redef class MAttribute
284 # Is this attribute nullable for sure?
286 # This mean that its introduction is declarred with a nullable static type
287 # since attributes are invariant this will work on most cases
288 # attributes with static type anchored with a virtual type are not "nullable for-sure"
289 # because this type can be redefined in subclasses
290 fun is_nullable
: Bool do return intro
.static_mtype
isa MNullableType
293 redef class MClassDef
294 # modifiers are keywords like redef, private etc.
295 fun modifiers
: Array[String] do
296 var res
= new Array[String]
300 res
.add mclass
.visibility
.to_s
302 res
.add mclass
.kind
.to_s
308 # modifiers are keywords like redef, private etc.
309 fun modifiers
: Array[String] do
310 var res
= new Array[String]
314 res
.add mproperty
.visibility
.to_s
317 if mprop
isa MVirtualTypeDef then
319 else if mprop
isa MMethodDef then
320 if mprop
.is_abstract
then
322 else if mprop
.is_intern
then
325 if mprop
.mproperty
.is_init
then
338 # Sort mmodules by their name
339 class MModuleNameSorter
340 super AbstractSorter[MModule]
341 redef fun compare
(a
, b
) do return a
.name
<=> b
.name
345 # Sort mclasses by their name
346 class MClassNameSorter
347 super AbstractSorter[MClass]
348 redef fun compare
(a
, b
) do return a
.name
<=> b
.name
352 # Sort mclassdefs by their name
353 class MClassDefNameSorter
354 super AbstractSorter[MClassDef]
355 redef fun compare
(a
, b
) do return a
.mclass
.name
<=> b
.mclass
.name
359 # Sort mproperties by their name
360 class MPropertyNameSorter
361 super AbstractSorter[MProperty]
362 redef fun compare
(a
, b
) do return a
.name
<=> b
.name
366 # Sort mpropdefs by their name
367 class MPropDefNameSorter
368 super AbstractSorter[MPropDef]
369 redef fun compare
(a
, b
) do return a
.mproperty
.name
<=> b
.mproperty
.name