public static void Project(MethodDefinition method)
{
var treatment = MethodDefinitionTreatment.None;
var other = false;
var 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;
var 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)
{
var seen_redirected = false;
var seen_non_redirected = false;
foreach (var @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));
}