f29892eb685310d6f7b9eed859a6dae259bd833d
1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
25 # The node used to represent the `MProperty` node.
27 # Only defined if `self` is at the root of a reimplementation graph, and
28 # only once `put_in_graph` is called.
29 var introducer
: nullable MemberIntroducer = null
31 # Members that this member redefines/reimplements.
32 var reimplemented
: SimpleCollection[String] = new Array[String]
36 self.labels
.add
("MPropDef")
39 # Set the static type.
40 fun static_type
=(static_type
: nullable TypeEntity) is abstract
42 # Get the static type.
43 fun static_type
: nullable TypeEntity is abstract
45 # Append the specified parameter to the signature.
46 fun add_parameter
(parameter
: MemberParameter) do end
48 # Append a member that is reimplemeneted by `self`.
49 fun reimplement
(parent
: String) do
50 reimplemented
.add
(parent
)
53 # Does this member introduce the property?
55 return reimplemented
.length
<= 0
58 redef fun put_in_graph
do
60 self["is_intro"] = is_intro
62 var visibility
= self["visibility"]
63 var full_name
= self["full_name"]
64 var name
= self["name"]
66 introducer
= create_introducer
67 if full_name
isa String then
68 introducer
.full_name
= full_name
69 else if name
isa String then
70 introducer
.name
= name
72 if visibility
isa String then
73 introducer
.visibility
= visibility
75 introducer
.put_in_graph
79 redef fun put_edges
do
81 var intro
= resolve_introducer
84 graph
.add_edge
(self, "DEFINES", intro
)
88 fun visibility
=(visibility
: String) do
89 self["visibility"] = visibility
90 if introducer
!= null then
91 introducer
.as(not null).visibility
= visibility
95 redef fun name
=(name
: String) do
97 if introducer
!= null then
98 introducer
.as(not null).name
= name
102 redef fun full_name
=(full_name
: String) do
104 if introducer
!= null then
105 introducer
.as(not null).full_name
= full_name
109 redef fun parent_name
=(parent_name
: String) do
111 if introducer
!= null then
112 introducer
.as(not null).parent_name
= parent_name
116 # Is the member abstract?
117 fun is_abstract
=(is_abstract
: Bool) do
118 self["is_abstract"] = is_abstract
121 # Create an instance of `MemberIntroducer` that will be linked to `self`.
122 protected fun create_introducer
: MemberIntroducer is abstract
124 # Find the nearest reimplementation root.
126 # var g = new ProjectGraph("foo")
127 # var m1 = new Attribute(g)
128 # var m2 = new Attribute(g)
129 # var m3 = new Attribute(g)
133 # m2.reimplement("1")
135 # assert m1.resolve_introducer == m1.introducer
136 # assert m2.resolve_introducer == m1.introducer
139 # m3.reimplement("3")
141 # assert m3.resolve_introducer == null
142 fun resolve_introducer
: nullable MemberIntroducer do
143 if introducer
== null then
144 var member_queue
= new List[String]
145 var visited
= new HashSet[Member]
148 member_queue
.add_all
(reimplemented
)
149 while not member_queue
.is_empty
do
150 member
= graph
.by_id
[member_queue
.shift
].as(Member)
151 if visited
.has
(member
) then
153 else if member
.is_intro
then
154 return member
.introducer
157 member_queue
.add_all
(member
.reimplemented
)
167 # An unrecognized member.
169 # Used to simplify the handling of ignored entities.
173 redef fun put_in_graph
do end
174 redef fun put_edges
do end
180 # The method’s signature.
181 var signature
: Signature is noinit
, writable
185 self.labels
.add
("MMethodDef")
186 self["is_intern"] = false # TODO
187 self["is_extern"] = false # TODO
188 signature
= new Signature(graph
)
192 # Set the return type.
193 redef fun static_type
=(static_type
: nullable TypeEntity) do
194 signature
.return_type
= static_type
197 # Get the return type.
198 redef fun static_type
: nullable TypeEntity do return signature
.return_type
200 redef fun add_parameter
(parameter
: MemberParameter) do
201 signature
.parameters
.add
(parameter
)
204 redef fun create_introducer
: MemberIntroducer do
205 return new MethodIntroducer(graph
)
208 redef fun put_in_graph
do
210 signature
.put_in_graph
213 redef fun put_edges
do
215 graph
.add_edge
(self, "SIGNATURE", signature
)
223 redef var static_type
: nullable TypeEntity = null is writable
227 self.labels
.add
("MAttributeDef")
230 redef fun create_introducer
: MemberIntroducer do
231 return new AttributeIntroducer(graph
)
234 redef fun put_in_graph
do
236 if static_type
!= null then
237 static_type
.as(not null).put_in_graph
241 redef fun put_edges
do
243 if static_type
!= null then
244 graph
.add_edge
(self, "TYPE", static_type
.as(not null))
249 # The `MProperty` node of a root of a reimplementation graph.
250 abstract class MemberIntroducer
255 self.labels
.add
("MProperty")
256 self["visibility"] = "public"
259 fun visibility
=(visibility
: String) do
260 self["visibility"] = visibility
264 # A `MProperty` node for a method.
265 class MethodIntroducer
266 super MemberIntroducer
270 self.labels
.add
("MMethod")
271 self["is_init"] = false # TODO
275 # A `MProperty` node for an attribute.
276 class AttributeIntroducer
277 super MemberIntroducer
281 self.labels
.add
("MAttribute")
286 # Append the specified member.
287 fun declare_member
(member
: Member) do end