Exemple #1
0
        private bool IsWindowsAttributeUsageAttribute(EntityHandle targetType, CustomAttributeHandle attributeHandle)
        {
            // Check for Windows.Foundation.Metadata.AttributeUsageAttribute.
            // WinMD rules:
            //   - The attribute is only applicable on TypeDefs.
            //   - Constructor must be a MemberRef with TypeRef.

            if (targetType.Kind != HandleKind.TypeDefinition)
            {
                return(false);
            }

            var attributeCtor = CustomAttributeTable.GetConstructor(attributeHandle);

            if (attributeCtor.Kind != HandleKind.MemberReference)
            {
                return(false);
            }

            var attributeType = MemberRefTable.GetClass((MemberReferenceHandle)attributeCtor);

            if (attributeType.Kind != HandleKind.TypeReference)
            {
                return(false);
            }

            var attributeTypeRef = (TypeReferenceHandle)attributeType;

            return(StringStream.EqualsRaw(TypeRefTable.GetName(attributeTypeRef), "AttributeUsageAttribute") &&
                   StringStream.EqualsRaw(TypeRefTable.GetNamespace(attributeTypeRef), "Windows.Foundation.Metadata"));
        }
Exemple #2
0
        private bool NeedsWinRTPrefix(TypeAttributes flags, EntityHandle extends)
        {
            if ((flags & (TypeAttributes.VisibilityMask | TypeAttributes.Interface)) != TypeAttributes.Public)
            {
                return(false);
            }

            if (extends.Kind != HandleKind.TypeReference)
            {
                return(false);
            }

            // Check if the type is a delegate, struct, or attribute
            TypeReferenceHandle extendsRefHandle = (TypeReferenceHandle)extends;

            if (StringStream.EqualsRaw(TypeRefTable.GetNamespace(extendsRefHandle), "System"))
            {
                StringHandle nameHandle = TypeRefTable.GetName(extendsRefHandle);
                if (StringStream.EqualsRaw(nameHandle, "MulticastDelegate") ||
                    StringStream.EqualsRaw(nameHandle, "ValueType") ||
                    StringStream.EqualsRaw(nameHandle, "Attribute"))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #3
0
        private int GetProjectionIndexForTypeReference(TypeReferenceHandle typeRef, out bool isIDisposable)
        {
            InitializeProjectedTypes();

            int index = StringStream.BinarySearchRaw(s_projectedTypeNames, TypeRefTable.GetName(typeRef));

            if (index >= 0 && StringStream.EqualsRaw(TypeRefTable.GetNamespace(typeRef), s_projectionInfos[index].WinRTNamespace))
            {
                isIDisposable = s_projectionInfos[index].IsIDisposable;
                return(index);
            }

            isIDisposable = false;
            return(-1);
        }
Exemple #4
0
        private bool GetAttributeTypeNameRaw(CustomAttributeHandle caHandle, out StringHandle namespaceName, out StringHandle typeName)
        {
            namespaceName = typeName = default(StringHandle);

            EntityHandle typeDefOrRef = GetAttributeTypeRaw(caHandle);

            if (typeDefOrRef.IsNil)
            {
                return(false);
            }

            if (typeDefOrRef.Kind == HandleKind.TypeReference)
            {
                TypeReferenceHandle typeRef = (TypeReferenceHandle)typeDefOrRef;
                var resolutionScope         = TypeRefTable.GetResolutionScope(typeRef);

                if (!resolutionScope.IsNil && resolutionScope.Kind == HandleKind.TypeReference)
                {
                    // we don't need to handle nested types
                    return(false);
                }

                // other resolution scopes don't affect full name

                typeName      = TypeRefTable.GetName(typeRef);
                namespaceName = TypeRefTable.GetNamespace(typeRef);
            }
            else if (typeDefOrRef.Kind == HandleKind.TypeDefinition)
            {
                TypeDefinitionHandle typeDef = (TypeDefinitionHandle)typeDefOrRef;

                if (TypeDefTable.GetFlags(typeDef).IsNested())
                {
                    // we don't need to handle nested types
                    return(false);
                }

                typeName      = TypeDefTable.GetName(typeDef);
                namespaceName = TypeDefTable.GetNamespace(typeDef);
            }
            else
            {
                // invalid metadata
                return(false);
            }

            return(true);
        }
Exemple #5
0
        private TypeRefTreatment GetSpecialTypeRefTreatment(TypeReferenceHandle handle)
        {
            if (StringStream.EqualsRaw(TypeRefTable.GetNamespace(handle), "System"))
            {
                StringHandle name = TypeRefTable.GetName(handle);

                if (StringStream.EqualsRaw(name, "MulticastDelegate"))
                {
                    return(TypeRefTreatment.SystemDelegate);
                }

                if (StringStream.EqualsRaw(name, "Attribute"))
                {
                    return(TypeRefTreatment.SystemAttribute);
                }
            }

            return(TypeRefTreatment.None);
        }
Exemple #6
0
        /// <summary>
        /// The backing field of a WinRT enumeration type is not public although the backing fields
        /// of managed enumerations are. To allow managed languages to directly access this field,
        /// it is made public by the metadata adapter.
        /// </summary>
        private uint CalculateFieldDefTreatmentAndRowId(FieldDefinitionHandle handle)
        {
            var flags = FieldTable.GetFlags(handle);
            FieldDefTreatment treatment = FieldDefTreatment.None;

            if ((flags & FieldAttributes.RTSpecialName) != 0 && StringStream.EqualsRaw(FieldTable.GetName(handle), "value__"))
            {
                TypeDefinitionHandle typeDef = GetDeclaringType(handle);

                EntityHandle baseTypeHandle = TypeDefTable.GetExtends(typeDef);
                if (baseTypeHandle.Kind == HandleKind.TypeReference)
                {
                    var typeRef = (TypeReferenceHandle)baseTypeHandle;

                    if (StringStream.EqualsRaw(TypeRefTable.GetName(typeRef), "Enum") &&
                        StringStream.EqualsRaw(TypeRefTable.GetNamespace(typeRef), "System"))
                    {
                        treatment = FieldDefTreatment.EnumValue;
                    }
                }
            }

            return(TreatmentAndRowId((byte)treatment, handle.RowId));
        }
Exemple #7
0
 private bool IsSystemEnum(TypeReferenceHandle handle)
 {
     return(StringStream.EqualsRaw(TypeRefTable.GetNamespace(handle), "System") &&
            StringStream.EqualsRaw(TypeRefTable.GetName(handle), "Enum"));
 }
 private bool IsSystemAttribute(TypeReferenceHandle handle)
 {
     return(StringHeap.EqualsRaw(TypeRefTable.GetNamespace(handle), "System") &&
            StringHeap.EqualsRaw(TypeRefTable.GetName(handle), "Attribute"));
 }