Author: marek
Date: 2007-09-19 10:16:42 -0400 (Wed, 19 Sep 2007)
New Revision: 86009

Modified:
   trunk/mcs/gmcs/ChangeLog
   trunk/mcs/gmcs/generic.cs
   trunk/mcs/gmcs/linq.cs
Log:
2007-09-19  Marek Safar  <[EMAIL PROTECTED]>
        
        * generic.cs: Fixed type inference for generic delegate arguments whose
        return types are generic delegates.
        
        * linq.cs: Replaced ec.DeclContainer with ec.TypeContainer.
        


Modified: trunk/mcs/gmcs/ChangeLog
===================================================================
--- trunk/mcs/gmcs/ChangeLog    2007-09-19 13:55:26 UTC (rev 86008)
+++ trunk/mcs/gmcs/ChangeLog    2007-09-19 14:16:42 UTC (rev 86009)
@@ -1,3 +1,10 @@
+2007-09-19  Marek Safar  <[EMAIL PROTECTED]>
+       
+       * generic.cs: Fixed type inference for generic delegate arguments whose
+       return types are generic delegates.
+       
+       * linq.cs: Replaced ec.DeclContainer with ec.TypeContainer.
+       
 2007-09-17  Marek Safar  <[EMAIL PROTECTED]>
        
        * cs-parser.jay, linq: Implemented query continuation.

Modified: trunk/mcs/gmcs/generic.cs
===================================================================
--- trunk/mcs/gmcs/generic.cs   2007-09-19 13:55:26 UTC (rev 86008)
+++ trunk/mcs/gmcs/generic.cs   2007-09-19 14:16:42 UTC (rev 86009)
@@ -2672,7 +2672,7 @@
 
                        if (!fixed_any && fixDependent)
                                return false;
-
+                       
                        // For all arguments where the corresponding argument 
output types
                        // contain unfixed type variables but the input types 
do not,
                        // an output type inference is made
@@ -2690,19 +2690,7 @@
                                rtype = g_args[rtype.GenericParameterPosition];
 #endif
 
-                               bool all_params_fixed = false;
-                               if (rtype.IsGenericParameter) {
-                                       all_params_fixed = 
tic.IsTypeNonDependent (mi, rtype);
-                               } else if (rtype.IsGenericType) {
-                                       all_params_fixed = true;
-                                       foreach (Type t in 
rtype.GetGenericArguments ())
-                                               if (!tic.IsTypeNonDependent 
(mi, t)) {
-                                                       all_params_fixed = 
false;
-                                                       break;
-                                               }
-                               }
-
-                               if (all_params_fixed)
+                               if (tic.IsReturnTypeNonDependent (mi, rtype))
                                        tic.OutputTypeInference (ec, 
((Argument) arguments[i]).Expr, t_i);
                        }
 
@@ -2716,7 +2704,7 @@
                readonly Type[] unfixed_types;
                readonly Type[] fixed_types;
                readonly ArrayList[] bounds;
-
+               
                public TypeInferenceContext (Type[] typeArguments)
                {
                        if (typeArguments.Length == 0)
@@ -2757,7 +2745,23 @@
 
                        a.Add (t);
                }
+               
+               bool AllTypesAreFixed (Type[] types)
+               {
+                       foreach (Type t in types) {
+                               if (t.IsGenericParameter) {
+                                       if (!IsFixed (t))
+                                               return false;
+                                       continue;
+                               }
 
+                               if (t.IsGenericType)
+                                       return AllTypesAreFixed 
(t.GetGenericArguments ());
+                       }
+                       
+                       return true;
+               }               
+
                //
                // 26.3.3.8 Exact Inference
                //
@@ -2824,8 +2828,10 @@
 
                                if (!FixType (i))
                                        return false;
+                               
                                fixed_any = true;
                        }
+
                        return true;
                }
 
@@ -2849,11 +2855,10 @@
 
 #if MS_COMPATIBLE
                                // Blablabla, because reflection does not work 
with dynamic types
-                               Type [] g_args = t.GetGenericArguments ();
-                               if (!rtype.IsGenericParameter)
-                                       continue;
-
-                               rtype = g_args [rtype.GenericParameterPosition];
+                               if (rtype.IsGenericParameter) {
+                                       Type [] g_args = t.GetGenericArguments 
();
+                                       rtype = g_args 
[rtype.GenericParameterPosition];
+                               }
 #endif
                                // Remove dependent types, they cannot be fixed 
