Exemple #1
0
 public MethodDefinitionProjection(MethodDefinition method, MethodDefinitionTreatment treatment)
 {
     this.Attributes     = method.Attributes;
     this.ImplAttributes = method.ImplAttributes;
     this.Name           = method.Name;
     this.Treatment      = treatment;
 }
 public static void ApplyProjection(MethodDefinition method, MethodDefinitionProjection projection)
 {
     if (projection != null)
     {
         MethodDefinitionTreatment treatment = projection.Treatment;
         if ((treatment & MethodDefinitionTreatment.Dispose) != 0)
         {
             method.Name = "Dispose";
         }
         if ((treatment & MethodDefinitionTreatment.Abstract) != 0)
         {
             method.Attributes |= MethodAttributes.Abstract;
         }
         if ((treatment & MethodDefinitionTreatment.Private) != 0)
         {
             method.Attributes = ((method.Attributes & ~MethodAttributes.MemberAccessMask) | MethodAttributes.Private);
         }
         if ((treatment & MethodDefinitionTreatment.Public) != 0)
         {
             method.Attributes = ((method.Attributes & ~MethodAttributes.MemberAccessMask) | MethodAttributes.Public);
         }
         if ((treatment & MethodDefinitionTreatment.Runtime) != 0)
         {
             method.ImplAttributes |= MethodImplAttributes.CodeTypeMask;
         }
         if ((treatment & MethodDefinitionTreatment.InternalCall) != 0)
         {
             method.ImplAttributes |= MethodImplAttributes.InternalCall;
         }
         method.WindowsRuntimeProjection = projection;
     }
 }
 public MethodDefinitionProjection(MethodDefinition method, MethodDefinitionTreatment treatment)
 {
     Attributes     = method.Attributes;
     ImplAttributes = method.ImplAttributes;
     Name           = method.Name;
     Treatment      = treatment;
 }
 public MethodDefinitionProjection(MethodDefinition method, MethodDefinitionTreatment treatment)
 {
     Attributes = method.Attributes;
     ImplAttributes = method.ImplAttributes;
     Name = method.Name;
     Treatment = treatment;
 }
        private static MethodDefinitionTreatment GetMethodDefinitionTreatmentFromCustomAttributes(MethodDefinition method)
        {
            MethodDefinitionTreatment methodDefinitionTreatment = MethodDefinitionTreatment.None;

            foreach (CustomAttribute customAttribute in method.CustomAttributes)
            {
                TypeReference attributeType = customAttribute.AttributeType;
                if (!(attributeType.Namespace != "Windows.UI.Xaml"))
                {
                    if (attributeType.Name == "TreatAsPublicMethodAttribute")
                    {
                        methodDefinitionTreatment |= MethodDefinitionTreatment.Public;
                    }
                    else if (attributeType.Name == "TreatAsAbstractMethodAttribute")
                    {
                        methodDefinitionTreatment |= MethodDefinitionTreatment.Abstract;
                    }
                }
            }
            return(methodDefinitionTreatment);
        }
        public static void ApplyProjection(MethodDefinition method, MethodDefinitionProjection projection)
        {
            if (projection == null)
            {
                return;
            }

            MethodDefinitionTreatment treatment = projection.Treatment;

            if ((treatment & MethodDefinitionTreatment.Abstract) != 0)
            {
                method.Attributes |= MethodAttributes.Abstract;
            }

            if ((treatment & MethodDefinitionTreatment.Private) != 0)
            {
                method.Attributes = (method.Attributes & ~MethodAttributes.MemberAccessMask) | MethodAttributes.Private;
            }

            if ((treatment & MethodDefinitionTreatment.Public) != 0)
            {
                method.Attributes = (method.Attributes & ~MethodAttributes.MemberAccessMask) | MethodAttributes.Public;
            }

            if ((treatment & MethodDefinitionTreatment.Runtime) != 0)
            {
                method.ImplAttributes |= MethodImplAttributes.Runtime;
            }

            if ((treatment & MethodDefinitionTreatment.InternalCall) != 0)
            {
                method.ImplAttributes |= MethodImplAttributes.InternalCall;
            }

            method.WindowsRuntimeProjection = projection;
        }
        public static void Project(MethodDefinition method)
        {
            MethodDefinitionTreatment methodDefinitionTreatment = MethodDefinitionTreatment.None;
            bool           flag          = false;
            TypeDefinition declaringType = method.DeclaringType;
            MetadataToken  metadataToken;

            if (declaringType.IsWindowsRuntime)
            {
                if (IsClrImplementationType(declaringType))
                {
                    methodDefinitionTreatment = MethodDefinitionTreatment.None;
                }
                else if (declaringType.IsNested)
                {
                    methodDefinitionTreatment = MethodDefinitionTreatment.None;
                }
                else if (declaringType.IsInterface)
                {
                    methodDefinitionTreatment = (MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall);
                }
                else if (declaringType.Module.MetadataKind == MetadataKind.ManagedWindowsMetadata && !method.IsPublic)
                {
                    methodDefinitionTreatment = MethodDefinitionTreatment.None;
                }
                else
                {
                    flag = true;
                    TypeReference baseType = declaringType.BaseType;
                    if (baseType != null)
                    {
                        metadataToken = baseType.MetadataToken;
                        if (metadataToken.TokenType == TokenType.TypeRef)
                        {
                            switch (GetSpecialTypeReferenceTreatment(baseType))
                            {
                            case TypeReferenceTreatment.SystemDelegate:
                                methodDefinitionTreatment = (MethodDefinitionTreatment.Public | MethodDefinitionTreatment.Runtime);
                                flag = false;
                                break;

                            case TypeReferenceTreatment.SystemAttribute:
                                methodDefinitionTreatment = (MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall);
                                flag = false;
                                break;
                            }
                        }
                    }
                }
            }
            if (flag)
            {
                bool flag2 = false;
                bool flag3 = false;
                bool flag4 = false;
                foreach (MethodReference @override in method.Overrides)
                {
                    metadataToken = @override.MetadataToken;
                    if (metadataToken.TokenType == TokenType.MemberRef && ImplementsRedirectedInterface(@override, out flag4))
                    {
                        flag2 = true;
                        if (flag4)
                        {
                            break;
                        }
                    }
                    else
                    {
                        flag3 = true;
                    }
                }
                if (flag4)
                {
                    methodDefinitionTreatment = MethodDefinitionTreatment.Dispose;
                    flag = false;
                }
                else if (flag2 && !flag3)
                {
                    methodDefinitionTreatment = (MethodDefinitionTreatment.Private | MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall);
                    flag = false;
                }
            }
            if (flag)
            {
                methodDefinitionTreatment |= GetMethodDefinitionTreatmentFromCustomAttributes(method);
            }
            if (methodDefinitionTreatment != 0)
            {
                ApplyProjection(method, new MethodDefinitionProjection(method, methodDefinitionTreatment));
            }
        }
        public static void Project(MethodDefinition method)
        {
            MethodDefinitionTreatment treatment = MethodDefinitionTreatment.None;
            bool           other          = false;
            TypeDefinition declaring_type = method.DeclaringType;

            if (declaring_type.IsWindowsRuntime)
            {
                if (IsClrImplementationType(declaring_type))
                {
                    treatment = MethodDefinitionTreatment.None;
                }
                else if (declaring_type.IsNested)
                {
                    treatment = MethodDefinitionTreatment.None;
                }
                else if (declaring_type.IsInterface)
                {
                    treatment = MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall;
                }
                else if (declaring_type.Module.MetadataKind == MetadataKind.ManagedWindowsMetadata && !method.IsPublic)
                {
                    treatment = MethodDefinitionTreatment.None;
                }
                else
                {
                    other = true;

                    TypeReference base_type = declaring_type.BaseType;
                    if (base_type != null && base_type.MetadataToken.TokenType == TokenType.TypeRef)
                    {
                        switch (GetSpecialTypeReferenceTreatment(base_type))
                        {
                        case TypeReferenceTreatment.SystemDelegate:
                            treatment = MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.Public;
                            other     = false;
                            break;

                        case TypeReferenceTreatment.SystemAttribute:
                            treatment = MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall;
                            other     = false;
                            break;
                        }
                    }
                }
            }

            if (other)
            {
                bool seen_redirected     = false;
                bool seen_non_redirected = false;

                foreach (MethodReference @override in method.Overrides)
                {
                    if (@override.MetadataToken.TokenType == TokenType.MemberRef && ImplementsRedirectedInterface(@override))
                    {
                        seen_redirected = true;
                    }
                    else
                    {
                        seen_non_redirected = true;
                    }
                }

                if (seen_redirected && !seen_non_redirected)
                {
                    treatment = MethodDefinitionTreatment.Runtime | MethodDefinitionTreatment.InternalCall | MethodDefinitionTreatment.Private;
                    other     = false;
                }
            }

            if (other)
            {
                treatment |= GetMethodDefinitionTreatmentFromCustomAttributes(method);
            }

            if (treatment != MethodDefinitionTreatment.None)
            {
                ApplyProjection(method, new MethodDefinitionProjection(method, treatment));
            }
        }