syntax: 'meth' -> 'fun', 'attr' -> 'var'
[nit.git] / src / metamodel / genericity.nit
index 15a0420..79efb24 100644 (file)
@@ -23,14 +23,14 @@ intrude import inheritance
 
 redef class MMLocalClass
        # The pos-th formal type parameter
-       meth get_formal(pos: Int): MMTypeFormalParameter
+       fun get_formal(pos: Int): MMTypeFormalParameter
        do
                return formals_types[pos]
        end
 
        # Register a new formal type
        # Called in order during the building of the class
-       meth register_formal(f: MMTypeFormalParameter)
+       fun register_formal(f: MMTypeFormalParameter)
        do
                assert f.def_class == self
                assert f.position == _formals_types.length
@@ -38,10 +38,10 @@ redef class MMLocalClass
        end
 
        # All the insanciated types of the class
-       attr _types: Array[MMTypeGeneric] = new Array[MMTypeGeneric]
+       var _types: Array[MMTypeGeneric] = new Array[MMTypeGeneric]
 
        # Instanciate a type from the generic class
-       meth get_instantiate_type(t: Array[MMType]): MMType
+       fun get_instantiate_type(t: Array[MMType]): MMType
        do
                for g in _types do
                        if g.params_equals(t) then return g
@@ -52,11 +52,11 @@ redef class MMLocalClass
        end
 
        # The formal types of the class
-       attr _formals_types: Array[MMTypeFormalParameter] = new Array[MMTypeFormalParameter]
+       var _formals_types: Array[MMTypeFormalParameter] = new Array[MMTypeFormalParameter]
 
        # Return the definition formal types for the class
        # Import them from the intro class if needed
-       private meth formals_types: Array[MMTypeFormalParameter]
+       private fun formals_types: Array[MMTypeFormalParameter]
        do
                if _formals_types.is_empty then
                        assert not self isa MMConcreteClass
@@ -77,131 +77,41 @@ redef class MMLocalClass
                return _formals_types
        end
 
-       redef meth get_type
+       redef fun get_type
        do
                if _base_type_cache == null and is_generic then
                        _base_type_cache = get_instantiate_type(formals_types)
-                       return _base_type_cache
+                       return _base_type_cache.as(not null)
                else
                        return super
                end
        end
 
        # Is the class a generic one?
-       meth is_generic: Bool do return arity > 0
-end
-
-redef class MMSignature
-       # Adapt the signature to a different receiver
-       meth adaptation_to(r: MMType): MMSignature
-       do
-               if _recv == r then
-                       return self
-               end
-               var mod = r.module
-               var p = _params
-               if p != null then
-                       p = new Array[MMType]
-                       for i in _params do
-                               p.add(i.for_module(mod).adapt_to(r))
-                       end
-               end
-               var rv = _return_type
-               if rv != null then
-                       rv = rv.for_module(mod).adapt_to(r)
-               end
-               return new MMSignature(p,rv,r)
-       end
-end
-
-redef class MMLocalProperty
-       # The receiver type if the signature is unknown (aka lazily computed)
-       attr _recv_alone: MMType
-
-       meth recv: MMType
-       do
-               assert signature != null
-               return signature.recv
-       end
-
-       meth recv=(rec: MMType)
-       do
-               assert rec != null
-               #               print("setting recv for {self} {rec} {_recv == null}")
-               assert _signature_cache == null
-               _recv_alone = rec
-       end
-
-       redef meth signature
-       do
-               var sig = _signature_cache
-               if sig != null then
-                       return sig
-               end
-               if self isa MMConcreteProperty then
-                       return null
-               end
-               var sp = _super_prop
-               #assert self != sp
-               var impl = _concrete_property
-               if sp == null then # superprop ?
-                       #               print("building signature for {self}:{self.object_id} and type {_recv}")
-                       _signature_cache = impl.signature
-                       assert _signature_cache != null
-               else
-                       #               print("adapting signature for {self}:{self.object_id} and type {_recv}")
-                       assert sp.signature != null
-                       assert _recv_alone != null
-                       #_signature = sp.signature
-                       _signature_cache = sp.signature.adaptation_to(_recv_alone)
-               end
-               assert _signature_cache != null
-               #               print("finally recv is {_recv} for {self}:{self.object_id} and sig is {_signature.recv}")
-               return _signature_cache
-       end
-
-       # Adapt the property to a different receiver
-       # TODO: Merge with inheritance stuff
-       meth adapt_property(t: MMType): MMLocalProperty
-       do
-               assert t != null
-               var recv = local_class.get_type
-               if t == recv then
-                       return self
-               else
-                       return inherit_to(t)
-               end
-       end
-
-       redef meth inherit_from(s, t) # for the super bugs
-       do
-               super
-               _recv_alone = t
-       end
+       fun is_generic: Bool do return arity > 0
 end
 
 redef class MMType
        # TODO: IS this useful? 
