private IEnumerable <InjectionDefinition> CreateInjections(IMemberDefinition target, InjectionInfo injection, CustomAttribute trigger) { if (IsAspectMember(target)) { return(Enumerable.Empty <InjectionDefinition>()); } return(injection.aspect.Effects.Where(e => e.IsApplicableFor(target)).Select(e => new InjectionDefinition() { Target = target, Source = injection.aspect, Priority = injection.priority, Effect = e, Triggers = trigger == null ? new List <CustomAttribute>() : new List <CustomAttribute> { trigger } })); }
private IEnumerable <InjectionDefinition> FindApplicableMembers(ICustomAttributeProvider target, InjectionInfo injection, CustomAttribute trigger) { var result = Enumerable.Empty <InjectionDefinition>(); Func <ICustomAttributeProvider, bool> additionalFilter = (provider) => !provider.IsCompilerGenerated(); if ((injection.propagation & PropagateTo.IncludeCompilerGenerated) != 0) { additionalFilter = (provider) => true; } if (target is AssemblyDefinition assm) { result = result.Concat(assm.Modules.SelectMany(nt => FindApplicableMembers(nt, injection, trigger))); } if (target is ModuleDefinition module && (injection.propagation & PropagateTo.Types) != 0) { result = result.Concat(module.Types.SelectMany(nt => FindApplicableMembers(nt, injection, trigger))); } if (target is IMemberDefinition member && (injection.filter == null || injection.filter.IsMatch(member.Name))) { result = result.Concat(CreateInjections(member, injection, trigger)); } if (target is TypeDefinition type) { if ((injection.propagation & PropagateTo.Methods) != 0) { result = result.Concat(type.Methods.Where(m => additionalFilter(m) && (m.IsNormalMethod() || m.IsConstructor)).SelectMany(m => FindApplicableMembers(m, injection, trigger))); } if ((injection.propagation & PropagateTo.Events) != 0) { result = result.Concat(type.Events.Where(e => additionalFilter(e)).SelectMany(m => FindApplicableMembers(m, injection, trigger))); } if ((injection.propagation & PropagateTo.Properties) != 0) { result = result.Concat(type.Properties.Where(p => additionalFilter(p)).SelectMany(m => FindApplicableMembers(m, injection, trigger))); } if ((injection.propagation & PropagateTo.Types) != 0) { result = result.Concat(type.NestedTypes.Where(nt => additionalFilter(nt)).SelectMany(nt => FindApplicableMembers(nt, injection, trigger))); } } return(result); }