+2008-11-28 Jürg Billeter <j@bitron.ch>
+
+ * vala/valabinaryexpression.vala:
+ * vala/valaelementaccess.vala:
+ * vala/valaforeachstatement.vala:
+ * vala/valamemberaccess.vala:
+ * vala/valamethodcall.vala:
+ * vala/valasemanticanalyzer.vala:
+ * gobject/valaccodearraymodule.vala:
+ * gobject/valaccodeassignmentmodule.vala:
+ * gobject/valaccodecontrolflowmodule.vala:
+
+ Improve get_actual_type signature
+
2008-11-28 Jürg Billeter <j@bitron.ch>
* vala/Makefile.am:
get_params_it.next ();
var get_param = get_params_it.get ();
- if (get_param.parameter_type.type_parameter != null) {
- var index_type = SemanticAnalyzer.get_actual_type (expr.container.value_type, get_method, get_param.parameter_type, expr);
+ if (get_param.parameter_type is GenericType) {
+ var index_type = SemanticAnalyzer.get_actual_type (expr.container.value_type, (GenericType) get_param.parameter_type, expr);
cindex = convert_to_generic_pointer (cindex, index_type);
}
set_params_it.next ();
var set_param = set_params_it.get ();
- if (set_param.parameter_type.type_parameter != null) {
- var index_type = SemanticAnalyzer.get_actual_type (expr.container.value_type, set_method, set_param.parameter_type, assignment);
+ if (set_param.parameter_type is GenericType) {
+ var index_type = SemanticAnalyzer.get_actual_type (expr.container.value_type, (GenericType) set_param.parameter_type, assignment);
cindex = convert_to_generic_pointer (cindex, index_type);
}
get_ccall.add_argument (new CCodeIdentifier (it_name));
CCodeExpression element_expr = get_ccall;
- var element_type = SemanticAnalyzer.get_actual_type (stmt.collection.value_type, get_method, get_method.return_type, stmt);
+ var element_type = SemanticAnalyzer.get_actual_type (stmt.collection.value_type, (GenericType) get_method.return_type, stmt);
element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
Iterator<DataType> type_arg_it = it_method.return_type.get_type_arguments ().iterator ();
type_arg_it.next ();
- var it_type = SemanticAnalyzer.get_actual_type (stmt.collection.value_type, it_method, type_arg_it.get (), stmt);
+ var it_type = SemanticAnalyzer.get_actual_type (stmt.collection.value_type, (GenericType) type_arg_it.get (), stmt);
element_expr = transform_expression (element_expr, it_type, stmt.type_reference);
contains_params_it.next ();
var contains_param = contains_params_it.get ();
- var key_type = analyzer.get_actual_type (right.value_type, contains_method, contains_param.parameter_type, this);
+ var key_type = analyzer.get_actual_type (right.value_type, (GenericType) contains_param.parameter_type, this);
left.target_type = key_type;
}
var get_param = get_params_it.get ();
var index_type = get_param.parameter_type;
- if (index_type.type_parameter != null) {
- index_type = analyzer.get_actual_type (container.value_type, get_method, get_param.parameter_type, this);
+ if (index_type is GenericType) {
+ index_type = analyzer.get_actual_type (container.value_type, (GenericType) index_type, this);
}
if (!index.value_type.compatible (index_type)) {
return false;
}
- value_type = analyzer.get_actual_type (container.value_type, get_method, get_method.return_type, this).copy ();
+ value_type = analyzer.get_actual_type (container.value_type, (GenericType) get_method.return_type, this).copy ();
if (lvalue) {
// get () returns owned value, set () accepts unowned value
value_type.value_owned = false;
var it_method = (Method) analyzer.iterable_type.data_type.scope.lookup ("iterator");
if (it_method.return_type.get_type_arguments ().size > 0) {
var type_arg = it_method.return_type.get_type_arguments ().get (0);
- if (type_arg.type_parameter != null) {
- element_data_type = SemanticAnalyzer.get_actual_type (collection_type, it_method, type_arg, this);
+ if (type_arg is GenericType) {
+ element_data_type = SemanticAnalyzer.get_actual_type (collection_type, (GenericType) type_arg, this);
} else {
element_data_type = type_arg;
}
value_type = analyzer.get_value_type_for_symbol (symbol_reference, lvalue);
// resolve generic return values
- if (value_type != null && value_type.type_parameter != null) {
+ if (value_type is GenericType) {
if (inner != null) {
- value_type = analyzer.get_actual_type (inner.value_type, symbol_reference, value_type, this);
+ value_type = analyzer.get_actual_type (inner.value_type, (GenericType) value_type, this);
if (value_type == null) {
return false;
}
// resolve generic type parameters
var ma = call as MemberAccess;
- if (arg.target_type.type_parameter != null) {
+ if (arg.target_type is GenericType) {
if (ma != null && ma.inner != null) {
- arg.target_type = analyzer.get_actual_type (ma.inner.value_type, ma.symbol_reference, arg.target_type, arg);
+ arg.target_type = analyzer.get_actual_type (ma.inner.value_type, (GenericType) arg.target_type, arg);
assert (arg.target_type != null);
}
}
// resolve generic return values
var ma = call as MemberAccess;
- if (ret_type.type_parameter != null) {
+ if (ret_type is GenericType) {
if (ma != null && ma.inner != null) {
- ret_type = analyzer.get_actual_type (ma.inner.value_type, ma.symbol_reference, ret_type, this);
+ ret_type = analyzer.get_actual_type (ma.inner.value_type, (GenericType) ret_type, this);
if (ret_type == null) {
return false;
}
}
Gee.List<DataType> resolved_type_args = new ArrayList<DataType> ();
foreach (DataType type_arg in ret_type.get_type_arguments ()) {
- if (type_arg.type_parameter != null && ma != null && ma.inner != null) {
- resolved_type_args.add (analyzer.get_actual_type (ma.inner.value_type, ma.symbol_reference, type_arg, this));
+ if (type_arg is GenericType && ma != null && ma.inner != null) {
+ resolved_type_args.add (analyzer.get_actual_type (ma.inner.value_type, (GenericType) type_arg, this));
} else {
resolved_type_args.add (type_arg);
}
return instance_base_type;
}
- static DataType? get_instance_base_type_for_member (DataType derived_instance_type, Symbol member, CodeNode node_reference) {
+ static DataType? get_instance_base_type_for_member (DataType derived_instance_type, TypeSymbol type_symbol, CodeNode node_reference) {
DataType instance_type = derived_instance_type;
while (instance_type is PointerType) {
instance_type = instance_pointer_type.base_type;
}
- if (instance_type.data_type == member.parent_symbol) {
+ if (instance_type.data_type == type_symbol) {
return instance_type;
}
// (prerequisites can be assumed to be met already)
foreach (DataType base_type in cl.get_base_types ()) {
if (base_type.data_type is Interface) {
- instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), member, node_reference);
+ instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), type_symbol, node_reference);
if (instance_base_type != null) {
return instance_base_type;
}
if (instance_base_type == null) {
foreach (DataType base_type in cl.get_base_types ()) {
if (base_type.data_type is Class) {
- instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), member, node_reference);
+ instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), type_symbol, node_reference);
if (instance_base_type != null) {
return instance_base_type;
}
} else if (instance_type.data_type is Struct) {
var st = (Struct) instance_type.data_type;
foreach (DataType base_type in st.get_base_types ()) {
- instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), member, node_reference);
+ instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, base_type, node_reference), type_symbol, node_reference);
if (instance_base_type != null) {
return instance_base_type;
}
// first check interface prerequisites recursively
foreach (DataType prerequisite in iface.get_prerequisites ()) {
if (prerequisite.data_type is Interface) {
- instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, prerequisite, node_reference), member, node_reference);
+ instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, prerequisite, node_reference), type_symbol, node_reference);
if (instance_base_type != null) {
return instance_base_type;
}
// then check class prerequisite recursively
foreach (DataType prerequisite in iface.get_prerequisites ()) {
if (prerequisite.data_type is Class) {
- instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, prerequisite, node_reference), member, node_reference);
+ instance_base_type = get_instance_base_type_for_member (get_instance_base_type (instance_type, prerequisite, node_reference), type_symbol, node_reference);
if (instance_base_type != null) {
return instance_base_type;
}
return null;
}
- public static DataType? get_actual_type (DataType derived_instance_type, Symbol generic_member, DataType generic_type, CodeNode node_reference) {
+ public static DataType? get_actual_type (DataType derived_instance_type, GenericType generic_type, CodeNode node_reference) {
// trace type arguments back to the datatype where the method has been declared
- var instance_type = get_instance_base_type_for_member (derived_instance_type, generic_member, node_reference);
+ var instance_type = get_instance_base_type_for_member (derived_instance_type, (TypeSymbol) generic_type.type_parameter.parent_symbol, node_reference);
- if (instance_type == null) {
- Report.error (node_reference.source_reference, "internal error: unable to find generic member `%s'".printf (generic_member.name));
- node_reference.error = true;
- return null;
- }
+ assert (instance_type != null);
int param_index = instance_type.data_type.get_type_parameter_index (generic_type.type_parameter.name);
if (param_index == -1) {