]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix method checking with generic base types, fixes bug 511286 d9d324c1a9a2fba9d91b23cdc80e7e1e51da620b
authorJürg Billeter <j@bitron.ch>
Fri, 28 Nov 2008 12:25:24 +0000 (12:25 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 28 Nov 2008 12:25:24 +0000 (12:25 +0000)
2008-11-28  Jürg Billeter  <j@bitron.ch>

* vala/valaclass.vala:
* vala/valadatatype.vala:
* vala/valagenerictype.vala:
* vala/valainterface.vala:
* vala/valamethod.vala:
* vala/valaobjecttypesymbol.vala:
* vala/valasymbolresolver.vala:

Fix method checking with generic base types, fixes bug 511286

svn path=/trunk/; revision=2068

ChangeLog
vala/valaclass.vala
vala/valadatatype.vala
vala/valagenerictype.vala
vala/valainterface.vala
vala/valamethod.vala
vala/valaobjecttypesymbol.vala
vala/valasymbolresolver.vala

index 6f2bff8cc7ac420f2f9d145f8d2c95b28d9fcb5b..b3be528ab01178e9c55080b36b10ab7c9c45fe05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-11-28  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valaclass.vala:
+       * vala/valadatatype.vala:
+       * vala/valagenerictype.vala:
+       * vala/valainterface.vala:
+       * vala/valamethod.vala:
+       * vala/valaobjecttypesymbol.vala:
+       * vala/valasymbolresolver.vala:
+
+       Fix method checking with generic base types, fixes bug 511286
+
 2008-11-28  Jürg Billeter  <j@bitron.ch>
 
        * vala/valadatatype.vala:
index 297ec0251b274eb0235fb0b6f243d38e6513f007..3bf09e6e45ba0519ca89b7a3342d77447f09ec3c 100644 (file)
@@ -99,8 +99,6 @@ public class Vala.Class : ObjectTypeSymbol {
        private bool _is_compact;
        private bool _is_immutable;
 
-       private Gee.List<TypeParameter> type_parameters = new ArrayList<TypeParameter> ();
-
        private Gee.List<DataType> base_types = new ArrayList<DataType> ();
 
        private Gee.List<Constant> constants = new ArrayList<Constant> ();
@@ -230,26 +228,6 @@ public class Vala.Class : ObjectTypeSymbol {
                return new ReadOnlyList<DataType> (base_types);
        }
 
-       /**
-        * Appends the specified parameter to the list of type parameters.
-        *
-        * @param p a type parameter
-        */
-       public void add_type_parameter (TypeParameter p) {
-               type_parameters.add (p);
-               p.type = this;
-               scope.add (p.name, p);
-       }
-
-       /**
-        * Returns a copy of the type parameter list.
-        *
-        * @return list of type parameters
-        */
-       public Gee.List<TypeParameter> get_type_parameters () {
-               return new ReadOnlyList<TypeParameter> (type_parameters);
-       }
-
        /**
         * Adds the specified constant as a member to this class.
         *
@@ -433,7 +411,7 @@ public class Vala.Class : ObjectTypeSymbol {
                        type.accept (visitor);
                }
 
-               foreach (TypeParameter p in type_parameters) {
+               foreach (TypeParameter p in get_type_parameters ()) {
                        p.accept (visitor);
                }
 
@@ -795,17 +773,6 @@ public class Vala.Class : ObjectTypeSymbol {
                return false;
        }
 
-       public override int get_type_parameter_index (string name) {
-               int i = 0;
-               foreach (TypeParameter parameter in type_parameters) {
-                       if (parameter.name == name) {
-                               return i;
-                       }
-                       i++;
-               }
-               return -1;
-       }
-
        public override void replace_type (DataType old_type, DataType new_type) {
                for (int i = 0; i < base_types.size; i++) {
                        if (base_types[i] == old_type) {
@@ -888,7 +855,7 @@ public class Vala.Class : ObjectTypeSymbol {
                        type.check (analyzer);
                }
 
-               foreach (TypeParameter p in type_parameters) {
+               foreach (TypeParameter p in get_type_parameters ()) {
                        p.check (analyzer);
                }
 
index 1b9b2efdb9e0e537e10e4acc8537e70e8e264135..10f3aa1f493b1a57daf4255dc08d91b9a48cde2d 100644 (file)
@@ -179,8 +179,6 @@ public abstract class Vala.DataType : CodeNode {
                        } else {
                                s = data_type.get_full_name ();
                        }
-               } else if (type_parameter != null) {
-                       s = type_parameter.name;
                } else {
                        s = "null";
                }
index a86ffadfcef9389328a0a2449ca5d4f455e247a4..aca48a3723fb4e916443a922ceef058998513caa 100644 (file)
@@ -28,6 +28,8 @@ using GLib;
 public class Vala.GenericType : DataType {
        public GenericType (TypeParameter type_parameter) {
                this.type_parameter = type_parameter;
+               // type parameters are always considered nullable
+               this.nullable = true;
        }
 
        public override DataType copy () {
@@ -51,4 +53,8 @@ public class Vala.GenericType : DataType {
        public override string? get_type_id () {
                return "G_TYPE_POINTER";
        }
+
+       public override string to_qualified_string (Scope? scope = null) {
+               return type_parameter.name;
+       }
 }
index ee53853144df2040fb19336cc907b4a6c532b6f5..9d7824a2ef63adb94d6c74c23b4c367e0cfa1249 100644 (file)
@@ -27,8 +27,6 @@ using Gee;
  * Represents a class declaration in the source code.
  */
 public class Vala.Interface : ObjectTypeSymbol {
-       private Gee.List<TypeParameter> type_parameters = new ArrayList<TypeParameter> ();
-       
        private Gee.List<DataType> prerequisites = new ArrayList<DataType> ();
 
        private Gee.List<Method> methods = new ArrayList<Method> ();
@@ -94,26 +92,6 @@ public class Vala.Interface : ObjectTypeSymbol {
                base (name, source_reference);
        }
 
-       /**
-        * Appends the specified parameter to the list of type parameters.
-        *
-        * @param p a type parameter
-        */
-       public void add_type_parameter (TypeParameter p) {
-               type_parameters.add (p);
-               p.type = this;
-               scope.add (p.name, p);
-       }
-
-       /**
-        * Returns a copy of the type parameter list.
-        *
-        * @return list of type parameters
-        */
-       public Gee.List<TypeParameter> get_type_parameters () {
-               return new ReadOnlyList<TypeParameter> (type_parameters);
-       }
-
        /**
         * Adds the specified interface or class to the list of prerequisites of
         * this interface.
@@ -355,7 +333,7 @@ public class Vala.Interface : ObjectTypeSymbol {
                        type.accept (visitor);
                }
 
-               foreach (TypeParameter p in type_parameters) {
+               foreach (TypeParameter p in get_type_parameters ()) {
                        p.accept (visitor);
                }
 
@@ -502,17 +480,6 @@ public class Vala.Interface : ObjectTypeSymbol {
                return type_id;
        }
 
-       public override int get_type_parameter_index (string name) {
-               int i = 0;
-               foreach (TypeParameter parameter in type_parameters) {
-                       if (parameter.name == name) {
-                               return i;
-                       }
-                       i++;
-               }
-               return -1;
-       }
-
        public override void replace_type (DataType old_type, DataType new_type) {
                for (int i = 0; i < prerequisites.size; i++) {
                        if (prerequisites[i] == old_type) {
@@ -594,7 +561,7 @@ public class Vala.Interface : ObjectTypeSymbol {
                        type.check (analyzer);
                }
 
-               foreach (TypeParameter p in type_parameters) {
+               foreach (TypeParameter p in get_type_parameters ()) {
                        p.check (analyzer);
                }
 
index 96fb25d856ee2dc9bf252b379788a3c600f2900f..b52ab408e36d0a0282f230774c6f6946a796984f 100644 (file)
@@ -414,7 +414,18 @@ public class Vala.Method : Member {
         * @return true if the specified method is compatible to this method
         */
        public bool compatible (Method base_method, out string? invalid_match) {
-               if (!return_type.equals (base_method.return_type)) {
+               ObjectType object_type = null;
+               if (parent_symbol is ObjectTypeSymbol) {
+                       object_type = new ObjectType ((ObjectTypeSymbol) parent_symbol);
+                       foreach (TypeParameter type_parameter in object_type.type_symbol.get_type_parameters ()) {
+                               var type_arg = new GenericType (type_parameter);
+                               type_arg.value_owned = true;
+                               object_type.add_type_argument (type_arg);
+                       }
+               }
+
+               var actual_base_type = base_method.return_type.get_actual_type (object_type, this);
+               if (!return_type.equals (actual_base_type)) {
                        invalid_match = "incompatible return type";
                        return false;
                }
@@ -428,7 +439,8 @@ public class Vala.Method : Member {
                                return false;
                        }
                        
-                       if (!base_param.parameter_type.equals (method_params_it.get ().parameter_type)) {
+                       actual_base_type = base_param.parameter_type.get_actual_type (object_type, this);
+                       if (!actual_base_type.equals (method_params_it.get ().parameter_type)) {
                                invalid_match = "incompatible type of parameter %d".printf (param_index);
                                return false;
                        }
index 069d184931438f92c4188fc9a4e4c6f846f6006b..6f51e9751a72689a19f59a0e9768e4f37256d7fd 100644 (file)
@@ -1,5 +1,6 @@
 /* valaobjecttypesymbol.vala
  *
+ * Copyright (C) 2008  Jürg Billeter
  * Copyright (C) 2008  Philip Van Hoof
  *
  * This library is free software; you can redistribute it and/or
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
  *
  * Author:
+ *     Jürg Billeter <j@bitron.ch>
  *     Philip Van Hoof <pvanhoof@gnome.org>
  */
 
-using GLib;
 using Gee;
 
 /**
@@ -29,11 +30,44 @@ using Gee;
  * Vala API file.
  */
 public abstract class Vala.ObjectTypeSymbol : TypeSymbol {
+       private Gee.List<TypeParameter> type_parameters = new ArrayList<TypeParameter> ();
+
+       public ObjectTypeSymbol (string name, SourceReference? source_reference = null) {
+               base (name, source_reference);
+       }
+
        public abstract Gee.List<Method> get_methods ();
        public abstract Gee.List<Signal> get_signals ();
        public abstract Gee.List<Property> get_properties ();
 
-       public ObjectTypeSymbol (string name, SourceReference? source_reference = null) {
-               base (name, source_reference);
+       /**
+        * Appends the specified parameter to the list of type parameters.
+        *
+        * @param p a type parameter
+        */
+       public void add_type_parameter (TypeParameter p) {
+               type_parameters.add (p);
+               p.type = this;
+               scope.add (p.name, p);
+       }
+
+       /**
+        * Returns a copy of the type parameter list.
+        *
+        * @return list of type parameters
+        */
+       public Gee.List<TypeParameter> get_type_parameters () {
+               return new ReadOnlyList<TypeParameter> (type_parameters);
+       }
+
+       public override int get_type_parameter_index (string name) {
+               int i = 0;
+               foreach (TypeParameter parameter in type_parameters) {
+                       if (parameter.name == name) {
+                               return i;
+                       }
+                       i++;
+               }
+               return -1;
        }
 }
index 1a0a33903b5b3fe9f5ba1ac664b4835ae61e6a20..5fba17b875b3ff09711408ade49d6e7dda865537 100644 (file)
@@ -294,7 +294,15 @@ public class Vala.SymbolResolver : CodeVisitor {
 
                type.source_reference = unresolved_type.source_reference;
                type.value_owned = unresolved_type.value_owned;
-               type.nullable = unresolved_type.nullable;
+
+               if (type is GenericType) {
+                       // type parameters are always considered nullable
+                       // actual type argument may or may not be nullable
+                       type.nullable = true;
+               } else {
+                       type.nullable = unresolved_type.nullable;
+               }
+
                type.is_dynamic = unresolved_type.is_dynamic;
                foreach (DataType type_arg in unresolved_type.get_type_arguments ()) {
                        type.add_type_argument (type_arg);