X-Git-Url: http://nitlanguage.org?ds=sidebyside diff --git a/src/metamodel/virtualtype.nit b/src/metamodel/virtualtype.nit index 7205be8..fa2b2aa 100644 --- a/src/metamodel/virtualtype.nit +++ b/src/metamodel/virtualtype.nit @@ -22,24 +22,24 @@ import type_formal redef class MMGlobalProperty # Is self a virtual type - meth is_virtual_type: Bool do return intro isa MMTypeProperty + fun is_virtual_type: Bool do return intro isa MMTypeProperty end # Virtual type properties class MMTypeProperty special MMLocalProperty # The virtual static type associated - meth stype_for(recv: MMType): MMVirtualType + fun stype_for(recv: MMType): nullable MMVirtualType do - var prop = recv.select_property(global) + var prop = recv.local_class[global] assert prop isa MMTypeProperty return prop.real_stype_for(recv) end # Cached results of stype - attr _stypes_cache: HashMap[MMType, MMVirtualType] = new HashMap[MMType, MMVirtualType] + var _stypes_cache: HashMap[MMType, MMVirtualType] = new HashMap[MMType, MMVirtualType] - private meth real_stype_for(recv: MMType): MMVirtualType + private fun real_stype_for(recv: MMType): nullable MMVirtualType do # If the signature is not build: Circular definition if signature == null then return null @@ -53,25 +53,13 @@ special MMLocalProperty end end -redef class MMType - # Select a virtual type property by its name - meth select_virtual_type(name: Symbol): MMTypeProperty - do - assert local_class != null - assert name != null - var res = select_property(local_class.virtual_type(name)) - assert res isa MMTypeProperty - return res - end -end - class MMVirtualType special MMTypeFormal # The property associed - readable attr _property: MMTypeProperty + readable var _property: MMTypeProperty # The receiver type - readable attr _recv: MMType + readable var _recv: MMType protected init(p: MMTypeProperty, recv: MMType) do @@ -80,32 +68,41 @@ special MMTypeFormal _recv = recv end - redef meth module do return _recv.module + redef fun module do return _recv.module - redef meth for_module(mod) + redef fun for_module(mod) do if mod == module then return self return adapt_to(recv.for_module(mod)) end - redef meth not_for_self + redef fun not_for_self do return bound.not_for_self end - redef meth adapt_to(recv) + redef fun adapt_to(recv) do - return property.stype_for(recv) + return property.stype_for(recv).as(not null) end end redef class MMLocalClass - meth virtual_type(s: Symbol): MMGlobalProperty + fun virtual_type(s: Symbol): MMGlobalProperty do var prop = get_property_by_name(s) if prop.is_virtual_type then return prop end - return null + abort + end + + # Select a virtual type property by its name + fun select_virtual_type(name: Symbol): MMTypeProperty + do + var gp = virtual_type(name) + var res = self[gp] + assert res isa MMTypeProperty + return res end end