Example #1
0
        /// <summary>
        /// Asserts that the custom attribute is not defined on the target. If more than zero custom attributes exist for the requested type, an InvalidOperationException is thrown.
        /// </summary>
        /// <typeparam name="TAttribute"> The custom attribute type. </typeparam>
        /// <param name="target"> The target object (Assembly, Type, MemberInfo, etc.) </param>
        public void GetZeroAttributes <TAttribute>(ICustomAttributeProvider target)
            where TAttribute : Attribute
        {
            TAttribute[] attributes;
            Type         attributeType, targetType;

            if ((object)target == null)
            {
                throw new ArgumentNullException(nameof(target));
            }

            attributeType = typeof(TAttribute);
            targetType    = target.GetType();

            attributes = this.GetAllAttributes <TAttribute>(target);

            if ((object)attributes == null || attributes.Length == 0)
            {
                return;
            }
            else
            {
                throw new InvalidOperationException(string.Format("Some custom attributes of type '{0}' are defined on type '{1}'.", attributeType.FullName, targetType.FullName));
            }
        }
Example #2
0
        /// <summary>
        ///     Get the single custom attribute of the attribute specified type. If more than one custom attribute exists for the requested type, an InvalidOperationException is thrown. If no custom attributes of the specified type are defined, then null is returned.
        /// </summary>
        /// <typeparam name="TAttribute"> The custom attribute type. </typeparam>
        /// <param name="target"> The target ICustomAttributeProvider (Assembly, Type, MemberInfo, etc.) </param>
        /// <returns> The single custom attribute or null if none are defined. </returns>
        public static TAttribute GetOneAttribute <TAttribute>(ICustomAttributeProvider target)
            where TAttribute : Attribute
        {
            TAttribute[] attributes;
            Type         attributeType, targetType;

            if ((object)target == null)
            {
                throw new ArgumentNullException("target");
            }

            attributeType = typeof(TAttribute);
            targetType    = target.GetType();

            attributes = GetAllAttributes <TAttribute>(target);

            if ((object)attributes == null || attributes.Length == 0)
            {
                return(null);
            }
            else if (attributes.Length > 1)
            {
                throw new InvalidOperationException(string.Format("Multiple custom attributes of type '{0}' are defined on type '{1}'.", attributeType.FullName, targetType.FullName));
            }
            else
            {
                return(attributes[0]);
            }
        }
Example #3
0
        internal static bool IsDefined(ICustomAttributeProvider obj, Type attributeType, bool inherit)
        {
            if (obj.GetType().Assembly != typeof(int).Assembly)
            {
                // User types might overwrite GetCustomAttributes () but not
                // IsDefined ().
                return(obj.GetCustomAttributes(attributeType, inherit).Length > 0);
            }

            if (IsDefinedInternal(obj, attributeType))
            {
                return(true);
            }

            object[] pseudoAttrs = GetPseudoCustomAttributes(obj, attributeType);
            if (pseudoAttrs != null)
            {
                for (int i = 0; i < pseudoAttrs.Length; ++i)
                {
                    if (attributeType.IsAssignableFrom(pseudoAttrs [i].GetType()))
                    {
                        return(true);
                    }
                }
            }

            ICustomAttributeProvider btype;

            if (inherit && ((btype = GetBase(obj)) != null))
            {
                return(IsDefined(btype, attributeType, inherit));
            }

            return(false);
        }
Example #4
0
    static IList <CustomAttributeData> GetIKVMAttributes(ICustomAttributeProvider provider)
    {
        if (provider == null)
        {
            return(null);
        }
        var member = provider as MemberInfo;

        if (member != null)
        {
            return(CustomAttributeData.GetCustomAttributes(member));
        }
        var assembly = provider as Assembly;

        if (assembly != null)
        {
            return(CustomAttributeData.GetCustomAttributes(assembly));
        }
        var pinfo = provider as ParameterInfo;

        if (pinfo != null)
        {
            return(CustomAttributeData.GetCustomAttributes(pinfo));
        }
        var module = provider as Module;

        if (module != null)
        {
            return(CustomAttributeData.GetCustomAttributes(module));
        }
        throw new BindingException(1051, true, provider.GetType().FullName);
    }
