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 # Get the list of mclasses refined in 'self'.
25 fun redef_mclasses
: Set[MClass] do
26 var mclasses
= new HashSet[MClass]
27 for c
in mclassdefs
do
28 if not c
.is_intro
then mclasses
.add
(c
.mclass
)
33 # Get the list of all mclasses imported by 'self'.
34 fun imported_mclasses
: Set[MClass] do
35 var mclasses
= new HashSet[MClass]
36 for m
in in_importation
.greaters
do
37 if m
== self then continue
38 for c
in m
.mclassdefs
do mclasses
.add
(c
.mclass
)
43 # Get all mclasses in 'self' with their state
44 fun mclasses
: HashMap[MClass, Int] do
45 var mclasses
= new HashMap[MClass, Int]
46 for c
in intro_mclasses
do mclasses
[c
] = c_is_intro
47 for r
in redef_mclasses
do mclasses
[r
] = c_is_refined
48 for i
in imported_mclasses
do mclasses
[i
] = c_is_imported
55 # Get direct parents of 'self'.
56 fun parents
: Set[MClass] do
57 var ret
= new HashSet[MClass]
58 for mclassdef
in mclassdefs
do
59 for mclasstype
in mclassdef
.supertypes
do
60 ret
.add
(mclasstype
.mclass
)
66 # Get all ancestors of 'self'.
67 fun ancestors
: Set[MClass] do
68 var lst
= new HashSet[MClass]
69 for mclassdef
in self.mclassdefs
do
70 for super_mclassdef
in mclassdef
.in_hierarchy
.greaters
do
71 if super_mclassdef
== mclassdef
then continue # skip self
72 lst
.add
(super_mclassdef
.mclass
)
78 # Get direct children of 'self'.
79 fun children
: Set[MClass] do
80 var lst
= new HashSet[MClass]
81 for mclassdef
in self.mclassdefs
do
82 for sub_mclassdef
in mclassdef
.in_hierarchy
.direct_smallers
do
83 if sub_mclassdef
== mclassdef
then continue # skip self
84 lst
.add
(sub_mclassdef
.mclass
)
90 # Get all children of 'self'.
91 fun descendants
: Set[MClass] do
92 var lst
= new HashSet[MClass]
93 for mclassdef
in self.mclassdefs
do
94 for sub_mclassdef
in mclassdef
.in_hierarchy
.smallers
do
95 if sub_mclassdef
== mclassdef
then continue # skip self
96 lst
.add
(sub_mclassdef
.mclass
)
102 # Get the list of constructors available for 'self'.
103 fun constructors
: Set[MMethod] do
104 var res
= new HashSet[MMethod]
105 for mclassdef
in mclassdefs
do
106 for mpropdef
in mclassdef
.mpropdefs
do
107 if mpropdef
isa MMethodDef then
108 if mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
115 # Get the list of methods introduced in 'self'.
116 fun intro_methods
: Set[MMethod] do
117 var res
= new HashSet[MMethod]
118 for mclassdef
in mclassdefs
do
119 for mpropdef
in mclassdef
.mpropdefs
do
120 if mpropdef
isa MMethodDef then
121 if mpropdef
.is_intro
and not mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
128 # Get the list of locally refined methods in 'self'.
129 fun redef_methods
: Set[MMethod] do
130 var res
= new HashSet[MMethod]
131 for mclassdef
in mclassdefs
do
132 for mpropdef
in mclassdef
.mpropdefs
do
133 if mpropdef
isa MMethodDef then
134 if not mpropdef
.is_intro
and not mpropdef
.mproperty
.is_init
then res
.add
(mpropdef
.mproperty
)
141 # Get the list of methods inherited by 'self'.
142 fun inherited_methods
: Set[MMethod] do
143 var res
= new HashSet[MMethod]
144 for s
in ancestors
do
145 for m
in s
.intro_methods
do
146 if not self.intro_methods
.has
(m
) and not self.redef_methods
.has
(m
) then res
.add
(m
)
152 # Get the list of all virtual types available in 'self'.
153 fun virtual_types
: Set[MVirtualTypeProp] do
154 var res
= new HashSet[MVirtualTypeProp]
155 for mclassdef
in mclassdefs
do
156 for mpropdef
in mclassdef
.mpropdefs
do
157 if mpropdef
isa MVirtualTypeDef then
158 res
.add
(mpropdef
.mproperty
)
162 for ancestor
in ancestors
do
163 for mclassdef
in ancestor
.mclassdefs
do
164 for mpropdef
in mclassdef
.mpropdefs
do
165 if mpropdef
isa MVirtualTypeDef then
166 res
.add
(mpropdef
.mproperty
)
174 # Get the list of all parameter types in 'self'.
175 fun parameter_types
: Map[String, MType] do
176 var res
= new HashMap[String, MType]
177 for i
in [0..intro
.parameter_names
.length
[ do
178 res
[intro
.parameter_names
[i
]] = intro
.bound_mtype
.arguments
[i
]
183 fun mmodules
: Set[MModule] do
184 var mdls
= new HashSet[MModule]
185 for mclassdef
in mclassdefs
do mdls
.add
(mclassdef
.mmodule
)
189 # Get the list of MModule concern in 'self'
190 fun concerns
: HashMap[MModule, nullable List[MModule]] do
191 var hm
= new HashMap[MModule, nullable List[MModule]]
192 for mmodule
in mmodules
do
193 var owner
= mmodule
.public_owner
194 if owner
== null then
197 if hm
.has_key
(owner
) then
198 hm
[owner
].add
(mmodule
)
200 hm
[owner
] = new List[MModule]
201 hm
[owner
].add
(mmodule
)
208 fun is_class
: Bool do
209 return self.kind
== concrete_kind
or self.kind
== abstract_kind
212 fun is_interface
: Bool do
213 return self.kind
== interface_kind
217 return self.kind
== enum_kind
220 fun is_abstract
: Bool do
221 return self.kind
== abstract_kind
226 fun c_is_intro
: Int do return 1
227 fun c_is_refined
: Int do return 2
228 fun c_is_imported
: Int do return 3