+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:
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> ();
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.
*
type.accept (visitor);
}
- foreach (TypeParameter p in type_parameters) {
+ foreach (TypeParameter p in get_type_parameters ()) {
p.accept (visitor);
}
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) {
type.check (analyzer);
}
- foreach (TypeParameter p in type_parameters) {
+ foreach (TypeParameter p in get_type_parameters ()) {
p.check (analyzer);
}
} else {
s = data_type.get_full_name ();
}
- } else if (type_parameter != null) {
- s = type_parameter.name;
} else {
s = "null";
}
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 () {
public override string? get_type_id () {
return "G_TYPE_POINTER";
}
+
+ public override string to_qualified_string (Scope? scope = null) {
+ return type_parameter.name;
+ }
}
* 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> ();
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.
type.accept (visitor);
}
- foreach (TypeParameter p in type_parameters) {
+ foreach (TypeParameter p in get_type_parameters ()) {
p.accept (visitor);
}
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) {
type.check (analyzer);
}
- foreach (TypeParameter p in type_parameters) {
+ foreach (TypeParameter p in get_type_parameters ()) {
p.check (analyzer);
}
* @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;
}
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;
}
/* 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;
/**
* 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;
}
}
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);