Add default values for some primitive type attributes.
[nit.git] / src / metamodel / inheritance.nit
index 31d7ce8..dd6a9ba 100644 (file)
@@ -59,7 +59,7 @@ redef class MMLocalClass
 
        # Is the class computing super.
        # Used to detect specialization loops.
-       attr _computing_super: Bool 
+       attr _computing_super: Bool = false 
 
        # Compute super classes of a class
        meth compute_super_classes
@@ -130,19 +130,26 @@ redef class MMLocalClass
                                        continue
                                end
 
-                               var gname = glob.intro.name
-                               var conf_set: Array[MMGlobalProperty]
-                               if names.has_key(gname) then
-                                       conf_set = names[gname]
-                               else
-                                       conf_set = new Array[MMGlobalProperty]
-                                       names[gname] = conf_set
-                               end
-                               conf_set.add(glob)
+                               make_visible_an_inherited_global_property(glob)
                        end
                end
        end
 
+       # Make the name of a global property meaningful in the class
+       meth make_visible_an_inherited_global_property(glob: MMGlobalProperty)
+       do
+               var names = _properties_by_name
+               var gname = glob.intro.name
+               var conf_set: Array[MMGlobalProperty]
+               if names.has_key(gname) then
+                       conf_set = names[gname]
+               else
+                       conf_set = new Array[MMGlobalProperty]
+                       names[gname] = conf_set
+               end
+               conf_set.add(glob)
+       end
+
        # Add super stype of this current local class
        meth add_direct_parent(p: MMAncestor)
        do
@@ -316,61 +323,50 @@ redef class MMLocalClass
                assert not _local_property_by_global.has_key(glob)
                assert glob != null
 
-               var impls = glob.get_compatible_concrete_properties_for(self)
-               if impls.length != 1 then
-                       stderr.write("Fatal error: inherit_local_property error\n")
-                       print("------- {module}::{self} {glob.intro.full_name}")
-                       for i in impls do
-                               print("   {i.full_name}")
-                       end
-                       print("------- {glob.concrete_property_hierarchy.first}")
-                       print("------- {glob.concrete_property_hierarchy.to_dot}")
-                       exit(1)
-               end
-               var impl = impls.first
-               var ac = ancestor_for(impl.local_class)
-               ac.local_class.inherit_global_properties
-               var a = ac.stype
-               
-               assert a.local_class != self
-               var sup = a.select_property(glob) # Select super prop
-               assert sup != null
-               var prop = sup.inherit_to(get_type) # special the new prop
-               return prop
-       end
-end
-
-redef class MMConcreteProperty
-       # FIXME: use this
-       meth is_deferred: Bool do return false
-end
+               var impl: MMLocalProperty
 
-redef class MMGlobalProperty
-       # Get the most specific local properties defined in superclasses of c
-       private meth get_compatible_concrete_properties_for(cla: MMLocalClass): Array[MMConcreteProperty]
-       do
-               var impl_hier = _concrete_property_hierarchy
-               if impl_hier.length == 1 then return [intro]
-               var impls = new ArraySet[MMConcreteProperty]
-               var clache = cla.che
-               if true then
-                       #print "{cla.module}::{cla} get glob {intro.local_class}::{intro.name}"
-               for sc in cla.che.direct_greaters do
-                       #print "   try {sc.module}::{sc} {sc.che != null} {sc.crhe != null} {sc.che != null}"
-                       var p = sc[self]
-                       if p == null then continue
-                       var impl = p.concrete_property
-                       impls.add(impl)
-               end
+               var ghier = glob.property_hierarchy
+               var supers = che.direct_greaters
+               if ghier.length == 1 then
+                       # Unredefined property
+                       impl = glob.intro
+               else if supers.length == 1 then
+                       # Single inheritance
+                       impl = supers.first[glob]
                else
-               for impl in impl_hier do
-                       var bc = impl.local_class
-                       if clache < bc then
-                               impls.add(impl)
+                       # Hard multiple inheritance
+                       # 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)
                        end
+                       # Second, extract most specific
+                       var impls2 = ghier.select_smallests(impls)
+                       # Conflict case (FIXME)
+                       if impls2.length != 1 then
+                               stderr.write("Fatal error: inherit_local_property error\n")
+                               print("------- {module}::{self} {glob.intro.full_name}")
+                               for i in impls2 do
+                                       print("   {i.full_name}")
+                               end
+                               print("------- {glob.property_hierarchy.first}")
+                               print("------- {glob.property_hierarchy.to_dot}")
+                               exit(1)
+                       end
+                       impl = impls2.first
                end
-               end
-               return impl_hier.select_smallests(impls)
+
+               # FIXME: Why these 3 lines ?
+               #var ac = ancestor_for(impl.local_class)
+               #ac.local_class.inherit_global_properties
+               #var a = ac.stype
+               #assert a.local_class != self
+
+               # Register the local property
+               _local_property_by_global[glob] = impl
+               
+               return impl
        end
 end
 
@@ -379,59 +375,14 @@ redef class MMLocalProperty
        meth inherit_global(g: MMGlobalProperty)
        do
                set_global(g)
-               # What the next line used for?
-               g.add_concrete_property(concrete_property, g.get_compatible_concrete_properties_for(local_class))
-       end
-
-       # Create an adaptation of self to a different receiver
-       meth inherit_to(t: MMType): MMLocalProperty is abstract
-
-       # ?
-       protected meth inherit_from(s: MMLocalProperty, t: MMType) # for the super bugs
-       do
-               assert _super_prop == null
-               _super_prop = s
-               if _global == null then
-                       set_global(s.global)
+               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)
                end
+               g.add_local_property(self, impls)
        end
-
-end
-
-redef class MMMethod
-       redef meth inherit_to(t) do
-               return new MMImplicitMethod(self, t)
-       end
-end
-
-# A local property that is an adatation of an exiting one
-class MMImplicitProperty
-special MMLocalProperty
-       # Create a property from an existing property and a new receiver
-       init(prop: MMLocalProperty, bt: MMType)
-       do
-               super(prop.name, bt.local_class, prop.concrete_property)
-               inherit_from(prop, bt)
-       end
-end
-
-class MMImplicitMethod
-special MMMethod
-special MMImplicitProperty
-       init(p, t) do super
-end
-
-redef class MMAttribute
-       redef meth inherit_to(t)
-       do
-               return new MMImplicitAttribute(self,t)
-       end
-end
-
-class MMImplicitAttribute
-special MMAttribute
-special MMImplicitProperty
-       init(p, t) do super
 end
 
 redef class MMAncestor