-       meth is_generic: Bool is abstract
+       fun is_generic: Bool is abstract
 end
 
 redef class MMTypeFormal
-       redef meth is_generic do return _bound.is_generic
+       redef fun is_generic do return _bound.is_generic
 end
 
 redef class MMTypeSimpleClass
-       redef meth is_generic  do return false
+       redef fun is_generic  do return false
 end
 
 class MMTypeGeneric
 special MMTypeClass
        # Formal arguments
-       readable attr _params: Array[MMType] 
-       attr _props: Map[MMGlobalProperty, MMLocalProperty] = new HashMap[MMGlobalProperty, MMLocalProperty]
+       readable var _params: Array[MMType] 
 
-       redef meth is_generic do return true
+       redef fun is_generic do return true
 
-       redef meth is_supertype(t)
+       redef fun is_supertype(t)
        do
                if t.local_class.cshe <= _local_class then
                        var u = t.upcast_for(_local_class)
@@ -212,7 +122,7 @@ special MMTypeClass
                return false
        end
 
-       redef meth upcast_for(c)
+       redef fun upcast_for(c)
        do
                var t = super
                if t != self then
@@ -221,7 +131,7 @@ special MMTypeClass
                return t
        end
 
-       redef meth for_module(mod)
+       redef fun for_module(mod)
        do
                var t: MMType = self
                if module != mod then
@@ -232,11 +142,10 @@ special MMTypeClass
                        var b = _local_class.for_module(mod)
                        t = b.get_instantiate_type(parms)
                end
-               assert t != null
                return t
        end
 
-       redef meth adapt_to(r)
+       redef fun adapt_to(r)
        do
                var rv = new Array[MMType]
                for i in _params do
@@ -246,14 +155,12 @@ special MMTypeClass
                return l
        end
 
-       private meth params_equals(t: Array[MMType]): Bool
+       private fun params_equals(t: Array[MMType]): Bool
        do
                if t.length != _params.length then
                        return false
                end
                for i in [0..t.length[ do
-                       assert _params[i] != null
-                       assert t[i] != null
                        if _params[i] != t[i] then
                                return false
                        end
@@ -261,33 +168,14 @@ special MMTypeClass
                return true
        end
 
-       redef meth select_property(g)
-       do
-               if g == null then
-                       return null
-               end
-               if not _props.has_key(g) then
-                       assert _local_class != null
-                       var p = _local_class[g]
-                       if p != null then
-                               var p2 = p.adapt_property(self)
-                               _props[g] = p2
-                               return p2
-                       else
-                               assert false
-                       end
-               end
-               return _props[g]
-       end
-
-       redef meth to_s
+       redef fun to_s
        do
                return "{super}[{_params.join(", ")}]"
        end
        
        # Is self a subtype of t?
        # Require that t.local_class = self.local_class
-       private meth is_subtype(t: MMTypeGeneric) : Bool
+       private fun is_subtype(t: MMTypeGeneric) : Bool
        do
                for i in [0.._params.length[
                do
@@ -308,38 +196,40 @@ end
 class MMTypeFormalParameter
 special MMTypeFormal
        # The class where self is defined
-       readable attr _def_class: MMLocalClass 
+       readable var _def_class: MMLocalClass 
 
        # The position is self in def_class
-       readable attr _position: Int 
+       readable var _position: Int 
 
-       redef meth module do return _def_class.module
+       redef fun module do return _def_class.module
 
-       redef meth for_module(mod)
+       redef fun for_module(mod)
        do
                var t: MMType = self
                if module != mod then
                        t = mod[_def_class.global].get_formal(position)
                end
-               assert t != null
                return t
        end
 
-       redef meth upcast_for(c) do return self
+       redef fun upcast_for(c) do return _bound.upcast_for(c)
 
-       meth bound=(t: MMType)
+       fun bound=(t: MMType)
        do
                assert _bound == null
                _bound = t
        end
 
-       redef meth adapt_to(r)
+       redef fun adapt_to(r)
        do
+               r = r.direct_type
                var old_r = r.upcast_for(def_class)
-               #print "adapt {self} for ({old_r} -> {r})"
+               #if not old_r isa MMTypeGeneric then
+               #       print "adapt {self}'{def_class}'{self.module} to {r}'{r.module}"
+               #       print "   old_r = {old_r}'{old_r.module}"
+               #end
                assert old_r isa MMTypeGeneric
                var reduct = old_r.params[position]
-               assert reduct != null
                return reduct
        end
 
@@ -351,15 +241,14 @@ special MMTypeFormal
 
        init(n: Symbol, p: Int, intro: MMLocalClass)
        do
-               assert n != null
-               _name = n
+               super(n, null)
                _position = p
                _def_class = intro
        end
 end
 
 redef class MMTypeNone
-       redef meth is_generic do return false
-       redef meth for_module(mod) do return self
-       redef meth adapt_to(r) do return self
+       redef fun is_generic do return false
+       redef fun for_module(mod) do return self
+       redef fun adapt_to(r) do return self
 end