Merge pull request #5198 from BrzVlad/fix-binprot-stats
[mono.git] / mcs / mcs / method.cs
index c2b993564e2b354b066ca651e60f816da3707d00..ccd4898e91c7a5ef5169a3460c462ea429e8f38f 100644 (file)
@@ -558,10 +558,7 @@ namespace Mono.CSharp {
                public override void ApplyAttributeBuilder (Attribute a, MethodSpec ctor, byte[] cdata, PredefinedAttributes pa)
                {
                        if (a.Target == AttributeTargets.ReturnValue) {
-                               if (return_attributes == null)
-                                       return_attributes = new ReturnParameter (this, MethodBuilder, Location);
-
-                               return_attributes.ApplyAttributeBuilder (a, ctor, cdata, pa);
+                               CreateReturnBuilder ().ApplyAttributeBuilder (a, ctor, cdata, pa);
                                return;
                        }
 
@@ -624,6 +621,11 @@ namespace Mono.CSharp {
                        return new EmitContext (this, ig, MemberType, sourceMethod);
                }
 
+               ReturnParameter CreateReturnBuilder ()
+               {
+                       return return_attributes ?? (return_attributes = new ReturnParameter (this, MethodBuilder, Location));
+               }
+
                public override bool Define ()
                {
                        if (!base.Define ())
@@ -655,7 +657,7 @@ namespace Mono.CSharp {
 
                                explicit_name = null;
                        } else {
-                               MethodData = new MethodData (this, ModFlags, flags, this, base_method);
+                               MethodData = new MethodData (this, ModFlags, flags, this);
 
                                if (!MethodData.Define (Parent.PartialContainer, GetFullName (MemberName)))
                                        return false;
@@ -711,11 +713,13 @@ namespace Mono.CSharp {
                                Module.PredefinedAttributes.DebuggerStepThrough.EmitAttribute (MethodBuilder);
 
                        if (ReturnType.BuiltinType == BuiltinTypeSpec.Type.Dynamic) {
-                               return_attributes = new ReturnParameter (this, MethodBuilder, Location);
-                               Module.PredefinedAttributes.Dynamic.EmitAttribute (return_attributes.Builder);
+                               Module.PredefinedAttributes.Dynamic.EmitAttribute (CreateReturnBuilder ().Builder);
                        } else if (ReturnType.HasDynamicElement) {
-                               return_attributes = new ReturnParameter (this, MethodBuilder, Location);
-                               Module.PredefinedAttributes.Dynamic.EmitAttribute (return_attributes.Builder, ReturnType, Location);
+                               Module.PredefinedAttributes.Dynamic.EmitAttribute (CreateReturnBuilder ().Builder, ReturnType, Location);
+                       }
+
+                       if (ReturnType.HasNamedTupleElement) {
+                               Module.PredefinedAttributes.TupleElementNames.EmitAttribute (CreateReturnBuilder ().Builder, ReturnType, Location);
                        }
 
                        if (OptAttributes != null)
@@ -1947,7 +1951,6 @@ namespace Mono.CSharp {
                protected Modifiers modifiers;
                protected MethodAttributes flags;
                protected TypeSpec declaring_type;
-               protected MethodSpec parent_method;
                SourceMethodBuilder debug_builder;
                string full_name;
 
@@ -1980,15 +1983,6 @@ namespace Mono.CSharp {
                        this.method = method;
                }
 
-               public MethodData (InterfaceMemberBase member,
-                                  Modifiers modifiers, MethodAttributes flags, 
-                                  IMethodData method,
-                                  MethodSpec parent_method)
-                       : this (member, modifiers, flags, method)
-               {
-                       this.parent_method = parent_method;
-               }
-
                public bool Define (TypeDefinition container, string method_full_name)
                {
                        PendingImplementation pending = container.PendingImplementations;
@@ -2045,6 +2039,20 @@ namespace Mono.CSharp {
                                                                }
                                                        }
                                                }
+
+                                               if (!NamedTupleSpec.CheckOverrideName (member.MemberType, implementing.ReturnType)) {
+                                                       container.Compiler.Report.Error (8141, method.Location,
+                                                               "The tuple element names in the signature type of member `{0}' must match the tuple element names of interface member `{1}''",
+                                                               member.GetSignatureForError (), implementing.GetSignatureForError ());
+                                               }
+
+                                               var p_member = method as IParametersMember;
+                                               var p_implementing = implementing as IParametersMember;
+                                               if (p_member != null && p_implementing != null && !NamedTupleSpec.CheckOverrideName (p_member, p_implementing)) {
+                                                       container.Compiler.Report.Error (8141, method.Location,
+                                                               "The tuple element names in the signature type of member `{0}' must match the tuple element names of interface member `{1}''",
+                                                               member.GetSignatureForError (), implementing.GetSignatureForError ());
+                                               }
                                        }
                                }
                        } else {
@@ -2073,7 +2081,7 @@ namespace Mono.CSharp {
                                        }
                                } else {
                                        //
-                                       // Setting implementin to null inside this block will trigger a more
+                                       // Setting implementing to null inside this block will trigger a more
                                        // verbose error reporting for missing interface implementations
                                        //
                                        if (implementing.DeclaringType.IsInterface) {
@@ -2422,9 +2430,7 @@ namespace Mono.CSharp {
                        }
 
                        if (a.Target == AttributeTargets.ReturnValue) {
-                               if (return_attributes == null)
-                                       return_attributes = new ReturnParameter (this, method_data.MethodBuilder, Location);
-
+                               CreateReturnBuilder ();
                                return_attributes.ApplyAttributeBuilder (a, ctor, cdata, pa);
                                return;
                        }
@@ -2443,6 +2449,11 @@ namespace Mono.CSharp {
                        throw new NotSupportedException ();
                }
 
+               ReturnParameter CreateReturnBuilder ()
+               {
+                       return return_attributes ?? (return_attributes = new ReturnParameter (this, method_data.MethodBuilder, Location));
+               }
+
                public virtual void Emit (TypeDefinition parent)
                {
                        method_data.Emit (parent);
@@ -2453,11 +2464,13 @@ namespace Mono.CSharp {
                                Module.PredefinedAttributes.DebuggerHidden.EmitAttribute (method_data.MethodBuilder);
 
                        if (ReturnType.BuiltinType == BuiltinTypeSpec.Type.Dynamic) {
-                               return_attributes = new ReturnParameter (this, method_data.MethodBuilder, Location);
-                               Module.PredefinedAttributes.Dynamic.EmitAttribute (return_attributes.Builder);
+                               Module.PredefinedAttributes.Dynamic.EmitAttribute (CreateReturnBuilder ().Builder);
                        } else if (ReturnType.HasDynamicElement) {
-                               return_attributes = new ReturnParameter (this, method_data.MethodBuilder, Location);
-                               Module.PredefinedAttributes.Dynamic.EmitAttribute (return_attributes.Builder, ReturnType, Location);
+                               Module.PredefinedAttributes.Dynamic.EmitAttribute (CreateReturnBuilder ().Builder, ReturnType, Location);
+                       }
+
+                       if (ReturnType.HasNamedTupleElement) {
+                               Module.PredefinedAttributes.TupleElementNames.EmitAttribute (CreateReturnBuilder ().Builder, ReturnType, Location);
                        }
 
                        if (OptAttributes != null)