2010-05-19 Marek Safar <marek.safar@gmail.com>
authorMarek Safar <marek.safar@gmail.com>
Wed, 19 May 2010 10:44:47 +0000 (10:44 -0000)
committerMarek Safar <marek.safar@gmail.com>
Wed, 19 May 2010 10:44:47 +0000 (10:44 -0000)
A fix for bug #359733
* parameter.cs: Extension attribute can be defined in each assembly.

svn path=/trunk/mcs/; revision=157541

mcs/mcs/ChangeLog
mcs/mcs/parameter.cs

index 769c31cea8c49cc9ec714713440b298135b3efb5..b089021ec85bf65a0e9f7a68a0e5c8b3794b005c 100644 (file)
@@ -1,3 +1,8 @@
+2010-05-19  Marek Safar  <marek.safar@gmail.com>
+
+       A fix for bug #359733
+       * parameter.cs: Extension attribute can be defined in each assembly.
+
 2010-05-18  Marek Safar  <marek.safar@gmail.com>
 
        A fix for bug #446507
index b25bae9cae2c7fc74194537c282d522ea96ff5fc..8cc781a5e530a0919b284c111a72348b2a49d24b 100644 (file)
@@ -933,7 +933,7 @@ namespace Mono.CSharp {
                }
 
                //
-               // Imports SRE parameters
+               // Imports System.Reflection parameters
                //
                public static AParametersCollection Create (TypeSpec parent, ParameterInfo [] pi, MethodBase method)
                {
@@ -945,7 +945,6 @@ namespace Mono.CSharp {
                        TypeSpec [] types = new TypeSpec [pi.Length + varargs];
                        IParameterData [] par = new IParameterData [pi.Length + varargs];
                        bool is_params = false;
-                       PredefinedAttribute extension_attr = PredefinedAttributes.Get.Extension;
                        for (int i = 0; i < pi.Length; i++) {
                                ParameterInfo p = pi [i];
                                Parameter.Modifier mod = 0;
@@ -960,8 +959,8 @@ namespace Mono.CSharp {
                                        // Strip reference wrapping
                                        //
                                        types [i] = Import.ImportType (p.ParameterType.GetElementType ());
-                               } else if (i == 0 && method.IsStatic && parent.IsStatic &&
-                                       extension_attr.IsDefined && extension_attr.IsDefined && method.IsDefined (extension_attr.Type.GetMetaInfo (), false)) {
+                               } else if (i == 0 && method.IsStatic && parent.IsStatic && // TODO: parent.Assembly.IsExtension &&
+                                       HasExtensionAttribute (method)) {
                                        mod = Parameter.Modifier.This;
                                        types[i] = Import.ImportType (p.ParameterType);
                                } else {
@@ -999,6 +998,19 @@ namespace Mono.CSharp {
                                new ParametersImported (par, types, varargs != 0, is_params) :
                                new ParametersImported (par, types);
                }
+
+               static bool HasExtensionAttribute (MethodBase mb)
+               {
+                       var all_attributes = CustomAttributeData.GetCustomAttributes (mb);
+                       foreach (var attr in all_attributes) {
+                               var dt = attr.Constructor.DeclaringType;
+                               if (dt.Name == "ExtensionAttribute" && dt.Namespace == "System.Runtime.CompilerServices") {
+                                       return true;
+                               }
+                       }
+
+                       return false;
+               }
        }
 
        /// <summary>