Author: raja
Date: 2005-03-07 07:04:56 -0500 (Mon, 07 Mar 2005)
New Revision: 41518

Modified:
   trunk/mcs/mcs/ChangeLog
   trunk/mcs/mcs/ecore.cs
   trunk/mcs/mcs/expression.cs
Log:
* ecore.cs (SimpleName.DoResolve): Rename from SimpleName.DoResolveAllowStatic.
(SimpleName.DoSimpleNameResolve): Remove 'allow_static' argument.
Pass 'intermediate' flag to MemberStaticCheck.
(SimpleName.MemberStaticCheck): Skip "static check" only in case
of "intermediate" lookups via MemberAccess.
(SimpleName.IdenticalNameAndTypeName): New.  Carved out of ...
* expression.cs (MemberAccess.IdenticalNameAndTypeName): ... this.


Modified: trunk/mcs/mcs/ChangeLog
===================================================================
--- trunk/mcs/mcs/ChangeLog     2005-03-07 11:10:45 UTC (rev 41517)
+++ trunk/mcs/mcs/ChangeLog     2005-03-07 12:04:56 UTC (rev 41518)
@@ -1,5 +1,16 @@
 2005-03-07  Raja R Harinath  <[EMAIL PROTECTED]>
 
+       * ecore.cs (SimpleName.DoResolve): Rename from
+       SimpleName.DoResolveAllowStatic.
+       (SimpleName.DoSimpleNameResolve): Remove 'allow_static' argument.
+       Pass 'intermediate' flag to MemberStaticCheck.
+       (SimpleName.MemberStaticCheck): Skip "static check" only in case
+       of "intermediate" lookups via MemberAccess.
+       (SimpleName.IdenticalNameAndTypeName): New.  Carved out of ...
+       * expression.cs (MemberAccess.IdenticalNameAndTypeName): ... this.
+
+2005-03-07  Raja R Harinath  <[EMAIL PROTECTED]>
+
        Fix #73394.
        * ecore.cs (FieldExpr.EmitInstance): Catch cases of CS0120 that
        slipped in because of variable names that are identical to a

Modified: trunk/mcs/mcs/ecore.cs
===================================================================
--- trunk/mcs/mcs/ecore.cs      2005-03-07 11:10:45 UTC (rev 41517)
+++ trunk/mcs/mcs/ecore.cs      2005-03-07 12:04:56 UTC (rev 41518)
@@ -365,7 +365,7 @@
                        Expression e;
                        bool intermediate = (flags & ResolveFlags.Intermediate) 
== ResolveFlags.Intermediate;
                        if (this is SimpleName)
-                               e = ((SimpleName) this).DoResolveAllowStatic 
(ec, intermediate);
+                               e = ((SimpleName) this).DoResolve (ec, 
intermediate);
 
                        else 
                                e = DoResolve (ec);
@@ -2013,17 +2013,25 @@
                                        "An object reference is required " +
                                        "for the non-static field `"+name+"'");
                }
+
+               public bool IdenticalNameAndTypeName (EmitContext ec, 
Expression resolved_to, Location loc)
+               {
+                       return resolved_to != null && resolved_to.Type != null 
&& 
+                               resolved_to.Type.Name == Name &&
+                               (ec.DeclSpace.LookupType (Name, loc, /* 
ignore_cs0104 = */ true) != null);
+               }
                
                //
                // Checks whether we are trying to access an instance
                // property, method or field from a static body.
                //
