/// <summary> /// Applies the Type transformation to the target type. /// </summary> /// <param name="host">The target type</param> /// <param name="typeWeaver">The type weaver that will make the current set of modifications.</param> public static void Accept(this AssemblyDefinition host, ITypeWeaver typeWeaver) { var module = host.MainModule; var types = module.Types.Where(typeWeaver.ShouldWeave).ToArray(); foreach (var type in types) { typeWeaver.Weave(type); } }
public void Run() { ITypeWeaver bulkWeaving = null; var compositesQueue = new Queue <ITypeWeaver>(); AspectsAttributeWeaver aspectRepository = null; AspectArgsMapperWeaver aspectArgsMapperWeaver = null; var aspectDefinitionsTypeSet = new HashSet <Type>(); var composites = typeFactory.Types.Select(type => new { Type = type, Attributes = type.GetCustomAttributesArray <CompositeAttribute>() }) .Where(composite => composite.Attributes.Length > 0); var compositeWeavingSettings = composites.ToList(composite => { var compositeType = composite.Type; var mixinsMap = new MixinsMap(compositeType); var aspectMappedMembers = new AspectMemberMapper(compositeType, mixinsMap); var aspectsMap = new AspectsMap(aspectMappedMembers); var aspectDefinitionsTypes = aspectsMap.SelectMany(aspectMap => { return(aspectMap.Aspects.Select(aspectDefinition => { return aspectDefinition.Aspect.AspectType; })); }); aspectDefinitionsTypeSet.AddRange(aspectDefinitionsTypes); return(new CompositeWeavingSettingsImpl { Registry = registry, MixinsMap = mixinsMap, AspectsMap = aspectsMap, CompositeType = compositeType, AspectMemebrsCollection = aspectMappedMembers }); }); aspectArgsMapperWeaver = new AspectArgsMapperWeaver(); aspectRepository = new AspectsAttributeWeaver(aspectDefinitionsTypeSet); compositesQueue.Enqueue(aspectArgsMapperWeaver); compositesQueue.Enqueue(aspectRepository); compositeWeavingSettings.ForEach(compositeSettings => { IBuilder <ITypeWeaver> builder = null; compositeSettings.AspectRepository = aspectRepository; compositeSettings.AspectArgsMapper = aspectArgsMapperWeaver; builder = new CompositeTypeWeaverBuilder(compositeSettings); compositesQueue.Enqueue(builder.Build()); }); bulkWeaving = new BulkWeaving(compositesQueue); bulkWeaving.Weave(); }
/// <summary> /// Modifies the chosen types in an assembly using the given type weaver. /// </summary> /// <param name="targetAssembly">The target assembly to be modified</param> /// <param name="weaver">The type weaver that will be used to modify the selected types.</param> /// <param name="typeFilter">The filter that will determine which types should be modified.</param> public static void WeaveWith(this AssemblyDefinition targetAssembly, ITypeWeaver weaver, Func <TypeReference, bool> typeFilter) { var module = targetAssembly.MainModule; var types = module.Types.Where(t => typeFilter(t) && t.IsDefinition && weaver.ShouldWeave(t)).ToArray(); foreach (var type in types) { weaver.Weave(type); } }
/// <summary> /// Initializes a new instance of the TypeWeaverVisitor class. /// </summary> /// <param name="weaver">The <see cref="ITypeWeaver"/> that will be used to modify a given type.</param> public TypeWeaverVisitor(ITypeWeaver weaver) { _weaver = weaver; }
/// <summary> /// Allows a <see cref="ITypeWeaver"/> instance to traverse any <see cref="IReflectionStructureVisitable"/> /// instance. /// </summary> /// <param name="visitable">The visitable object.</param> /// <param name="typeWeaver">The type weaver.</param> public static void Accept(this IReflectionStructureVisitable visitable, ITypeWeaver typeWeaver) { var visitor = new TypeWeaverVisitor(typeWeaver); visitable.Accept(visitor); }
/// <summary> /// Applies the Type transformation to the target type. /// </summary> /// <param name="host">The target type</param> /// <param name="typeWeaver">The type weaver that will make the current set of modifications.</param> public static void Accept(this TypeDefinition host, ITypeWeaver typeWeaver) { typeWeaver.Weave(host); }
/// <summary> /// Modifies all the types in an assembly using the given type weaver. /// </summary> /// <param name="targetAssembly">The target assembly to be modified.</param> /// <param name="weaver">The weaver that will perform the modification.</param> public static void WeaveWith(this AssemblyDefinition targetAssembly, ITypeWeaver weaver) { WeaveWith(targetAssembly, weaver, _ => true); }