[eglib] make g_mkdir_with_parents work for paths not ending in /
[mono.git] / mcs / mcs / property.cs
index c6170e5890a70e12b0ffae6311ab1c5db982ae29..641177464e194eb391967e17f848ff3528d8673e 100644 (file)
@@ -197,7 +197,7 @@ namespace Mono.CSharp
 
                public class GetMethod : PropertyMethod
                {
-                       static string[] attribute_targets = new string [] { "method", "return" };
+                       static readonly string[] attribute_targets = new string [] { "method", "return" };
 
                        internal const string Prefix = "get_";
 
@@ -243,7 +243,7 @@ namespace Mono.CSharp
 
                public class SetMethod : PropertyMethod {
 
-                       static string[] attribute_targets = new string [] { "method", "param", "return" };
+                       static readonly string[] attribute_targets = new string[] { "method", "param", "return" };
 
                        internal const string Prefix = "set_";
 
@@ -291,7 +291,7 @@ namespace Mono.CSharp
 
                        public override TypeSpec ReturnType {
                                get {
-                                       return Parent.Compiler.BuildinTypes.Void;
+                                       return Parent.Compiler.BuiltinTypes.Void;
                                }
                        }
 
@@ -302,11 +302,11 @@ namespace Mono.CSharp
                        }
                }
 
-               static string[] attribute_targets = new string [] { "property" };
+               static readonly string[] attribute_targets = new string[] { "property" };
 
                public abstract class PropertyMethod : AbstractPropertyEventMethod
                {
-                       public const Modifiers AllowedModifiers =
+                       const Modifiers AllowedModifiers =
                                Modifiers.PUBLIC |
                                Modifiers.PROTECTED |
                                Modifiers.INTERNAL |
@@ -319,7 +319,8 @@ namespace Mono.CSharp
                                : base (method, prefix, attrs, loc)
                        {
                                this.method = method;
-                               this.ModFlags = modifiers | (method.ModFlags & (Modifiers.STATIC | Modifiers.UNSAFE));
+                               this.ModFlags = ModifiersExtensions.Check (AllowedModifiers, modifiers, 0, loc, Report);
+                               this.ModFlags |= (method.ModFlags & (Modifiers.STATIC | Modifiers.UNSAFE));
                        }
 
                        public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, PredefinedAttributes pa)
@@ -356,8 +357,7 @@ namespace Mono.CSharp
                                        if (container.Kind == MemberKind.Interface)
                                                Report.Error (275, Location, "`{0}': accessibility modifiers may not be used on accessors in an interface",
                                                        GetSignatureForError ());
-
-                                       if ((method.ModFlags & Modifiers.ABSTRACT) != 0 && (ModFlags & Modifiers.PRIVATE) != 0) {
+                                       else if ((method.ModFlags & Modifiers.ABSTRACT) != 0 && (ModFlags & Modifiers.PRIVATE) != 0) {
                                                Report.Error (442, Location, "`{0}': abstract properties cannot have private accessors", GetSignatureForError ());
                                        }
 
@@ -438,6 +438,15 @@ namespace Mono.CSharp
                        }
                }
 