yet
                                RemoveDependentTypes (types_to_fix, rtype);
@@ -2940,26 +2945,43 @@
                        }
 
                        return parameter;
-               }               
-
-               public bool IsTypeNonDependent (MethodInfo mi, Type type)
+               }
+               
+               //
+               // Tests whether all delegate input arguments are fixed and 
generic output type
+               // requires output type inference 
+               //
+               public bool IsReturnTypeNonDependent (MethodInfo invoke, Type 
returnType)
                {
-                       if (IsUnfixed (type) < 0)
+                       if (returnType.IsGenericParameter) {
+                               if (IsFixed (returnType))
+                                   return false;
+                       } else if (returnType.IsGenericType) {
+                               if (TypeManager.IsDelegateType (returnType)) {
+                                       invoke = Delegate.GetInvokeMethod 
(returnType, returnType);
+                                       return IsReturnTypeNonDependent 
(invoke, invoke.ReturnType);
+                               }
+                                       
+                               Type[] g_args = returnType.GetGenericArguments 
();
+                               
+                               // At least one unfixed return type has to 
exist 
+                               if (AllTypesAreFixed (g_args))
+                                       return false;
+                       } else {
                                return false;
-
-                       ParameterData d_parameters = 
TypeManager.GetParameterData (mi);
-                       foreach (Type t in d_parameters.Types) {
-                               if (!t.IsGenericParameter)
-                                       continue;
-
-                               if (IsUnfixed (t) >= 0)
-                                       return false;
                        }
 
-                       return true;
+                       // All generic input arguments have to be fixed
+                       ParameterData d_parameters = 
TypeManager.GetParameterData (invoke);
+                       return AllTypesAreFixed (d_parameters.Types);
                }
+               
+               bool IsFixed (Type type)
+               {
+                       return IsUnfixed (type) == -1;
+               }               
 
-               public int IsUnfixed (Type type)
+               int IsUnfixed (Type type)
                {
                        if (!type.IsGenericParameter)
                                return -1;
@@ -3024,7 +3046,7 @@
                                        return;
 
                                v = v.GetGenericTypeDefinition 
().MakeGenericType (ga_u);
-
+                               
                                // And standard implicit conversion exists from 
U to C<U1..Uk>
                                if (!Convert.ImplicitStandardConversionExists 
(new TypeExpression (u, Location.Null), v))
                                        return;

Modified: trunk/mcs/gmcs/linq.cs
===================================================================
--- trunk/mcs/gmcs/linq.cs      2007-09-19 13:55:26 UTC (rev 86008)
+++ trunk/mcs/gmcs/linq.cs      2007-09-19 14:16:42 UTC (rev 86009)
@@ -161,7 +161,7 @@
                        Parameters p = new Parameters (parameters);
 
                        LambdaExpression selector = new LambdaExpression (
-                               null, null, (TypeContainer) ec.DeclContainer, 
p, ec.CurrentBlock, loc);
+                               null, null, (TypeContainer)ec.TypeContainer, p, 
ec.CurrentBlock, loc);
                        selector.Block = new SelectorBlock (ec.CurrentBlock, p, 
ti, loc);
                        selector.Block.AddStatement (new Return (expr, loc));
 
@@ -230,7 +230,7 @@
                                ArrayList transp_args = new ArrayList (2);
                                transp_args.Add (new AnonymousTypeParameter 
(parentParameter));
                                transp_args.Add (CreateAnonymousTypeVariable 
(parameter));
-                               element_selector = new AnonymousTypeDeclaration 
(transp_args, (TypeContainer) ec.DeclContainer, loc);
+                               element_selector = new AnonymousTypeDeclaration 
(transp_args, (TypeContainer) ec.TypeContainer, loc);
                        }
 
                        ArrayList args = new ArrayList ();
@@ -374,7 +374,7 @@
                                ArrayList join_args = new ArrayList (2);
                                join_args.Add (new AnonymousTypeParameter 
(parentParameter));
                                join_args.Add (new AnonymousTypeParameter 
(parameter));
-                               projection = new AnonymousTypeDeclaration 
(join_args, (TypeContainer) ec.DeclContainer, loc);
+                               projection = new AnonymousTypeDeclaration 
(join_args, (TypeContainer) ec.TypeContainer, loc);
                        }
 
                        args.Add (CreateSelectorArgument (ec, projection,

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to