Handle type hidding via local variables and parameters. Fixes #8383
[mono.git] / mcs / mcs / property.cs
index f4c668b88f88310c0a1d188d091dc78ae5f2b74c..325b8f118f4bab61e4995812fa54f66a22821e3f 100644 (file)
@@ -362,8 +362,13 @@ namespace Mono.CSharp
                                CheckAbstractAndExtern (block != null);
                                CheckProtectedModifier ();
 
-                               if (block != null && block.IsIterator)
-                                       Iterator.CreateIterator (this, Parent.PartialContainer, ModFlags);
+                               if (block != null) {
+                                       if (block.IsIterator)
+                                               Iterator.CreateIterator (this, Parent.PartialContainer, ModFlags);
+
+                                       if (Compiler.Settings.WriteMetadataOnly)
+                                               block = null;
+                               }
 
                                return null;
                        }
@@ -906,7 +911,7 @@ namespace Mono.CSharp
 
                        public override void Emit (TypeDefinition parent)
                        {
-                               if ((method.ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) == 0) {
+                               if ((method.ModFlags & (Modifiers.ABSTRACT | Modifiers.EXTERN)) == 0 && !Compiler.Settings.WriteMetadataOnly) {
                                        block = new ToplevelBlock (Compiler, ParameterInfo, Location) {
                                                IsCompilerGenerated = true
                                        };
@@ -938,11 +943,10 @@ namespace Mono.CSharp
 
                                var cond = new BooleanExpression (new Binary (Binary.Operator.Inequality,
                                        new Cast (new TypeExpression (Module.Compiler.BuiltinTypes.Object, Location), new LocalVariableReference (obj1, Location), Location),
-                                       new Cast (new TypeExpression (Module.Compiler.BuiltinTypes.Object, Location), new LocalVariableReference (obj2, Location), Location),
-                                       Location));
+                                       new Cast (new TypeExpression (Module.Compiler.BuiltinTypes.Object, Location), new LocalVariableReference (obj2, Location), Location)));
 
                                var body = new ExplicitBlock (block, Location, Location);
-                               block.AddStatement (new Do (body, cond, Location));
+                               block.AddStatement (new Do (body, cond, Location, Location));
 
                                body.AddStatement (new StatementExpression (
                                        new SimpleAssign (new LocalVariableReference (obj2, Location), new LocalVariableReference (obj1, Location))));
@@ -1194,6 +1198,9 @@ namespace Mono.CSharp
                                if (!method_data.Define (parent.PartialContainer, method.GetFullName (MemberName)))
                                        return null;
 
+                               if (Compiler.Settings.WriteMetadataOnly)
+                                       block = null;
+
                                MethodBuilder mb = method_data.MethodBuilder;
 
                                Spec = new MethodSpec (MemberKind.Method, parent.PartialContainer.Definition, this, ReturnType, mb, ParameterInfo, method.ModFlags);
@@ -1440,7 +1447,14 @@ namespace Mono.CSharp
 
                        public override MethodBuilder Define (TypeContainer parent)
                        {
-                               parameters.Resolve (this);
+                               // Disable reporting, parameters are resolved twice
+                               Report.DisableReporting ();
+                               try {
+                                       parameters.Resolve (this);
+                               } finally {
+                                       Report.EnableReporting ();
+                               }
+
                                return base.Define (parent);
                        }