Clean up predefined members caching
[mono.git] / mcs / mcs / membercache.cs
index 53dbad92177873596ffd14911ecb1bc6caca2c61..6f6970320e6df0e49c4e114e20e9e0b281363c82 100644 (file)
@@ -39,11 +39,11 @@ namespace Mono.CSharp {
                PointerType = 1 << 20,
                InternalCompilerType = 1 << 21,
                MissingType = 1 << 22,
+               Void = 1 << 23,
 
                NestedMask = Class | Struct | Delegate | Enum | Interface,
                GenericMask = Method | Class | Struct | Delegate | Interface,
-               MaskType = Constructor | Event | Field | Method | Property | Indexer | Operator | Destructor | NestedMask,
-               All = MaskType
+               MaskType = Constructor | Event | Field | Method | Property | Indexer | Operator | Destructor | NestedMask
        }
 
        [Flags]
@@ -69,8 +69,7 @@ namespace Mono.CSharp {
                public readonly MemberKind Kind;
                public readonly AParametersCollection Parameters;
                public readonly TypeSpec MemberType;
-
-               int arity; // -1 to ignore the check
+               public readonly int Arity; // -1 to ignore the check
 
                private MemberFilter (string name, MemberKind kind)
                {
@@ -78,7 +77,7 @@ namespace Mono.CSharp {
                        Kind = kind;
                        Parameters = null;
                        MemberType = null;
-                       arity = -1;
+                       Arity = -1;
                }
 
                public MemberFilter (MethodSpec m)
@@ -87,7 +86,7 @@ namespace Mono.CSharp {
                        Kind = MemberKind.Method;
                        Parameters = m.Parameters;
                        MemberType = m.ReturnType;
-                       arity = m.Arity;
+                       Arity = m.Arity;
                }
 
                public MemberFilter (string name, int arity, MemberKind kind, AParametersCollection param, TypeSpec type)
@@ -96,7 +95,7 @@ namespace Mono.CSharp {
                        Kind = kind;
                        Parameters = param;
                        MemberType = type;
-                       this.arity = arity;
+                       this.Arity = arity;
                }
 
                public static MemberFilter Constructor (AParametersCollection param)
@@ -129,7 +128,7 @@ namespace Mono.CSharp {
                                return false;
 
                        // Check arity when not disabled
-                       if (arity >= 0 && arity != other.Arity)
+                       if (Arity >= 0 && Arity != other.Arity)
                                return false;
 
                        if (Parameters != null) {
@@ -169,6 +168,7 @@ namespace Mono.CSharp {
        //
        public class MemberCache
        {
+               [Flags]
                enum StateFlags
                {
                        HasConversionOperator = 1 << 1,
@@ -302,16 +302,24 @@ namespace Mono.CSharp {
                {
                        if (member.Kind == MemberKind.Operator) {
                                var dt = member.DeclaringType;
-                               if (dt.BuildinType == BuildinTypeSpec.Type.String || dt == TypeManager.delegate_type || dt == TypeManager.multicast_delegate_type) {
+                               switch (dt.BuildinType) {
+                               case BuildinTypeSpec.Type.String:
+                               case BuildinTypeSpec.Type.Delegate:
+                               case BuildinTypeSpec.Type.MulticastDelegate:
                                        // Some core types have user operators but they cannot be used as normal
                                        // user operators as they are predefined and therefore having different
                                        // rules (e.g. binary operators) by not setting the flag we hide them for
                                        // user conversions
                                        // TODO: Should I do this for all core types ?
-                               } else if (name == Operator.GetMetadataName (Operator.OpType.Implicit) || name == Operator.GetMetadataName (Operator.OpType.Explicit)) {
-                                       state |= StateFlags.HasConversionOperator;
-                               } else {
-                                       state |= StateFlags.HasUserOperator;
+                                       break;
+                               default:
+                                       if (name == Operator.GetMetadataName (Operator.OpType.Implicit) || name == Operator.GetMetadataName (Operator.OpType.Explicit)) {
+                                               state |= StateFlags.HasConversionOperator;
+                                       } else {
+                                               state |= StateFlags.HasUserOperator;
+                                       }
+
+                                       break;
                                }
                        }