meth import_local_classes
do
for g in _global_classes do
- if self[g] != null then continue
+ if _local_class_by_global.has_key(g) then continue
var impl = new MMImplicitLocalClass(self, g)
end
end
end
end
+ attr _are_global_properties_inherited: Bool = false
+
# Inherit global properties for a class
meth inherit_global_properties
do
- if _global_properties != null then return
-
- _global_properties = new HashSet[MMGlobalProperty]
- _properties_by_name = new HashMap[Symbol, Array[MMGlobalProperty]]
- _local_property_by_global = new HashMap[MMGlobalProperty, MMLocalProperty]
+ if _are_global_properties_inherited then return
+ _are_global_properties_inherited = true
var names = _properties_by_name
var set = _global_properties
redef meth [](glob)
do
- var prop = super(glob)
- if prop == null and _global_properties.has(glob) then
- prop = inherit_local_property(glob)
+ if _local_property_by_global.has_key(glob) then
+ return _local_property_by_global[glob]
+ else if has_global_property(glob) then
+ return inherit_local_property(glob)
+ else
+ abort
end
- return prop
end
# Add default super class in direct parent and in super classes if this is not the Object class
do
assert _crhe != null
for ref in _crhe.direct_greaters do
- assert ref.cshe != null
for sup in ref.cshe.direct_greaters do
var cla = sup.for_module(_module)
- assert cla != null
supers.add(cla)
end
end
private meth compute_super_parents(supers: Array[MMLocalClass])
do
for p in supers do
- assert p != null
p.compute_super_classes
end
end
private meth inherit_local_property(glob: MMGlobalProperty): MMLocalProperty
do
assert not _local_property_by_global.has_key(glob)
- assert glob != null
var impl: MMLocalProperty
# First compute the set of bottom properties
var impls = new ArraySet[MMLocalProperty]
for sc in supers do
- var p = sc[glob]
- if p != null then impls.add(p)
+ if sc.has_global_property(glob) then impls.add(sc[glob])
end
# Second, extract most specific
var impls2 = ghier.select_smallests(impls)
set_global(g)
var impls = new Array[MMLocalProperty]
for sc in local_class.che.direct_greaters do
- var p = sc[g]
- if p == null then continue
- impls.add(p)
+ if not sc.has_global_property(g) then continue
+ impls.add(sc[g])
end
g.add_local_property(self, impls)
end
# Add this ancestor and it's super one in tab
private meth add_in(tab: Array[MMAncestor])
do
- assert ancestor: stype != null
- assert local_class: stype.local_class != null
tab.add(self)
stype.local_class.compute_ancestors
- for anc in stype.local_class.ancestors do
+ for anc in stype.local_class.ancestors.as(not null) do
var aaa = anc.stype.for_module(stype.module)
var a = aaa.adapt_to(stype).for_module(inheriter.module)
if a.local_class != inheriter.local_class then
init(mod: MMModule, g: MMGlobalClass)
do
var cla = g.intro
- super(cla.name, cla.arity)
- mod.add_local_class(self)
+ super(mod, cla.name, cla.arity)
set_global(g)
end
end
init(b: MMLocalClass, anc: MMType)
do
- assert b != null
- assert b.module != null
- assert anc != null
inheriter = b.get_type
stype = anc
end