Merge pull request #1624 from esdrubal/getprocesstimes
[mono.git] / mcs / mcs / class.cs
index e4639535cce6643a8999f56cf14331f8377a1678..eaa12fa0ebeb5e3ef6cd1632e9d23c532f5446c4 100644 (file)
@@ -44,7 +44,6 @@ namespace Mono.CSharp
        public abstract class TypeContainer : MemberCore
        {
                public readonly MemberKind Kind;
-               public readonly string Basename;
 
                protected List<TypeContainer> containers;
 
@@ -62,9 +61,6 @@ namespace Mono.CSharp
                        : base (parent, name, attrs)
                {
                        this.Kind = kind;
-                       if (name != null)
-                               this.Basename = name.Basename;
-
                        defined_names = new Dictionary<string, MemberCore> ();
                }
 
@@ -111,7 +107,7 @@ namespace Mono.CSharp
                public virtual void AddPartial (TypeDefinition next_part)
                {
                        MemberCore mc;
-                       (PartialContainer ?? this).defined_names.TryGetValue (next_part.Basename, out mc);
+                       (PartialContainer ?? this).defined_names.TryGetValue (next_part.MemberName.Basename, out mc);
 
                        AddPartial (next_part, mc as TypeDefinition);
                }
@@ -363,12 +359,8 @@ namespace Mono.CSharp
                        return MemberName.GetSignatureForError ();
                }
 
-               public string GetSignatureForMetadata ()
+               public virtual string GetSignatureForMetadata ()
                {
-                       if (Parent is TypeDefinition) {
-                               return Parent.GetSignatureForMetadata () + "+" + TypeNameParser.Escape (MemberName.Basename);
-                       }
-
                        var sb = new StringBuilder ();
                        CreateMetadataName (sb);
                        return sb.ToString ();
@@ -380,7 +372,7 @@ namespace Mono.CSharp
                                containers.Remove (cont);
 
                        var tc = Parent == Module ? Module : this;
-                       tc.defined_names.Remove (cont.Basename);
+                       tc.defined_names.Remove (cont.MemberName.Basename);
                }
 
                public virtual void VerifyMembers ()
@@ -456,7 +448,7 @@ namespace Mono.CSharp
                                return tc.GetSignatureForError ();
                        }
 
-                       public ExtensionMethodCandidates LookupExtensionMethod (TypeSpec extensionType, string name, int arity)
+                       public ExtensionMethodCandidates LookupExtensionMethod (string name, int arity)
                        {
                                return null;
                        }
@@ -772,7 +764,7 @@ namespace Mono.CSharp
 
                public override void AddTypeContainer (TypeContainer tc)
                {
-                       AddNameToContainer (tc, tc.Basename);
+                       AddNameToContainer (tc, tc.MemberName.Basename);
 
                        base.AddTypeContainer (tc);
                }
@@ -967,7 +959,7 @@ namespace Mono.CSharp
                        }
                }
 
-               public virtual void RegisterFieldForInitialization (MemberCore field, FieldInitializer expression)
+               public void RegisterFieldForInitialization (MemberCore field, FieldInitializer expression)
                {
                        if (IsPartialPart)
                                PartialContainer.RegisterFieldForInitialization (field, expression);
@@ -980,6 +972,13 @@ namespace Mono.CSharp
 
                                initialized_static_fields.Add (expression);
                        } else {
+                               if (Kind == MemberKind.Struct) {
+                                       if (Compiler.Settings.Version != LanguageVersion.Experimental) {
+                                               Report.Error (573, expression.Location, "'{0}': Structs cannot have instance property or field initializers",
+                                                       GetSignatureForError ());
+                                       }
+                               }
+
                                if (initialized_fields == null)
                                        initialized_fields = new List<FieldInitializer> (4);
 
@@ -1050,7 +1049,7 @@ namespace Mono.CSharp
                                //
                                // Field is re-initialized to its default value => removed
                                //
-                               if (fi.IsDefaultInitializer && ec.Module.Compiler.Settings.Optimize)
+                               if (fi.IsDefaultInitializer && Kind != MemberKind.Struct && ec.Module.Compiler.Settings.Optimize)
                                        continue;
 
                                ec.AssignmentInfoOffset += fi.AssignmentOffset;
@@ -1123,6 +1122,15 @@ namespace Mono.CSharp
                        }
                }
 
