From: Jürg Billeter Date: Fri, 28 Nov 2008 12:25:24 +0000 (+0000) Subject: Fix method checking with generic base types, fixes bug 511286 X-Git-Tag: VALA_0_5_2~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9d324c1a9a2fba9d91b23cdc80e7e1e51da620b;p=thirdparty%2Fvala.git Fix method checking with generic base types, fixes bug 511286 2008-11-28 Jürg Billeter * 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 --- diff --git a/ChangeLog b/ChangeLog index 6f2bff8cc..b3be528ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-11-28 Jürg Billeter + + * 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 * vala/valadatatype.vala: diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 297ec0251..3bf09e6e4 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -99,8 +99,6 @@ public class Vala.Class : ObjectTypeSymbol { private bool _is_compact; private bool _is_immutable; - private Gee.List type_parameters = new ArrayList (); - private Gee.List base_types = new ArrayList (); private Gee.List constants = new ArrayList (); @@ -230,26 +228,6 @@ public class Vala.Class : ObjectTypeSymbol { return new ReadOnlyList (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 get_type_parameters () { - return new ReadOnlyList (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); } diff --git a/vala/valadatatype.vala b/vala/valadatatype.vala index 1b9b2efdb..10f3aa1f4 100644 --- a/vala/valadatatype.vala +++ b/vala/valadatatype.vala @@ -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"; } diff --git a/vala/valagenerictype.vala b/vala/valagenerictype.vala index a86ffadfc..aca48a372 100644 --- a/vala/valagenerictype.vala +++ b/vala/valagenerictype.vala @@ -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; + } } diff --git a/vala/valainterface.vala b/vala/valainterface.vala index ee5385314..9d7824a2e 100644 --- a/vala/valainterface.vala +++ b/vala/valainterface.vala @@ -27,8 +27,6 @@ using Gee; * Represents a class declaration in the source code. */ public class Vala.Interface : ObjectTypeSymbol { - private Gee.List type_parameters = new ArrayList (); - private Gee.List prerequisites = new ArrayList (); private Gee.List methods = new ArrayList (); @@ -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 get_type_parameters () { - return new ReadOnlyList (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); } diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 96fb25d85..b52ab408e 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -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; } diff --git a/vala/valaobjecttypesymbol.vala b/vala/valaobjecttypesymbol.vala index 069d18493..6f51e9751 100644 --- a/vala/valaobjecttypesymbol.vala +++ b/vala/valaobjecttypesymbol.vala @@ -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 @@ -17,10 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Author: + * Jürg Billeter * Philip Van Hoof */ -using GLib; using Gee; /** @@ -29,11 +30,44 @@ using Gee; * Vala API file. */ public abstract class Vala.ObjectTypeSymbol : TypeSymbol { + private Gee.List type_parameters = new ArrayList (); + + public ObjectTypeSymbol (string name, SourceReference? source_reference = null) { + base (name, source_reference); + } + public abstract Gee.List get_methods (); public abstract Gee.List get_signals (); public abstract Gee.List 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 get_type_parameters () { + return new ReadOnlyList (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; } } diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala index 1a0a33903..5fba17b87 100644 --- a/vala/valasymbolresolver.vala +++ b/vala/valasymbolresolver.vala @@ -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);