2009-02-18 Marek Safar <marek.safar@gmail.com>
[mono.git] / mcs / mcs / pending.cs
index 5bb4d01fadb175118e06ebbe2b2068beda925694..bdb10bc2ac1dffc7ce9df64750af1227f28aef3c 100644 (file)
@@ -359,7 +359,7 @@ namespace Mono.CSharp {
                                return null;
 
                        Type ret_type = method.method.ReturnType;
-                       Parameters args = method.method.ParameterInfo;
+                       ParametersCompiled args = method.method.ParameterInfo;
                        int arg_len = args.Count;
                        bool is_indexer = method.method is Indexer.SetIndexerMethod || method.method is Indexer.GetIndexerMethod;
 
@@ -472,23 +472,32 @@ namespace Mono.CSharp {
                void DefineProxy (Type iface, MethodInfo base_method, MethodInfo iface_method,
                                  AParametersCollection param)
                {
-                       MethodBuilder proxy;
+                       // TODO: Handle nested iface names
+                       string proxy_name = SimpleName.RemoveGenericArity (iface.FullName) + "." + iface_method.Name;
 
-                       string proxy_name = SimpleName.RemoveGenericArity (iface.Name) + '.' + iface_method.Name;
-
-                       proxy = container.TypeBuilder.DefineMethod (
+                       MethodBuilder proxy = container.TypeBuilder.DefineMethod (
                                proxy_name,
                                MethodAttributes.HideBySig |
                                MethodAttributes.NewSlot |
+                               MethodAttributes.CheckAccessOnOverride |
                                MethodAttributes.Virtual,
                                CallingConventions.Standard | CallingConventions.HasThis,
                                base_method.ReturnType, param.GetEmitTypes ());
 
-                       AParametersCollection pd = TypeManager.GetParameterData (iface_method);
-                       proxy.DefineParameter (0, ParameterAttributes.None, "");
-                       for (int i = 0; i < pd.Count; i++) {
-                               string name = pd.FixedParameters [i].Name;
-                               ParameterAttributes attr = Parameters.GetParameterAttribute (pd.FixedParameters [i].ModFlags);
+#if GMCS_SOURCE
+                       Type[] gargs = iface_method.GetGenericArguments ();
+                       if (gargs.Length > 0) {
+                               string[] gnames = new string[gargs.Length];
+                               for (int i = 0; i < gargs.Length; ++i)
+                                       gnames[i] = gargs[i].Name;
+
+                               proxy.DefineGenericParameters (gnames);
+                       }
+#endif
+
+                       for (int i = 0; i < param.Count; i++) {
+                               string name = param.FixedParameters [i].Name;
+                               ParameterAttributes attr = ParametersCompiled.GetParameterAttribute (param.FixedParameters [i].ModFlags);
                                proxy.DefineParameter (i + 1, attr, name);
                        }
 
@@ -600,7 +609,7 @@ namespace Mono.CSharp {
                                                        } else if (!candidate.IsPublic) {
                                                                Report.Error (737, container.Location,
                                                                        "`{0}' does not implement interface member `{1}' and the best implementing candidate `{2}' in not public",
-                                                                       container.GetSignatureForError (), TypeManager.CSharpSignature (mi, true), TypeManager.CSharpSignature (candidate));
+                                                                       container.GetSignatureForError (), TypeManager.CSharpSignature (mi, true), TypeManager.CSharpSignature (candidate, true));
                                                        } else {
                                                                Report.Error (738, container.Location,
                                                                        "`{0}' does not implement interface member `{1}' and the best implementing candidate `{2}' return type `{3}' does not match interface member return type `{4}'",