+               public override Variance ExpectedMemberTypeVariance {
+                       get {
+                               return (get != null && set != null) ?
+                                       Variance.None : set == null ?
+                                       Variance.Covariant :
+                                       Variance.Contravariant;
+                       }
+               }
+
                public PropertyMethod Get {
                        get {
                                return get;
@@ -653,12 +662,14 @@ namespace Mono.CSharp
                        if (OptAttributes != null)
                                OptAttributes.Emit ();
 
-                       if (member_type.BuildinType == BuildinTypeSpec.Type.Dynamic) {
+                       if (member_type.BuiltinType == BuiltinTypeSpec.Type.Dynamic) {
                                Module.PredefinedAttributes.Dynamic.EmitAttribute (PropertyBuilder);
                        } else if (member_type.HasDynamicElement) {
                                Module.PredefinedAttributes.Dynamic.EmitAttribute (PropertyBuilder, member_type, Location);
                        }
 
+                       ConstraintChecker.Check (this, member_type, type_expr.Location);
+
                        first.Emit (Parent);
                        if (AccessorSecond != null)
                                AccessorSecond.Emit (Parent);
@@ -791,11 +802,6 @@ namespace Mono.CSharp
 
                        base.Emit ();
                }
-
-               public override string GetDocCommentName (DeclSpace ds)
-               {
-                       return String.Concat (DocCommentHeader, ds.Name, ".", GetFullName (ShortName).Replace ('.', '#'));
-               }
        }
 
        /// <summary>
@@ -1087,7 +1093,7 @@ namespace Mono.CSharp
                public abstract class AEventAccessor : AbstractPropertyEventMethod
                {
                        protected readonly Event method;
-                       ParametersCompiled parameters;
+                       readonly ParametersCompiled parameters;
 
                        static readonly string[] attribute_targets = new string [] { "method", "param", "return" };
 
@@ -1138,7 +1144,10 @@ namespace Mono.CSharp
 
                        public virtual MethodBuilder Define (DeclSpace parent)
                        {
-                               parameters.Resolve (this);
+                               // Fill in already resolved event type to speed things up and
+                               // avoid confusing duplicate errors
+                               ((Parameter) parameters.FixedParameters[0]).Type = method.member_type;
+                               parameters.Types = new TypeSpec[] { method.member_type };
 
                                method_data = new MethodData (method, method.ModFlags,
                                        method.flags | MethodAttributes.HideBySig | MethodAttributes.SpecialName, this);
@@ -1156,7 +1165,7 @@ namespace Mono.CSharp
 
                        public override TypeSpec ReturnType {
                                get {
-                                       return Parent.Compiler.BuildinTypes.Void;
+                                       return Parent.Compiler.BuiltinTypes.Void;
                                }
                        }
 
@@ -1209,6 +1218,12 @@ namespace Mono.CSharp
                        }
                }
 
+               public override Variance ExpectedMemberTypeVariance {
+                       get {
+                               return Variance.Contravariant;
+                       }
+               }
+
                public AEventAccessor Remove {
                        get {
                                return this.remove;
@@ -1287,6 +1302,8 @@ namespace Mono.CSharp
                                OptAttributes.Emit ();
                        }
 
+                       ConstraintChecker.Check (this, member_type, type_expr.Location);
+
                        Add.Emit (Parent);
                        Remove.Emit (Parent);
 
@@ -1456,6 +1473,22 @@ namespace Mono.CSharp
                        this.parameters = parameters;
                }
 
+               #region Properties
+
+               AParametersCollection IParametersMember.Parameters {
+                       get {
+                               return parameters;
+                       }
+               }
+
+               public ParametersCompiled ParameterInfo {
+                       get {
+                               return parameters;
+                       }
+               }
+
+               #endregion
+
                public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, PredefinedAttributes pa)
                {
                        if (a.Type == pa.IndexerName) {
@@ -1534,34 +1567,29 @@ namespace Mono.CSharp
                        return base.EnableOverloadChecks (overload);
                }
 
-               public override string GetDocCommentName (DeclSpace ds)
+               public override void Emit ()
                {
-                       return DocUtil.GetMethodDocCommentName (this, parameters, ds);
+                       parameters.CheckConstraints (this);
+
+                       base.Emit ();
                }
 
                public override string GetSignatureForError ()
                {
                        StringBuilder sb = new StringBuilder (Parent.GetSignatureForError ());
                        if (MemberName.Left != null) {
-                               sb.Append ('.');
+                               sb.Append (".");
                                sb.Append (MemberName.Left.GetSignatureForError ());
                        }
 
                        sb.Append (".this");
-                       sb.Append (parameters.GetSignatureForError ().Replace ('(', '[').Replace (')', ']'));
+                       sb.Append (parameters.GetSignatureForError ("[", "]", parameters.Count));
                        return sb.ToString ();
                }
 
-               public AParametersCollection Parameters {
-                       get {
-                               return parameters;
-                       }
-               }
-
-               public ParametersCompiled ParameterInfo {
-                       get {
-                               return parameters;
-                       }
+               public override string GetSignatureForDocumentation ()
+               {
+                       return base.GetSignatureForDocumentation () + parameters.GetSignatureForDocumentation ();
                }
 
                protected override bool VerifyClsCompliance ()
@@ -1592,6 +1620,11 @@ namespace Mono.CSharp
                }
                #endregion
 
+               public override string GetSignatureForDocumentation ()
+               {
+                       return base.GetSignatureForDocumentation () + parameters.GetSignatureForDocumentation ();
+               }
+
                public override string GetSignatureForError ()
                {
                        return DeclaringType.GetSignatureForError () + ".this" + parameters.GetSignatureForError ("[", "]", parameters.Count);