public static void ApplyProjection(TypeDefinition type, TypeDefinitionProjection projection)
{
if (projection == null)
return;
var treatment = projection.Treatment;
switch (treatment & TypeDefinitionTreatment.KindMask) {
case TypeDefinitionTreatment.NormalType:
type.Attributes |= TypeAttributes.WindowsRuntime | TypeAttributes.Import;
break;
case TypeDefinitionTreatment.NormalAttribute:
type.Attributes |= TypeAttributes.WindowsRuntime | TypeAttributes.Sealed;
break;
case TypeDefinitionTreatment.UnmangleWindowsRuntimeName:
type.Attributes = type.Attributes & ~TypeAttributes.SpecialName | TypeAttributes.Public;
type.Name = type.Name.Substring ("<CLR>".Length);
break;
case TypeDefinitionTreatment.PrefixWindowsRuntimeName:
type.Attributes = type.Attributes & ~TypeAttributes.Public | TypeAttributes.Import;
type.Name = "<WinRT>" + type.Name;
break;
case TypeDefinitionTreatment.RedirectToClrType:
type.Attributes = type.Attributes & ~TypeAttributes.Public | TypeAttributes.Import;
break;
case TypeDefinitionTreatment.RedirectToClrAttribute:
type.Attributes = type.Attributes & ~TypeAttributes.Public;
break;
case TypeDefinitionTreatment.RedirectImplementedMethods: {
type.Attributes |= TypeAttributes.WindowsRuntime | TypeAttributes.Import;
foreach (var redirectedInterfacePair in projection.RedirectedInterfaces) {
type.Interfaces.Add (redirectedInterfacePair.Value);
foreach (var customAttribute in redirectedInterfacePair.Key.CustomAttributes)
redirectedInterfacePair.Value.CustomAttributes.Add (customAttribute);
redirectedInterfacePair.Key.CustomAttributes.Clear ();
foreach (var method in type.Methods) {
foreach (var @override in method.Overrides) {
if (TypeReferenceEqualityComparer.AreEqual (@override.DeclaringType, redirectedInterfacePair.Key.InterfaceType)) {
@override.DeclaringType = redirectedInterfacePair.Value.InterfaceType;
}
}
}
}
foreach (var method in projection.RedirectedMethods) {
type.Methods.Add (method);
}
}
break;
}
if ((treatment & TypeDefinitionTreatment.Abstract) != 0)
type.Attributes |= TypeAttributes.Abstract;
if ((treatment & TypeDefinitionTreatment.Internal) != 0)
type.Attributes &= ~TypeAttributes.Public;
type.WindowsRuntimeProjection = projection;
}