Example #5
0
        private static bool?ConsumeAttribute(ICustomAttributeProvider item)
        {
            if (!item.HasCustomAttributes)
            {
                return(null);
            }

            try
            {
                var attr = item.CustomAttributes.SingleOrDefault(i => i.AttributeType.FullName == AttributeFullName);
                if (attr == null)
                {
                    return(null);
                }

                var value = (bool)attr.ConstructorArguments.Single().Value;
                item.CustomAttributes.Remove(attr);

                return(value);
            }
            catch (InvalidOperationException)
            {
                throw new WeavingException($"Invalid {AttributeFullName} on {item.GetType().Name}: {item}");
            }
        }
        public static byte[] GetReferenceNullability(this ICustomAttributeProvider provider, MemberInfo context)
        {
            // bleh.  Currently not allowed to call GetCustomAttributes from ICustomAttributeProvider when using MetadataLoadContext.
            //var nullableAttribute = provider.GetCustomAttributes(false).FirstOrDefault(a => (a as CustomAttributeData).AttributeType.FullName == "System.Runtime.CompilerServices.NullableAttribute");
            //var nullableContextAttribute = provider.GetCustomAttributes(true).FirstOrDefault(a => (a as CustomAttributeData).AttributeType.FullName == "System.Runtime.CompilerServices.NullableContextAttribute");
            var customAttributeObject = provider.GetType().GetProperty("CustomAttributes").GetValue(provider);
            var customAttributes      = (customAttributeObject as IEnumerable <CustomAttributeData>) ?? new CustomAttributeData[0];

            return(GetReferenceNullability(customAttributes, context));
        }
Example #7
0
        private static void LogParameterError(string message, ICustomAttributeProvider member, ParameterAttribute parameter)
        {
            string type = string.Empty;
            string name = string.Empty;

            if (typeof(System.Type).IsAssignableFrom(member.GetType()))
            {
                type = "class";
                name = ((System.Type)member).FullName;
            }
            else if (typeof(MemberInfo).IsAssignableFrom(member.GetType()))
            {
                type = "member";
                name = ((MemberInfo)member).DeclaringType.FullName + "." + ((MemberInfo)member).DeclaringType.FullName;
            }

            // Now log it
            logger.Error(string.Format(CultureInfo.InvariantCulture, message, type, name, parameter.Name, parameter.Owner));
        }
