Merge pull request #1185 from esdrubal/http-reuse
[mono.git] / mcs / mcs / field.cs
index 95c561980abe079514c970b633f938c634e139f8..3531af044f3bc39543000501a647a96f409e8b7a 100644 (file)
@@ -223,7 +223,9 @@ namespace Mono.CSharp
                        if (MemberType.IsStatic)
                                Error_VariableOfStaticClass (Location, GetSignatureForError (), MemberType, Report);
 
-                       CheckBase ();
+                       if (!IsCompilerGenerated)
+                               CheckBase ();
+
                        IsTypePermitted ();
                }
 
@@ -358,9 +360,9 @@ namespace Mono.CSharp
                        return fs;
                }
 
-               public override List<TypeSpec> ResolveMissingDependencies ()
+               public override List<MissingTypeSpecReference> ResolveMissingDependencies (MemberSpec caller)
                {
-                       return memberType.ResolveMissingDependencies ();
+                       return memberType.ResolveMissingDependencies (this);
                }
        }
 
@@ -370,7 +372,7 @@ namespace Mono.CSharp
        public class FixedField : FieldBase
        {
                public const string FixedElementName = "FixedElementField";
-               static int GlobalCounter = 0;
+               static int GlobalCounter;
 
                TypeBuilder fixed_buffer_type;
 
@@ -400,7 +402,7 @@ namespace Mono.CSharp
 
                public override Constant ConvertInitializer (ResolveContext rc, Constant expr)
                {
-                       return expr.ImplicitConversionRequired (rc, rc.BuiltinTypes.Int, Location);
+                       return expr.ImplicitConversionRequired (rc, rc.BuiltinTypes.Int);
                }
 
                public override bool Define ()
@@ -603,9 +605,23 @@ namespace Mono.CSharp
                        if (TypeSpec.IsReferenceType (MemberType))
                                return true;
 
-                       if (MemberType.IsEnum)
+                       if (MemberType.IsPointer)
                                return true;
 
+                       if (MemberType.IsEnum) {
+                               switch (EnumSpec.GetUnderlyingType (MemberType).BuiltinType) {
+                               case BuiltinTypeSpec.Type.SByte:
+                               case BuiltinTypeSpec.Type.Byte:
+                               case BuiltinTypeSpec.Type.Short:
+                               case BuiltinTypeSpec.Type.UShort:
+                               case BuiltinTypeSpec.Type.Int:
+                               case BuiltinTypeSpec.Type.UInt:
+                                       return true;
+                               default:
+                                       return false;
+                               }
+                       }
+
                        return false;
                }
 
@@ -689,4 +705,39 @@ namespace Mono.CSharp
                        return true;
                }
        }
+
+       class PrimaryConstructorField : Field
+       {
+               //
+               // Proxy resolved parameter type expression to avoid type double resolve
+               // and problems with correct resolve context on partial classes
+               //
+               sealed class TypeExpressionFromParameter : TypeExpr
+               {
+                       Parameter parameter;
+
+                       public TypeExpressionFromParameter (Parameter parameter)
+                       {
+                               this.parameter = parameter;
+                               eclass = ExprClass.Type;
+                               loc = parameter.Location;
+                       }
+
+                       public override TypeSpec ResolveAsType (IMemberContext mc, bool allowUnboundTypeArguments)
+                       {
+                               return parameter.Type;
+                       }
+               }
+
+               public PrimaryConstructorField (TypeDefinition parent, Parameter parameter)
+                       : base (parent, new TypeExpressionFromParameter (parameter), Modifiers.PRIVATE, new MemberName (parameter.Name, parameter.Location), null)
+               {
+                       caching_flags |= Flags.IsUsed | Flags.IsAssigned;
+               }
+
+               public override string GetSignatureForError ()
+               {
+                       return MemberName.Name;
+               }
+       }
 }