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; }
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)); } }