Example #8
0
 public static AssemblyDefinition GetAssemblyFromCustomAttributeProvider(ICustomAttributeProvider provider)
 {
     return(provider switch {
         MemberReference mr => mr.Module.Assembly,
         AssemblyDefinition ad => ad,
         ModuleDefinition md => md.Assembly,
         InterfaceImplementation ii => ii.InterfaceType.Module.Assembly,
         GenericParameterConstraint gpc => gpc.ConstraintType.Module.Assembly,
         ParameterDefinition pd => pd.ParameterType.Module.Assembly,
         MethodReturnType mrt => mrt.ReturnType.Module.Assembly,
         _ => throw new NotImplementedException(provider.GetType().ToString()),
     });
Example #9
0
        public static Optional <Dictionary <String, Object> > FindAnnotationAttributes(ICustomAttributeProvider element, Type annotationType)
        {
            Dictionary <String, Object> result;

            switch (element)
            {
            case MemberInfo memberInfo:
                result = Scan(memberInfo, annotationType, new HashSet <Type>());
                break;

            case ParameterInfo parameterInfo:
                result = Scan(parameterInfo, annotationType, new HashSet <Type>());
                break;

            default:
                throw new ArgumentException($"{element.GetType()} is not a supported attribute provider", nameof(element));
            }

            return(result != null ? Optional <Dictionary <string, object> > .Of(result) : Optional <Dictionary <string, object> > .Empty);
        }
 private static IEnumerable <CustomAttributeData> GetCustomAttributeData(this ICustomAttributeProvider cap)
 {
     if (cap is Assembly)
     {
         return(CustomAttributeData.GetCustomAttributes((Assembly)cap));
     }
     else if (cap is Module)
     {
         return(CustomAttributeData.GetCustomAttributes((Module)cap));
     }
     else if (cap is MemberInfo)
     {
         return(CustomAttributeData.GetCustomAttributes((MemberInfo)cap));
     }
     else if (cap is ParameterInfo)
     {
         return(CustomAttributeData.GetCustomAttributes((ParameterInfo)cap));
     }
     else
     {
         throw new NotSupportedException(cap.GetType().ToString());
     }
 }
Example #11
0
        public void ReturnTypeCustomAttributes()
        {
            ICustomAttributeProvider virtualReturnParameter = _virtualPropertySetter.ReturnTypeCustomAttributes;

            Assert.Equal(ProjectionConstants.VirtualReturnParameter, virtualReturnParameter.GetType().FullName);
        }
    static IList <CustomAttributeData> GetIKVMAttributes(ICustomAttributeProvider provider)
    {
        var member = provider as MemberInfo;

        if (member != null)
        {
            return(CustomAttributeData.GetCustomAttributes(member));
        }
        var assembly = provider as Assembly;

        if (assembly != null)
        {
            return(CustomAttributeData.GetCustomAttributes(assembly));
        }
        var pinfo = provider as ParameterInfo;

        if (pinfo != null)
        {
            return(CustomAttributeData.GetCustomAttributes(pinfo));
        }
        var module = provider as Module;

        if (module != null)
        {
            return(CustomAttributeData.GetCustomAttributes(module));
        }
        throw new BindingException(1051, true, "Internal error: Don't know how to get attributes for {0}. Please file a bug report (https://github.com/xamarin/xamarin-macios/issues/new) with a test case.", provider.GetType().FullName);
    }
        private static string GetPatchFullName(this ICustomAttributeProvider cap, MemberReference mr)
        {
            if (cap is TypeReference)
            {
                TypeReference type = (TypeReference)cap;
                string        name = cap.GetPatchName();

                if (name.StartsWith("global::"))
                {
                    name = name.Substring(8); // Patch name is refering to a global type.
                }
                else if (name.Contains(".") || name.Contains("/"))
                {
                }       // Patch name is already a full name.
                else if (!string.IsNullOrEmpty(type.Namespace))
                {
                    name = $"{type.Namespace}.{name}";
                }
                else if (type.IsNested)
                {
                    name = $"{type.DeclaringType.GetPatchFullName()}/{name}";
                }

                if (mr is TypeSpecification)
                {
                    Stack <string>    formats = new Stack <string>();
                    TypeSpecification ts      = (TypeSpecification)mr;
                    do
                    {
                        if (ts.IsByReference)
                        {
                            formats.Push("{0}&");
                        }
                        else if (ts.IsPointer)
                        {
                            formats.Push("{0}*");
                        }
                        else if (ts.IsPinned)
                        {
                        }                         // FullName not overriden.
                        else if (ts.IsArray)
                        {
                            ArrayType array = (ArrayType)ts;
                            if (array.IsVector)
                            {
                                formats.Push("{0}[]");
                            }
                            else
                            {
                                StringBuilder format = new StringBuilder();
                                format.Append("{0}[");
                                for (int i = 0; i < array.Dimensions.Count; i++)
                                {
                                    if (i > 0)
                                    {
                                        format.Append(",");
                                    }
                                    format.Append(array.Dimensions[i].ToString());
                                }
                                format.Append("]");
                                formats.Push(format.ToString());
                            }
                        }
                        else if (ts.IsRequiredModifier)
                        {
                            formats.Push($"{{0}} modreq({((RequiredModifierType) ts).ModifierType}");
                        }
                        else if (ts.IsOptionalModifier)
                        {
                            formats.Push($"{{0}} modopt({((OptionalModifierType) ts).ModifierType}");
                        }
                        else if (ts.IsGenericInstance)
                        {
                            GenericInstanceType gen    = (GenericInstanceType)ts;
                            StringBuilder       format = new StringBuilder();
                            format.Append("{0}<");
                            for (int i = 0; i < gen.GenericArguments.Count; i++)
                            {
                                if (i > 0)
                                {
                                    format.Append(",");
                                }
                                format.Append(gen.GenericArguments[i].GetPatchFullName());
                            }
                            format.Append(">");
                            formats.Push(format.ToString());
                        }
                        else if (ts.IsFunctionPointer)
                        {
                            FunctionPointerType fpt    = (FunctionPointerType)ts;
                            StringBuilder       format = new StringBuilder();
                            format.Append("{0} ");
                            format.Append(fpt.ReturnType.GetPatchFullName());
                            format.Append(" *(");
                            if (fpt.HasParameters)
                            {
                                for (int i = 0; i < fpt.Parameters.Count; i++)
                                {
                                    var parameter = fpt.Parameters[i];
                                    if (i > 0)
                                    {
                                        format.Append(",");
                                    }

                                    if (parameter.ParameterType.IsSentinel)
                                    {
                                        format.Append("...,");
                                    }

                                    format.Append(parameter.ParameterType.FullName);
                                }
                            }
                            format.Append(")");
                            formats.Push(format.ToString());
                        }
                        else
                        {
                            throw new InvalidOperationException($"MonoMod can't handle TypeSpecification: {type.FullName} ({type.GetType()})");
                        }
                    } while ((ts = (ts.ElementType as TypeSpecification)) != null);

                    foreach (string format in formats)
                    {
                        name = string.Format(format, name);
                    }
                }

                return(name);
            }

            if (cap is FieldReference)
            {
                FieldReference field = (FieldReference)cap;
                return($"{field.FieldType.GetPatchFullName()} {field.DeclaringType.GetPatchFullName()}::{cap.GetPatchName()}");
            }

            if (cap is MethodReference)
            {
                throw new InvalidOperationException("GetPatchFullName not supported on MethodReferences - use GetFindableID instead");
            }

            throw new InvalidOperationException($"GetPatchFullName not supported on type {cap.GetType()}");
        }
Example #14
0
    public static T GetCustomAttribute <T> (ICustomAttributeProvider provider) where T : System.Attribute
    {
        if (provider == null)
        {
            return(null);
        }

        var type = typeof(T);
        var pi   = provider as ParameterInfo;

        if (pi != null)
        {
            return((T)Attribute.GetCustomAttribute(pi, type));
        }
        var mi = provider as MemberInfo;

        if (mi != null)
        {
            return((T)Attribute.GetCustomAttribute(mi, type));
        }
        var asm = provider as Assembly;

        if (asm != null)
        {
            return((T)Attribute.GetCustomAttribute(asm, type));
        }
        throw new BindingException(1051, true, "Internal error: Don't know how to get attributes for {0}. Please file a bug report (http://bugzilla.xamarin.com) with a test case.", provider.GetType().FullName);
    }
        protected bool IsSystemMemberInfo(ICustomAttributeProvider member)
        {
            string typeName = member.GetType().FullName;

            return(m_systemMemberTypeNames.Contains(typeName));
        }
		private static void LogParameterError(string message, ICustomAttributeProvider member, IParameterDefinition parameter)
		{
			string type = string.Empty;
			string name = string.Empty;

			if (typeof(System.Type).IsAssignableFrom(member.GetType()))
			{
				type = "class";
				name = ((System.Type)member).FullName;
			}
			else if (typeof(MemberInfo).IsAssignableFrom(member.GetType()))
			{
				type = "member";
				name = ((MemberInfo)member).DeclaringType.FullName + "." + ((MemberInfo)member).DeclaringType.FullName;
			}

			// Now log it
			logger.Error(string.Format(CultureInfo.InvariantCulture, message, type, name, parameter.Name, parameter.Owner));
		}
Example #17
0
 private static void Throw <TAttr>(ICustomAttributeProvider attributeProvider)
 {
     throw new InvalidOperationException($"Type {attributeProvider.GetType()} isn't marked with an attribute of type {typeof(TAttr)}");
 }
        private static string GetPatchFullName(this ICustomAttributeProvider cap, MemberReference mr)
        {
            if (cap is TypeReference type)
            {
                CustomAttribute patchAttrib = cap.GetCustomAttribute("MonoMod.MonoModPatch");
                string          name;

                if (patchAttrib != null)
                {
                    name = (string)patchAttrib.ConstructorArguments[0].Value;
                }
                else
                {
                    // Backwards-compatibility: Check for patch_
                    name = ((MemberReference)cap).Name;
                    name = name.StartsWith("patch_") ? name.Substring(6) : name;
                }

                if (name.StartsWith("global::"))
                {
                    name = name.Substring(8); // Patch name is refering to a global type.
                }
                else if (name.Contains(".") || name.Contains("/"))
                {
                }                                                      // Patch name is already a full name.
                else if (!string.IsNullOrEmpty(type.Namespace))
                {
                    name = type.Namespace + "." + name;
                }
                else if (type.IsNested)
                {
                    name = type.DeclaringType.GetPatchFullName() + "/" + name;
                }

                if (mr is TypeSpecification)
                {
                    // Collect TypeSpecifications and append formats back to front.
                    List <TypeSpecification> formats = new List <TypeSpecification>();
                    TypeSpecification        ts      = (TypeSpecification)mr;
                    do
                    {
                        formats.Add(ts);
                    } while ((ts = (ts.ElementType as TypeSpecification)) != null);

                    StringBuilder builder = new StringBuilder(name.Length + formats.Count * 4);
                    builder.Append(name);
                    for (int formati = formats.Count - 1; formati > -1; --formati)
                    {
                        ts = formats[formati];

                        if (ts.IsByReference)
                        {
                            builder.Append("&");
                        }
                        else if (ts.IsPointer)
                        {
                            builder.Append("*");
                        }
                        else if (ts.IsPinned)
                        {
                        }                         // FullName not overriden.
                        else if (ts.IsSentinel)
                        {
                        }                           // FullName not overriden.
                        else if (ts.IsArray)
                        {
                            ArrayType array = (ArrayType)ts;
                            if (array.IsVector)
                            {
                                builder.Append("[]");
                            }
                            else
                            {
                                builder.Append("[");
                                for (int i = 0; i < array.Dimensions.Count; i++)
                                {
                                    if (i > 0)
                                    {
                                        builder.Append(",");
                                    }
                                    builder.Append(array.Dimensions[i].ToString());
                                }
                                builder.Append("]");
                            }
                        }
                        else if (ts.IsRequiredModifier)
                        {
                            builder.Append("modreq(").Append(((RequiredModifierType)ts).ModifierType).Append(")");
                        }
                        else if (ts.IsOptionalModifier)
                        {
                            builder.Append("modopt(").Append(((OptionalModifierType)ts).ModifierType).Append(")");
                        }
                        else if (ts.IsGenericInstance)
                        {
                            GenericInstanceType gen = (GenericInstanceType)ts;
                            builder.Append("<");
                            for (int i = 0; i < gen.GenericArguments.Count; i++)
                            {
                                if (i > 0)
                                {
                                    builder.Append(",");
                                }
                                builder.Append(gen.GenericArguments[i].GetPatchFullName());
                            }
                            builder.Append(">");
                        }
                        else if (ts.IsFunctionPointer)
                        {
                            FunctionPointerType fpt = (FunctionPointerType)ts;
                            builder.Append(" ").Append(fpt.ReturnType.GetPatchFullName()).Append(" *(");
                            if (fpt.HasParameters)
                            {
                                for (int i = 0; i < fpt.Parameters.Count; i++)
                                {
                                    ParameterDefinition parameter = fpt.Parameters[i];
                                    if (i > 0)
                                    {
                                        builder.Append(",");
                                    }

                                    if (parameter.ParameterType.IsSentinel)
                                    {
                                        builder.Append("...,");
                                    }

                                    builder.Append(parameter.ParameterType.FullName);
                                }
                            }
                            builder.Append(")");
                        }
                        else
                        {
                            throw new NotSupportedException($"MonoMod can't handle TypeSpecification: {type.FullName} ({type.GetType()})");
                        }
                    }

                    name = builder.ToString();
                }

                return(name);
            }

            if (cap is FieldReference field)
            {
                return($"{field.FieldType.GetPatchFullName()} {field.DeclaringType.GetPatchFullName()}::{cap.GetPatchName()}");
            }

            if (cap is MethodReference)
            {
                throw new InvalidOperationException("GetPatchFullName not supported on MethodReferences - use GetID instead");
            }

            throw new InvalidOperationException($"GetPatchFullName not supported on type {cap.GetType()}");
        }