示例#1
0
        internal CustomAttributeValueTreatment CalculateCustomAttributeValueTreatment(CustomAttributeHandle handle)
        {
            Debug.Assert(_metadataKind != MetadataKind.Ecma335);

            var parent = CustomAttributeTable.GetParent(handle);

            // Check for Windows.Foundation.Metadata.AttributeUsageAttribute.
            // WinMD rules:
            //   - The attribute is only applicable on TypeDefs.
            //   - Constructor must be a MemberRef with TypeRef.
            if (!IsWindowsAttributeUsageAttribute(parent, handle))
            {
                return(CustomAttributeValueTreatment.None);
            }

            var targetTypeDef = (TypeDefinitionHandle)parent;

            if (StringStream.EqualsRaw(TypeDefTable.GetNamespaceString(targetTypeDef), "Windows.Foundation.Metadata"))
            {
                if (StringStream.EqualsRaw(TypeDefTable.GetName(targetTypeDef), "VersionAttribute"))
                {
                    return(CustomAttributeValueTreatment.AttributeUsageVersionAttribute);
                }

                if (StringStream.EqualsRaw(TypeDefTable.GetName(targetTypeDef), "DeprecatedAttribute"))
                {
                    return(CustomAttributeValueTreatment.AttributeUsageDeprecatedAttribute);
                }
            }

            bool allowMultiple = HasAttribute(targetTypeDef, "Windows.Foundation.Metadata", "AllowMultipleAttribute");

            return(allowMultiple ? CustomAttributeValueTreatment.AttributeUsageAllowMultiple : CustomAttributeValueTreatment.AttributeUsageAllowSingle);
        }
示例#2
0
        private TypeDefTreatment GetWellKnownTypeDefinitionTreatment(TypeDefinitionHandle typeDef)
        {
            InitializeProjectedTypes();

            StringHandle name = TypeDefTable.GetName(typeDef);

            int index = StringStream.BinarySearchRaw(_projectedTypeNames, name);

            if (index < 0)
            {
                return(TypeDefTreatment.None);
            }

            StringHandle namespaceName = TypeDefTable.GetNamespaceString(typeDef);

            if (StringStream.EqualsRaw(namespaceName, StringStream.GetVirtualValue(s_projectionInfos[index].ClrNamespace)))
            {
                return(s_projectionInfos[index].Treatment);
            }

            // TODO: we can avoid this comparison if info.DotNetNamespace == info.WinRtNamespace
            if (StringStream.EqualsRaw(namespaceName, s_projectionInfos[index].WinRTNamespace))
            {
                return(s_projectionInfos[index].Treatment | TypeDefTreatment.MarkInternalFlag);
            }

            return(TypeDefTreatment.None);
        }
示例#3
0
        private bool GetAttributeTypeNameRaw(CustomAttributeHandle caHandle, out StringHandle namespaceName, out StringHandle typeName)
        {
            namespaceName = typeName = default(StringHandle);

            Handle 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.GetNamespaceString(typeDef);
            }
            else
            {
                // invalid metadata
                return(false);
            }

            return(true);
        }