+               public override string GetSignatureForMetadata ()
+               {
+                       if (Parent is TypeDefinition) {
+                               return Parent.GetSignatureForMetadata () + "+" + TypeNameParser.Escape (FilterNestedName (MemberName.Basename));
+                       }
+
+                       return base.GetSignatureForMetadata ();
+               }
+
                public virtual void SetBaseTypes (List<FullNamedExpression> baseTypes)
                {
                        type_bases = baseTypes;
@@ -1295,7 +1303,7 @@ namespace Mono.CSharp
                                CreateMetadataName (sb);
                                TypeBuilder = Module.CreateBuilder (sb.ToString (), TypeAttr, type_size);
                        } else {
-                               TypeBuilder = parent_def.TypeBuilder.DefineNestedType (Basename, TypeAttr, null, type_size);
+                               TypeBuilder = parent_def.TypeBuilder.DefineNestedType (FilterNestedName (MemberName.Basename), TypeAttr, null, type_size);
                        }
 
                        if (DeclaringAssembly.Importer != null)
@@ -1325,6 +1333,18 @@ namespace Mono.CSharp
                        return true;
                }
 
+               public static string FilterNestedName (string name)
+               {
+                       //
+                       // SRE API does not handle namespaces and types separately but
+                       // determine that from '.' in name. That's problematic because 
+                       // dot is valid character for type name. By replacing any '.'
+                       // in name we avoid any ambiguities and never emit metadata
+                       // namespace for nested types
+                       //
+                       return name.Replace ('.', '_');
+               }
+
                string[] CreateTypeParameters (TypeParameters parentAllTypeParameters)
                {
                        string[] names;
@@ -1373,7 +1393,7 @@ namespace Mono.CSharp
 
                public SourceMethodBuilder CreateMethodSymbolEntry ()
                {
-                       if (Module.DeclaringAssembly.SymbolWriter == null)
+                       if (Module.DeclaringAssembly.SymbolWriter == null || (ModFlags & Modifiers.DEBUGGER_HIDDEN) != 0)
                                return null;
 
                        var source_file = GetCompilationSourceFile ();
@@ -1608,8 +1628,12 @@ namespace Mono.CSharp
                        // defined after current container
                        //
                        if (class_partial_parts != null) {
-                               foreach (var pp in class_partial_parts)
+                               foreach (var pp in class_partial_parts) {
+                                       if (pp.PrimaryConstructorBaseArguments != null)
+                                               PrimaryConstructorBaseArguments = pp.PrimaryConstructorBaseArguments;
+
                                        pp.DoDefineBaseType ();
+                               }
 
                        }
 
@@ -1706,21 +1730,14 @@ namespace Mono.CSharp
 
                        foreach (var member in members) {
                                var pbm = member as PropertyBasedMember;
-                               if (pbm != null)
+                               if (pbm != null) {
                                        pbm.PrepareEmit ();
+                                       continue;
+                               }
 
-                               var pm = member as IParametersMember;
-                               if (pm != null) {
-                                       var mc = member as MethodOrOperator;
-                                       if (mc != null) {
-                                               mc.PrepareEmit ();
-                                       }
-
-                                       var p = pm.Parameters;
-                                       if (p.IsEmpty)
-                                               continue;
-
-                                       ((ParametersCompiled) p).ResolveDefaultValues (member);
+                               var mc = member as MethodCore;
+                               if (mc != null) {
+                                       mc.PrepareEmit ();
                                        continue;
                                }
 
@@ -1785,13 +1802,17 @@ namespace Mono.CSharp
 
                        this.spec = spec;
                        current_type = null;
+                       if (class_partial_parts != null) {
+                               foreach (var part in class_partial_parts)
+                                       part.spec = spec;
+                       }
                }
 
                public override void RemoveContainer (TypeContainer cont)
                {
                        base.RemoveContainer (cont);
                        Members.Remove (cont);
-                       Cache.Remove (cont.Basename);
+                       Cache.Remove (cont.MemberName.Basename);
                }
 
                protected virtual bool DoResolveTypeParameters ()
@@ -2660,12 +2681,14 @@ namespace Mono.CSharp
                        if (Kind == MemberKind.Class)
                                c.Initializer = new GeneratedBaseInitializer (Location, PrimaryConstructorBaseArguments);
 
-                       if (PrimaryConstructorParameters != null && !is_static)
+                       if (PrimaryConstructorParameters != null && !is_static) {
                                c.IsPrimaryConstructor = true;
+                               c.caching_flags |= Flags.MethodOverloadsExist;
+                       }
                        
                        AddConstructor (c, true);
                        if (PrimaryConstructorBlock == null) {
-                               c.Block = new ToplevelBlock (Compiler, c.ParameterInfo, Location) {
+                               c.Block = new ToplevelBlock (Compiler, parameters, Location) {
                                        IsCompilerGenerated = true
                                };
                        } else {
@@ -2680,6 +2703,7 @@ namespace Mono.CSharp
                        CheckProtectedModifier ();
 
                        if (PrimaryConstructorParameters != null) {
+
                                foreach (Parameter p in PrimaryConstructorParameters.FixedParameters) {
                                        if (p.Name == MemberName.Name) {
                                                Report.Error (8039, p.Location, "Primary constructor of type `{0}' has parameter of same name as containing type",
@@ -3003,7 +3027,7 @@ namespace Mono.CSharp
                                        if (ff == null)
                                                continue;
 
-                                       ff.CharSet = (CharSet) System.Enum.Parse (typeof (CharSet), value.GetValue ().ToString ());
+                                       ff.CharSetValue = (CharSet) System.Enum.Parse (typeof (CharSet), value.GetValue ().ToString ());
                                }
                        }
                }
@@ -3064,10 +3088,14 @@ namespace Mono.CSharp
 
                protected override bool DoDefineMembers ()
                {
-                       if (PrimaryConstructorParameters != null)
+                       var res = base.DoDefineMembers ();
+
+                       if (PrimaryConstructorParameters != null || (initialized_fields != null && !HasUserDefaultConstructor ())) {
                                generated_primary_constructor = DefineDefaultConstructor (false);
+                               generated_primary_constructor.Define ();
+                       }
 
-                       return base.DoDefineMembers ();
+                       return res;
                }
 
                public override void Emit ()
@@ -3077,14 +3105,14 @@ namespace Mono.CSharp
                        base.Emit ();
                }
 
-               bool HasExplicitConstructor ()
+               bool HasUserDefaultConstructor ()
                {
-                       foreach (var m in Members) {
+                       foreach (var m in PartialContainer.Members) {
                                var c = m as Constructor;
                                if (c == null)
                                        continue;
 
-                               if (!c.ParameterInfo.IsEmpty)
+                               if (!c.IsStatic && c.ParameterInfo.IsEmpty)
                                        return true;
                        }
 
@@ -3143,18 +3171,6 @@ namespace Mono.CSharp
                        base_type = Compiler.BuiltinTypes.ValueType;
                        return ifaces;
                }
-
-               public override void RegisterFieldForInitialization (MemberCore field, FieldInitializer expression)
-               {
-                       if ((field.ModFlags & Modifiers.STATIC) == 0 && !HasExplicitConstructor ()) {
-                               Report.Error (8054, field.Location, "`{0}': Structs without explicit constructors cannot contain members with initializers",
-                                       field.GetSignatureForError ());
-
-                               return;
-                       }
-
-                       base.RegisterFieldForInitialization (field, expression);
-               }
        }
 
        /// <summary>
@@ -3411,7 +3427,7 @@ namespace Mono.CSharp
                                        ModFlags |= Modifiers.NEW;
                                        if (!IsCompilerGenerated) {
                                                Report.SymbolRelatedToPreviousError (base_member);
-                                               if (!IsInterface && (base_member.Modifiers & (Modifiers.ABSTRACT | Modifiers.VIRTUAL | Modifiers.OVERRIDE)) != 0) {
+                                               if ((base_member.Kind & MemberKind.NestedMask) == 0 && !IsInterface && (base_member.Modifiers & (Modifiers.ABSTRACT | Modifiers.VIRTUAL | Modifiers.OVERRIDE)) != 0) {
                                                        Report.Warning (114, 2, Location, "`{0}' hides inherited member `{1}'. To make the current member override that implementation, add the override keyword. Otherwise add the new keyword",
                                                                GetSignatureForError (), base_member.GetSignatureForError ());
                                                } else {
@@ -3422,9 +3438,16 @@ namespace Mono.CSharp
                                }
 
                                if (!IsInterface && base_member.IsAbstract && !overrides && !IsStatic) {
-                                       Report.SymbolRelatedToPreviousError (base_member);
-                                       Report.Error (533, Location, "`{0}' hides inherited abstract member `{1}'",
-                                               GetSignatureForError (), base_member.GetSignatureForError ());
+                                       switch (base_member.Kind) {
+                                       case MemberKind.Event:
+                                       case MemberKind.Indexer:
+                                       case MemberKind.Method:
+                                       case MemberKind.Property:
+                                               Report.SymbolRelatedToPreviousError (base_member);
+                                               Report.Error (533, Location, "`{0}' hides inherited abstract member `{1}'",
+                                                       GetSignatureForError (), base_member.GetSignatureForError ());
+                                               break;
+                                       }
                                }
                        }
 
@@ -3700,7 +3723,7 @@ namespace Mono.CSharp
                public override string GetSignatureForDocumentation ()
                {
                        if (IsExplicitImpl)
-                               return Parent.GetSignatureForDocumentation () + "." + InterfaceType.GetExplicitNameSignatureForDocumentation () + "#" + ShortName;
+                               return Parent.GetSignatureForDocumentation () + "." + InterfaceType.GetSignatureForDocumentation (true) + "#" + ShortName;
 
                        return Parent.GetSignatureForDocumentation () + "." + ShortName;
                }