2007-11-13 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Tue, 13 Nov 2007 14:08:32 +0000 (14:08 -0000)
committerMarek Safar <marek.safar@gmail.com>
Tue, 13 Nov 2007 14:08:32 +0000 (14:08 -0000)
  A fix for bug #341205
  * ecore.cs, expression.cs: Method group expression cannot do static
  method access with an instance reference check before overloading takes
  a place.

svn path=/trunk/mcs/; revision=89554

mcs/mcs/ChangeLog
mcs/mcs/ecore.cs
mcs/mcs/expression.cs

index 2e5766672c2b94521194b0db2e7f1aa8ea56d122..f1ed3d87419d3baa37672a7dd1cda64c4a2e2333 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-13  Marek Safar  <marek.safar@gmail.com>
+
+       A fix for bug #341205
+       * ecore.cs, expression.cs: Method group expression cannot do static
+       method access with an instance reference check before overloading takes
+       a place.
+       
 2007-11-13  Marek Safar  <marek.safar@gmail.com>
 
        A fix for bug #325359
index f1597a333eb45fba8824501fd8a89cd729994d1f..2c3192f37ea03fc215f49d06170566be87402d3c 100644 (file)
@@ -2997,12 +2997,16 @@ namespace Mono.CSharp {
                                if (original != null && original.IdenticalNameAndTypeName (ec, left, loc))
                                        return this;
 
-                               error176 (loc, GetSignatureForError ());
-                               return null;
+                               return ResolveExtensionMemberAccess (left);
                        }
 
                        InstanceExpression = left;
+                       return this;
+               }
 
+               protected virtual Expression ResolveExtensionMemberAccess (Expression left)
+               {
+                       error176 (loc, GetSignatureForError ());
                        return this;
                }
 
@@ -3223,6 +3227,9 @@ namespace Mono.CSharp {
 
                public override bool IsInstance {
                        get {
+                               if (best_candidate != null)
+                                       return !best_candidate.IsStatic;
+
                                foreach (MethodBase mb in Methods)
                                        if (!mb.IsStatic)
                                                return true;
@@ -3233,6 +3240,9 @@ namespace Mono.CSharp {
 
                public override bool IsStatic {
                        get {
+                               if (best_candidate != null)
+                                       return best_candidate.IsStatic;
+
                                foreach (MethodBase mb in Methods)
                                        if (mb.IsStatic)
                                                return true;
@@ -3480,6 +3490,19 @@ namespace Mono.CSharp {
                        return false;
                }
 
+               protected override Expression ResolveExtensionMemberAccess (Expression left)
+               {
+                       if (!IsStatic)
+                               return base.ResolveExtensionMemberAccess (left);
+
+                       //
+                       // When left side is an expression and at least one candidate method is 
+                       // static, it can be extension method
+                       //
+                       InstanceExpression = left;
+                       return this;
+               }
+
                public override Expression ResolveMemberAccess (EmitContext ec, Expression left, Location loc,
                                                                SimpleName original)
                {
@@ -4461,9 +4484,8 @@ namespace Mono.CSharp {
 
                                bool left_is_type = left is TypeExpr;
                                if (!left_is_type && (original == null || !original.IdenticalNameAndTypeName (ec, left, loc))) {
-                                       Report.SymbolRelatedToPreviousError (FieldInfo);
-                                       error176 (loc, TypeManager.GetFullNameSignature (FieldInfo));
-                                       return null;
+//                                     Report.SymbolRelatedToPreviousError (FieldInfo);
+                                       return ResolveExtensionMemberAccess (left);
                                }
 
                                if (ic.ResolveValue ()) {
index 60c032d8a578ae1a0ad77973b4d48d25df82492c..d430df7969251a0d324eb433114ccec242cfda05 100644 (file)
@@ -4214,11 +4214,13 @@ namespace Mono.CSharp {
                        MethodInfo method = (MethodInfo)mg;
                        if (method != null) {
                                type = TypeManager.TypeToCoreType (method.ReturnType);
+
+                               // TODO: this is a copy of mg.ResolveMemberAccess method
                                Expression iexpr = mg.InstanceExpression;
                                if (method.IsStatic) {
-                                       if (iexpr == null || 
-                                           iexpr is This || iexpr is EmptyExpression ||
-                                           mg.IdenticalTypeName) {
+                                       if (iexpr == null ||
+                                               iexpr is This || iexpr is EmptyExpression ||
+                                               mg.IdenticalTypeName) {
                                                mg.InstanceExpression = null;
                                        } else {
                                                MemberExpr.error176 (loc, mg.GetSignatureForError ());