1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2006-2008 Floréal Morandat <morandat@lirmm.fr>
4 # Copyright 2008 Jean Privat <jean@pryen.org>
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
10 # http://www.apache.org/licenses/LICENSE-2.0
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.
18 # Virtual type (property of type type)
23 redef class MMGlobalProperty
24 # Is self a virtual type
25 meth is_virtual_type
: Bool do return intro
isa MMTypeProperty
28 # Virtual type properties
30 special MMLocalProperty
31 # The virtual static type associated
32 meth stype_for
(recv
: MMType): MMVirtualType
34 var prop
= recv
.select_property
(global
)
35 assert prop
isa MMTypeProperty
36 return prop
.real_stype_for
(recv
)
39 # Cached results of stype
40 attr _stypes_cache
: HashMap[MMType, MMVirtualType] = new HashMap[MMType, MMVirtualType]
42 private meth real_stype_for
(recv
: MMType): MMVirtualType
44 # If the signature is not build: Circular definition
45 if signature
== null then return null
47 if _stypes_cache
.has_key
(recv
) then return _stypes_cache
[recv
]
49 var res
= new MMVirtualType(self, recv
)
50 _stypes_cache
[recv
] = res
57 # Select a virtual type property by its name
58 meth select_virtual_type
(name
: Symbol): MMTypeProperty
60 assert local_class
!= null
62 var res
= select_property
(local_class
.virtual_type
(name
))
63 assert res
isa MMTypeProperty
70 # The property associed
71 readable attr _property
: MMTypeProperty
74 readable attr _recv
: MMType
76 protected init(p
: MMTypeProperty, recv
: MMType)
78 super(p
.name
, p
.signature_for
(recv
).return_type
)
83 redef meth
module do return _recv
.module
85 redef meth for_module
(mod
)
87 if mod
== module then return self
88 return adapt_to
(recv
.for_module
(mod
))
91 redef meth not_for_self
93 return bound
.not_for_self
96 redef meth adapt_to
(recv
)
98 return property
.stype_for
(recv
)
102 redef class MMLocalClass
103 meth virtual_type
(s
: Symbol): MMGlobalProperty
105 var prop
= get_property_by_name
(s
)
106 if prop
.is_virtual_type
then