-               Expression MemberStaticCheck (EmitContext ec, Expression e)
+               Expression MemberStaticCheck (EmitContext ec, Expression e, 
bool intermediate)
                {
                        if (e is IMemberExpr){
                                IMemberExpr member = (IMemberExpr) e;
                                
-                               if (!member.IsStatic){
+                               if (!member.IsStatic &&
+                                   (!intermediate || !IdenticalNameAndTypeName 
(ec, e, loc))) {
                                        Error_ObjectRefRequired (ec, loc, Name);
                                        return null;
                                }
@@ -2031,21 +2039,21 @@
 
                        return e;
                }
-               
+
                public override Expression DoResolve (EmitContext ec)
                {
-                       return SimpleNameResolve (ec, null, false, false);
+                       return SimpleNameResolve (ec, null, false);
                }
 
                public override Expression DoResolveLValue (EmitContext ec, 
Expression right_side)
                {
-                       return SimpleNameResolve (ec, right_side, false, false);
+                       return SimpleNameResolve (ec, right_side, false);
                }
                
 
-               public Expression DoResolveAllowStatic (EmitContext ec, bool 
intermediate)
+               public Expression DoResolve (EmitContext ec, bool intermediate)
                {
-                       return SimpleNameResolve (ec, null, true, intermediate);
+                       return SimpleNameResolve (ec, null, intermediate);
                }
 
                public override FullNamedExpression ResolveAsTypeStep 
(EmitContext ec)
@@ -2058,10 +2066,9 @@
                        return dt;
                }
 
-               Expression SimpleNameResolve (EmitContext ec, Expression 
right_side,
-                                             bool allow_static, bool 
intermediate)
+               Expression SimpleNameResolve (EmitContext ec, Expression 
right_side, bool intermediate)
                {
-                       Expression e = DoSimpleNameResolve (ec, right_side, 
allow_static, intermediate);
+                       Expression e = DoSimpleNameResolve (ec, right_side, 
intermediate);
                        if (e == null)
                                return null;
 
@@ -2083,7 +2090,7 @@
                ///   Local Variables and Parameters are handled at
                ///   parse time, so they never occur as SimpleNames.
                ///
-               ///   The `allow_static' flag is used by MemberAccess only
+               ///   The `intermediate' flag is used by MemberAccess only
                ///   and it is used to inform us that it is ok for us to 
                ///   avoid the static check, because MemberAccess might end
                ///   up resolving the Name as a Type name and the access as
@@ -2094,7 +2101,7 @@
                ///   Type is both an instance variable and a Type;  
Type.GetType
                ///   is the static method not an instance method of type.
                /// </remarks>
-               Expression DoSimpleNameResolve (EmitContext ec, Expression 
right_side, bool allow_static, bool intermediate)
+               Expression DoSimpleNameResolve (EmitContext ec, Expression 
right_side, bool intermediate)
                {
                        Expression e = null;
 
@@ -2189,7 +2196,7 @@
                                    TypeManager.IsNestedFamilyAccessible 
(me.InstanceExpression.Type, me.DeclaringType) &&
                                    me.InstanceExpression.Type != 
me.DeclaringType &&
                                    !me.InstanceExpression.Type.IsSubclassOf 
(me.DeclaringType) &&
-                                   (!intermediate || 
!MemberAccess.IdenticalNameAndTypeName (ec, this, e, loc))) {
+                                   (!intermediate || !IdenticalNameAndTypeName 
(ec, e, loc))) {
                                        Error (38, "Cannot access nonstatic 
member `" + me.Name + "' of " +
                                               "outer type `" + 
me.DeclaringType + "' via nested type `" +
                                               me.InstanceExpression.Type + 
"'");
@@ -2202,10 +2209,7 @@
                        }
 
                        if (ec.IsStatic || ec.IsFieldInitializer){
-                               if (allow_static)
-                                       return e;
-
-                               return MemberStaticCheck (ec, e);
+                               return MemberStaticCheck (ec, e, intermediate);
                        } else
                                return e;
                }

Modified: trunk/mcs/mcs/expression.cs
===================================================================
--- trunk/mcs/mcs/expression.cs 2005-03-07 11:10:45 UTC (rev 41517)
+++ trunk/mcs/mcs/expression.cs 2005-03-07 12:04:56 UTC (rev 41518)
@@ -7192,10 +7192,7 @@
                public static bool IdenticalNameAndTypeName (EmitContext ec, 
Expression left_original, Expression left, Location loc)
                {
                        SimpleName sn = left_original as SimpleName;
-                       if (sn == null || left == null || left.Type.Name != 
sn.Name)
-                               return false;
-
-                       return ec.DeclSpace.LookupType (sn.Name, loc, 
/*ignore_cs0104*/ true) != null;
+                       return sn != null && sn.IdenticalNameAndTypeName (ec, 
left, loc);
                }
                
                // TODO: possible optimalization

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

Reply via email to