From: Jürg Billeter Date: Fri, 28 Nov 2008 09:55:10 +0000 (+0000) Subject: Improve get_actual_type signature X-Git-Tag: VALA_0_5_2~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b4f30b45d387e780d6a49faf6fa4bfb4d7a8570;p=thirdparty%2Fvala.git Improve get_actual_type signature 2008-11-28 Jürg Billeter * 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 svn path=/trunk/; revision=2066 --- diff --git a/ChangeLog b/ChangeLog index cb2c4c963..db6ca5801 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2008-11-28 Jürg Billeter + + * 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 * vala/Makefile.am: diff --git a/gobject/valaccodearraymodule.vala b/gobject/valaccodearraymodule.vala index ef302dd4c..b3a459034 100644 --- a/gobject/valaccodearraymodule.vala +++ b/gobject/valaccodearraymodule.vala @@ -270,8 +270,8 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { 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); } diff --git a/gobject/valaccodeassignmentmodule.vala b/gobject/valaccodeassignmentmodule.vala index 4f38899ef..91395801b 100644 --- a/gobject/valaccodeassignmentmodule.vala +++ b/gobject/valaccodeassignmentmodule.vala @@ -119,8 +119,8 @@ public class Vala.CCodeAssignmentModule : CCodeMemberAccessModule { 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); } diff --git a/gobject/valaccodecontrolflowmodule.vala b/gobject/valaccodecontrolflowmodule.vala index 011bc30c5..340b2584e 100644 --- a/gobject/valaccodecontrolflowmodule.vala +++ b/gobject/valaccodecontrolflowmodule.vala @@ -470,7 +470,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule { 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); @@ -520,7 +520,7 @@ public class Vala.CCodeControlFlowModule : CCodeMethodModule { Iterator 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); diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala index 200bb711d..1a10b74db 100644 --- a/vala/valabinaryexpression.vala +++ b/vala/valabinaryexpression.vala @@ -288,7 +288,7 @@ public class Vala.BinaryExpression : Expression { 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; } diff --git a/vala/valaelementaccess.vala b/vala/valaelementaccess.vala index 7b40354ee..847518763 100644 --- a/vala/valaelementaccess.vala +++ b/vala/valaelementaccess.vala @@ -165,8 +165,8 @@ public class Vala.ElementAccess : Expression { 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)) { @@ -175,7 +175,7 @@ public class Vala.ElementAccess : Expression { 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; diff --git a/vala/valaforeachstatement.vala b/vala/valaforeachstatement.vala index 5e39ab532..04c196590 100644 --- a/vala/valaforeachstatement.vala +++ b/vala/valaforeachstatement.vala @@ -183,8 +183,8 @@ public class Vala.ForeachStatement : Block { 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; } diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 9dcb342b8..c5c9cce66 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -490,9 +490,9 @@ public class Vala.MemberAccess : Expression { 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; } diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index 0dc389802..4e2f92332 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -224,9 +224,9 @@ public class Vala.MethodCall : Expression { // 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); } } @@ -393,9 +393,9 @@ public class Vala.MethodCall : Expression { // 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; } @@ -403,8 +403,8 @@ public class Vala.MethodCall : Expression { } Gee.List resolved_type_args = new ArrayList (); 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); } diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 94b6256be..f23448b45 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -474,7 +474,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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) { @@ -482,7 +482,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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; } @@ -495,7 +495,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { // (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; } @@ -505,7 +505,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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; } @@ -515,7 +515,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { } 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; } @@ -525,7 +525,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { // 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; } @@ -535,7 +535,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { // 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; } @@ -547,15 +547,11 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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) {