2010-04-11 Veerapuram Varadhan <vvaradhan@novell.com>
[mono.git] / mcs / mcs / method.cs
index abecb38e5f8b73cc331ddc668c9b9a47443f3bec..7c7e12e10858008c4526f82f1abd9d05550b1ffe 100644 (file)
@@ -164,8 +164,8 @@ namespace Mono.CSharp {
                MethodBase metaInfo;
                readonly AParametersCollection parameters;
 
-               public MethodSpec (IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers)
-                       : base (details, info.Name, modifiers)
+               public MethodSpec (MemberKind kind, IMemberDefinition details, MethodBase info, AParametersCollection parameters, Modifiers modifiers)
+                       : base (kind, details, info.Name, modifiers)
                {
                        this.MetaInfo = info;
                        this.parameters = parameters;
@@ -190,12 +190,12 @@ namespace Mono.CSharp {
                        // TODO: Does not work on .NET
                        var par = TypeManager.GetParameterData (mb);
 
-                       return new MethodSpec (definition, mb, par, modifiers);
+                       return new MethodSpec (Kind, definition, mb, par, Modifiers);
                }
 
                public bool IsAbstract {
                        get {
-                               return (modifiers & Modifiers.ABSTRACT) != 0;
+                               return (Modifiers & Modifiers.ABSTRACT) != 0;
                        }
                }
 
@@ -214,7 +214,7 @@ namespace Mono.CSharp {
                // When is virtual or abstract
                public bool IsVirtual {
                        get {
-                               return (modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT)) != 0;
+                               return (Modifiers & (Modifiers.VIRTUAL | Modifiers.ABSTRACT | Modifiers.OVERRIDE)) != 0;
                        }
                }
 
@@ -338,6 +338,14 @@ namespace Mono.CSharp {
                                ModFlags |= Modifiers.DEBUGGER_HIDDEN;
                        }
 
+                       MemberKind kind;
+                       if (this is Operator)
+                               kind = MemberKind.Operator;
+                       else if (this is Destructor)
+                               kind = MemberKind.Destructor;
+                       else
+                               kind = MemberKind.Method;
+
                        if (IsPartialDefinition) {
                                caching_flags &= ~Flags.Excluded_Undetected;
                                caching_flags |= Flags.Excluded;
@@ -345,10 +353,10 @@ namespace Mono.CSharp {
                                // Add to member cache only when a partial method implementation has not been found yet
                                if ((caching_flags & Flags.PartialDefinitionExists) == 0) {
                                        MethodBase mb = new PartialMethodDefinitionInfo (this);
-                                       Parent.MemberCache.AddMember (mb, this);
-                                       TypeManager.AddMethod (mb, this);
 
-                                       spec = new MethodSpec (this, mb, Parameters, ModFlags);
+                                       spec = new MethodSpec (kind, this, mb, Parameters, ModFlags);
+                                       Parent.MemberCache.AddMember (mb, spec);
+                                       TypeManager.AddMethod (mb, this);
                                }
 
                                return true;
@@ -362,12 +370,12 @@ namespace Mono.CSharp {
                                        
                        MethodBuilder = MethodData.MethodBuilder;
 
-                       spec = new MethodSpec (this, MethodBuilder, Parameters, ModFlags);
+                       spec = new MethodSpec (kind, this, MethodBuilder, Parameters, ModFlags);
 
                        if (TypeManager.IsGenericMethod (MethodBuilder))
                                Parent.MemberCache.AddGenericMember (MethodBuilder, this);
                        
-                       Parent.MemberCache.AddMember (MethodBuilder, this);
+                       Parent.MemberCache.AddMember (MethodBuilder, spec);
 
                        return true;
                }
@@ -627,7 +635,7 @@ namespace Mono.CSharp {
                               FullNamedExpression return_type, Modifiers mod,
                               MemberName name, ParametersCompiled parameters, Attributes attrs)
                        : base (parent, generic, return_type, mod,
-                               parent.PartialContainer.Kind == Kind.Interface ? AllowedInterfaceModifiers : AllowedModifiers,
+                               parent.PartialContainer.Kind == MemberKind.Interface ? AllowedInterfaceModifiers : AllowedModifiers,
                                name, attrs, parameters)
                {
                }
@@ -1184,7 +1192,7 @@ namespace Mono.CSharp {
                                Parent.MemberCache.CheckExistingMembersOverloads (this, ConstructorInfo.ConstructorName,
                                        Parameters, Report);
 
-                       if (Parent.PartialContainer.Kind == Kind.Struct) {
+                       if (Parent.PartialContainer.Kind == MemberKind.Struct) {
                                if (Parameters.Count == 0) {
                                        Report.Error (568, Location, 
                                                "Structs cannot contain explicit parameterless constructors");
@@ -1237,7 +1245,7 @@ namespace Mono.CSharp {
                                ca, CallingConventions,
                                Parameters.GetEmitTypes ());
 
-                       spec = new MethodSpec (this, ConstructorBuilder, Parameters, ModFlags);
+                       spec = new MethodSpec (MemberKind.Constructor, this, ConstructorBuilder, Parameters, ModFlags);
 
                        if (Parent.PartialContainer.IsComImport) {
                                if (!IsDefault ()) {
@@ -1247,7 +1255,7 @@ namespace Mono.CSharp {
                                ConstructorBuilder.SetImplementationFlags (MethodImplAttributes.InternalCall);
                        }
                        
-                       Parent.MemberCache.AddMember (ConstructorBuilder, this);
+                       Parent.MemberCache.AddMember (ConstructorBuilder, spec);
                        TypeManager.AddMethod (ConstructorBuilder, this);
                        
                        // It's here only to report an error
@@ -1288,12 +1296,12 @@ namespace Mono.CSharp {
                        if (block != null) {
                                // If this is a non-static `struct' constructor and doesn't have any
                                // initializer, it must initialize all of the struct's fields.
-                               if ((Parent.PartialContainer.Kind == Kind.Struct) &&
+                               if ((Parent.PartialContainer.Kind == MemberKind.Struct) &&
                                        ((ModFlags & Modifiers.STATIC) == 0) && (Initializer == null))
                                        block.AddThisVariable (Parent, Location);
 
                                if (block != null && (ModFlags & Modifiers.STATIC) == 0){
-                                       if (Parent.PartialContainer.Kind == Kind.Class && Initializer == null)
+                                       if (Parent.PartialContainer.Kind == MemberKind.Class && Initializer == null)
                                                Initializer = new GeneratedBaseInitializer (Location);
 
                                        if (Initializer != null) {
@@ -1734,7 +1742,7 @@ namespace Mono.CSharp {
                                new MemberName (MetadataName, l), attrs, parameters)
                {
                        ModFlags &= ~Modifiers.PRIVATE;
-                       ModFlags |= Modifiers.PROTECTED;
+                       ModFlags |= Modifiers.PROTECTED | Modifiers.OVERRIDE;
                }
 
                public override void ApplyAttributeBuilder (Attribute a, CustomAttributeBuilder cb, PredefinedAttributes pa)
@@ -1749,8 +1757,6 @@ namespace Mono.CSharp {
 
                protected override bool CheckBase ()
                {
-                       flags |= MethodAttributes.Virtual;
-
                        if (!base.CheckBase ())
                                return false;
 
@@ -2014,8 +2020,7 @@ namespace Mono.CSharp {
                        return true;
                }
 
-               public override bool IsUsed
-               {
+               public override bool IsUsed {
                        get {
                                if (IsDummy)
                                        return false;
@@ -2024,6 +2029,8 @@ namespace Mono.CSharp {
                        }
                }
 
+               public MethodSpec Spec { get; protected set; }
+
                //
                //   Represents header string for documentation comment.
                //
@@ -2317,6 +2324,16 @@ namespace Mono.CSharp {
                        return null;
                }
 
+               public static OpType? GetType (string metadata_name)
+               {
+                       for (int i = 0; i < names.Length; ++i) {
+                               if (names[i][1] == metadata_name)
+                                       return (OpType) i;
+                       }
+
+                       return null;
+               }
+
                public OpType GetMatchingOperator ()
                {
                        switch (OperatorType) {