internal TopMethodInterceptionAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings, weavedType) { IMethodScopeWeaver getReturnValueWeaver = null; var @params = weavingSettings.MethodInfoImpl.GetParameters(); var byRefArgumentsStoreWeaver = aspectWeavingSettings.ByRefArgumentsStoreWeaver; if (argumentsWeavingSetings.IsFunction) { getReturnValueWeaver = new TopGetReturnValueWeaver(aspectWeavingSettings, argumentsWeavingSetings); } argumentsWeavingSetings.Parameters = @params.ToArray(@param => @param.ParameterType); argumentsWeavingSetings.BindingsDependency = weavedType; argumentsWeaver = new TopMethodInterceptionArgumentsWeaver(argumentsWeavingSetings, aspectWeavingSettings); if (!byRefArgumentsStoreWeaver.ContainsByRefParams) { if (getReturnValueWeaver.IsNotNull()) { methodScopeWeavers.Add(getReturnValueWeaver); } weaver = new MethodScopeWeaversQueue(methodScopeWeavers); } else { Action <ILGenerator> storeArgsIfNeededAction = byRefArgumentsStoreWeaver.StoreArgsIfNeeded; var finallyWeavers = new[] { storeArgsIfNeededAction.ToMethodScopeWeaver() }; weaver = new TryFinallyAspectWeaver(methodScopeWeavers, finallyWeavers, getReturnValueWeaver); } }
public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(SetPropertyInterceptionAspect aspect) { return(aspectDefinition => { Func <IAspectExpression, IAspectExpression> ctor = null; var propertyAspectDefinition = aspectDefinition as IPropertyAspectDefinition; if (lastAspect.Top) { ctor = expression => { return new TopSetPropertyInterceptionAspectExpression(expression, propertyAspectDefinition); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { return new BindingSetPropertyInterceptionAspectExpression(expression, propertyAspectDefinition); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }); }
public IAspectExpressionBuilder VisitInvocation(IAspectDefinition aspectDefinition, IArgumentsWeavingSettings argumentsWeavingSettings) { Func <IAspectExpression, IAspectExpression> expressionFactory = null; if (lastAspect.IsInBinding) { if (previousAspectDefinition.AspectType == AspectType.MethodInterceptionAspect) { expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => { return(new BindingAspectDecoratorExpression(aspectDefinition, argumentsWeavingSettings)); }); } else { expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => { return(new MethodInvokerAspectExpression(aspectDefinition, argumentsWeavingSettings, previousAspectDefinition)); }); } } else { expressionFactory = Functional.Curry <IAspectExpression, IAspectExpression>((ex) => { return(new NestedMethodInvokerAspectExpression(argumentsWeavingSettings, previousAspectDefinition)); }); } return(new AspectNodeExpressionBuilder(expressionFactory)); }
internal BindingOnMethodBoundaryAspectWeaver(IAspectWeaver nestedWeaver, IAspectDefinition aspectDefinition, IAspectWeavingSettings settings) : base(nestedWeaver, aspectDefinition, settings) { var @params = weavingSettings.MethodInfoImpl.GetParameters(); argumentsWeavingSetings.Parameters = @params.ToArray(@param => @param.ParameterType); argumentsWeaver = new BindingOnMethodExecutionArgumentsWeaver(argumentsWeavingSetings, settings); }
internal static Type GetArgumentType(this IAspectDefinition aspectDefinition) { var aspectType = aspectDefinition.Aspect.AspectType; var overridenMethods = aspectType.GetOverridenMethods(); var adviceMethod = overridenMethods[0]; return(adviceMethod.GetParameters()[0].ParameterType); }
internal static Type ToAspectArgumentImpl(this IAspectDefinition aspectDefinition) { var argumentType = aspectDefinition.GetArgumentType(); var declaringType = aspectDefinition.Member.DeclaringType; var genericArguments = argumentType.GetGenericArguments(); var genericArgumentsWithContext = new[] { declaringType }.Concat(genericArguments); return(argumentType.MakeGenericArgsType(genericArgumentsWithContext.ToArray())); }
private static Type ToAspectArgumentImpl(this IAspectDefinition aspectDefinition, MethodInfo method) { var declaringType = method.DeclaringType; var argumentType = aspectDefinition.GetArgumentType(); var genericArguments = argumentType.GetGenericArguments(); var genericArgumentsWithContext = new[] { declaringType }.Concat(genericArguments); return(argumentType.MakeGenericArgsType(method, genericArgumentsWithContext.ToArray())); }
internal TopOnMethodBoundaryAspectWeaver(IAspectWeaver nestedWeaver, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(nestedWeaver, aspectDefinition, aspectWeavingSettings) { var @params = weavingSettings.MethodInfoImpl.GetParameters(); methodScopeWeavers = new List <IMethodScopeWeaver>(); argumentsWeavingSetings.Parameters = @params.ToArray(@param => @param.ParameterType).ToArray(); argumentsWeaver = new TopOnMethodBoundaryArgumentsWeaver(argumentsWeavingSetings, aspectWeavingSettings); }
internal AbstractMethodAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWevingSettings) { advices = aspectDefinition.Advices; this.aspectDefinition = aspectDefinition; this.aspectWeavingSettings = aspectWevingSettings; weavingSettings = aspectWevingSettings.WeavingSettings; aspectRepository = aspectWevingSettings.AspectRepository; argumentsWeavingSetings = aspectDefinition.ToArgumentsWeavingSettings(); aspectDefinition.Advices.ForEach(advice => advice.Accept(adviceDiscoveryVistor)); }
internal MethodInvokerAspectWeaver(Type previousAspectArgsType, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, IArgumentsWeavingSettings argumentsWeavingSettings) : base(aspectWeavingSettings.WeavingSettings) { var methodInfoImpl = aspectWeavingSettings.WeavingSettings.MethodInfoImpl; this.previousAspectArgsType = previousAspectArgsType; this.argumentsWeavingSettings = argumentsWeavingSettings; localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; byRefArgumentStoreWeaver = new MethodInvokerByRefArgumentsWeaver(previousAspectArgsType, methodInfoImpl, localBuilderRepository); argumentsWeaver = new MethodInvokerArgumentsWeaver(previousAspectArgsType, aspectWeavingSettings, argumentsWeavingSettings, byRefArgumentStoreWeaver); }
internal AbstractAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) { advices = aspectDefinition.Advices; this.aspectDefinition = aspectDefinition; this.aspectWeavingSettings = aspectWeavingSettings; bindingSettings = aspectDefinition.ToBindingSettings(); weavingSettings = aspectWeavingSettings.WeavingSettings; aspectRepository = aspectWeavingSettings.AspectRepository; argumentsWeavingSettings = aspectDefinition.ToArgumentsWeavingSettings(); aspectDefinition.Advices.ForEach(advice => advice.Accept(adviceDiscoveryVistor)); }
internal BindingAspectDecoratorWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, IArgumentsWeavingSettings argumentsWeavingSettings) : base(aspectWeavingSettings.WeavingSettings) { var bindingSettings = aspectDefinition.ToBindingSettings(); var methodInfoImpl = aspectWeavingSettings.WeavingSettings.MethodInfoImpl; lazyWeavedType = new Core.Lib.Lazy <FieldInfo>(WeaveType); bindingSettings.LocalBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; methodDecoratorScopeWeaver = new MethodDecoratorScopeWeaver(aspectWeavingSettings); weaver = new MethodDecoratorBindingWeaver(bindingSettings, aspectWeavingSettings, this); }
internal AbstractMethodInterceptionAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings) { IAdviceExpression selectedExpression = null; var argumentsWeavingSettings = aspectDefinition.ToArgumentsWeavingSettings(); var aspectSettings = new AdviceWeavingSettings(aspectWeavingSettings, argumentsWeavingSettings); bindingDependency = weavedType; selectedExpression = ResolveOnMethodInvokeAdvice(); methodScopeWeavers = new List <IMethodScopeWeaver>(); methodScopeWeavers.Add(selectedExpression.Reduce(aspectSettings)); localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; }
public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(MethodInterceptionAspectAttribute aspect) { return(aspectDefinition => { Func <IAspectExpression, IAspectExpression> ctor = null; var _topAspectInScopeDefinition = (IMethodAspectDefinition)topAspectInScopeDefinition; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (lastAspect.Top) { ctor = expression => { return new TopMethodInterceptionAspectExpression(expression, methodAspectDefinition); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { if (lastAspect.IsTopBinding) { lastAspect.IsTopBinding = false; ctor = expression => { return new TopBindingMethodInterceptionAspectExpression(expression, methodAspectDefinition); }; } else { ctor = expression => { return new BindingMethodInterceptionAspectExpression(expression, methodAspectDefinition, _topAspectInScopeDefinition); }; } } else { ctor = expression => { return new NestedMethodInterceptionAspectExpression(expression, methodAspectDefinition, _topAspectInScopeDefinition); }; } } lastAspect.IsInBinding = true; lastAspect.IsTopBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }); }
internal AbstractInterceptionAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings) { IAdviceExpression selectedExpression = null; AdviceWeavingSettings adviceWeavingSettings = null; bindingDependency = weavedType; argumentsWeavingSettings = aspectDefinition.ToArgumentsWeavingSettings(); adviceWeavingSettings = new AdviceWeavingSettings(aspectWeavingSettings, argumentsWeavingSettings); selectedExpression = ResolveInterceptionAdviceExpression(); methodScopeWeavers = new List<IMethodScopeWeaver> { selectedExpression.Reduce(adviceWeavingSettings) }; localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; }
internal BindingMethodInterceptionAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings, weavedType) { argumentsWeavingSetings.BindingsDependency = weavedType; argumentsWeaver = new BindingMethodInterceptionArgumentsWeaver(argumentsWeavingSetings, aspectWeavingSettings); if (argumentsWeavingSetings.IsFunction) { methodScopeWeavers.Add(new FunctionAspectArgsMappingWeaver(aspectWeavingSettings, argumentsWeavingSetings)); } else { methodScopeWeavers.Add(new ActionAspectArgsMappingWeaver(aspectWeavingSettings, argumentsWeavingSetings)); } ArgumentType = argumentsWeavingSetings.ArgumentType; weaver = new MethodScopeWeaversQueue(methodScopeWeavers); }
internal NestedMethodInterceptionAspectWeaver(Type previousAspectArgType, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings, weavedType) { var argumentWeavingSettings = aspectDefinition.ToArgumentsWeavingSettings(); argumentWeavingSettings.BindingsDependency = weavedType; argumentsWeaver = new NestedMethodIntercpetionArgumentsWeaver(previousAspectArgType, aspectWeavingSettings, argumentWeavingSettings); if (argumentsWeavingSetings.IsFunction) { methodScopeWeavers.Add(new NestedFunctionAspectArgsMappingWeaver(previousAspectArgType, aspectWeavingSettings, argumentsWeavingSetings)); } else { methodScopeWeavers.Add(new NestedActionAspectArgsMappingWeaver(previousAspectArgType, aspectWeavingSettings, argumentsWeavingSetings)); } weaver = new MethodScopeWeaversQueue(methodScopeWeavers); }
internal static BindingSettings ToBindingSettings(this IAspectDefinition aspectDefinition) { IPropertyAspectDefinition propertyAspectDefinition = null; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (methodAspectDefinition.IsNotNull()) { return(methodAspectDefinition.ToMethodBindingSettings()); } propertyAspectDefinition = aspectDefinition as IPropertyAspectDefinition; if (propertyAspectDefinition.IsNotNull()) { return(propertyAspectDefinition.ToPropertyBindingSettings()); } return(((IEventAspectDefinition)aspectDefinition).ToEventBindingSettings()); }
internal static Type ToAspectArgumentImpl(this IAspectDefinition aspectDefinition) { IPropertyAspectDefinition propertyAspectDefinition = null; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (methodAspectDefinition.IsNotNull()) { return(methodAspectDefinition.ToAspectArgumentImpl()); } propertyAspectDefinition = aspectDefinition as IPropertyAspectDefinition; if (propertyAspectDefinition.IsNotNull()) { return(propertyAspectDefinition.ToAspectArgumentImpl()); } return(((IEventAspectDefinition)aspectDefinition).ToAspectArgumentImpl()); }
public Func<IAspectDefinition, IAspectExpressionBuilder> Visit(OnMethodBoundaryAspectAttribute aspect) { return aspectDefinition => { Func<IAspectExpression, IAspectExpression> ctor = null; var _topAspectInScopeDefinition = topAspectInScopeDefinition; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (lastAspect.Top) { ctor = expression => { return new TopOnMethodBoundaryAspectExpression(expression, methodAspectDefinition); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { if (lastAspect.IsTopBinding) { lastAspect.IsTopBinding = false; ctor = expression => { return new TopBindingOnMethodBoundaryAspectExpression(expression, methodAspectDefinition); }; } else { ctor = expression => { return new BindingOnMethodBoundaryAspectExpression(expression, methodAspectDefinition, _topAspectInScopeDefinition); }; } } else { ctor = expression => { return new NestedOnMethodBoundaryAspectExpression(expression, methodAspectDefinition); }; } } topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }; }
internal AspectExpressionTreeBuilder(IAspectDefinitionCollection aspectDefinitions) { var aspectVisitor = new AspectVisitor(); IAspectDefinition lastAspectDefinition = null; IAspectExpressionBuilder invocationAspectBuilder = null; IArgumentsWeavingSettings argumentsWeavingSettings = null; List <IAspectExpressionBuilder> aspectExpressionBuilders = null; var aspectsByPriority = aspectDefinitions.OrderBy(aspect => aspect.Aspect.AspectPriority) .ThenBy(aspect => { var value = aspect.Aspect is OnMethodBoundaryAspectAttribute; return(Convert.ToInt32(!value)); }); lastAspectDefinition = aspectDefinitions.First(); argumentsWeavingSettings = lastAspectDefinition.ToArgumentsWeavingSettings(); aspectExpressionBuilders = aspectsByPriority.ToList(definition => definition.BuildAdvices().Accept(aspectVisitor)); invocationAspectBuilder = aspectVisitor.VisitLast(lastAspectDefinition, argumentsWeavingSettings); aspectExpressionBuilders.Add(invocationAspectBuilder); aspectsStack = new Stack <IAspectExpressionBuilder>(aspectExpressionBuilders); }
internal static BindingSettings ToBindingSettings(this IAspectDefinition aspectDefinition) { var aspectArgumentType = aspectDefinition.GetArgumentType(); var aspectArgumentImplType = aspectDefinition.ToAspectArgumentImpl(); var genericArguments = aspectArgumentImplType.GetGenericArguments(); if (aspectArgumentType.IsFunctionAspectArgs()) { return(new BindingSettings { IsFunction = true, ArgumentType = aspectArgumentImplType, BindingType = aspectArgumentType.MakeGenericFunctionBinding(genericArguments) }); } return(new BindingSettings { IsFunction = false, ArgumentType = aspectArgumentImplType, BindingType = aspectArgumentType.MakeGenericActionBinding(genericArguments) }); }
public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(GetPropertyFragmentInterceptionAspect aspect) { return(aspectDefinition => { Func <IAspectExpression, IAspectExpression> ctor = null; var propertyAspectDefinition = (IFullPropertyAspectDefinition)aspectDefinition; if (lastAspect.Top) { ctor = expression => { var propertyBuilder = propertyAspectDefinition.PropertyBuilder; propertyBuilder.SetGetExpression(expression); return new TopGetPropertyFragmentInterceptionAspectExpression(expression, propertyAspectDefinition, propertyBuilder); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { var propertyBuilder = propertyAspectDefinition.PropertyBuilder; propertyBuilder.SetGetExpression(expression); return new BindingGetPropertyFragmentInterceptionAspectExpression(expression, propertyAspectDefinition, propertyBuilder); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }); }
public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(RaiseEventFragmentInterceptionAspect aspect) { return(aspectDefinition => { Func <IAspectExpression, IAspectExpression> ctor = null; var eventAspectDefinition = (IFullEventAspectDefinition)aspectDefinition; if (lastAspect.Top) { ctor = expression => { var eventBuilder = eventAspectDefinition.EventBuilder; eventBuilder.SetInvokeExpression(expression); return new TopRaiseEventFragmentInterceptionAspectExpression(expression, eventAspectDefinition, eventBuilder); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { var eventBuilder = eventAspectDefinition.EventBuilder; eventBuilder.SetInvokeExpression(expression); return new BindingRaiseEventFragmentInterceptionAspectExpression(expression, eventAspectDefinition, eventBuilder); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }); }
public Func <IAspectDefinition, IAspectExpressionBuilder> Visit(MethodInterceptionAspectAttribute aspect) { return((IAspectDefinition aspectDefinition) => { Func <IAspectExpression, IAspectExpression> ctor = null; if (lastAspect.Top) { ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => { return new TopMethodInterceptionAspectExpression(expression, aspectDefinition); }); lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => { return new BindingMethodInterceptionAspectExpression(expression, aspectDefinition); }); } else { var _previousAspectDefinition = previousAspectDefinition; ctor = Functional.Curry <IAspectExpression, IAspectExpression>(expression => { return new NestedMethodInterceptionAspectExpression(expression, aspectDefinition, _previousAspectDefinition); }); } } lastAspect.IsInBinding = true; previousAspectDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }); }
public Func<IAspectDefinition, IAspectExpressionBuilder> Visit(SetPropertyFragmentInterceptionAspect aspect) { return aspectDefinition => { Func<IAspectExpression, IAspectExpression> ctor = null; var propertyAspectDefinition = (IFullPropertyAspectDefinition)aspectDefinition; if (lastAspect.Top) { ctor = expression => { var propertyBuilder = propertyAspectDefinition.PropertyBuilder; propertyBuilder.SetSetExpression(expression); return new TopSetPropertyFragmentInterceptionAspectExpression(expression, propertyAspectDefinition, propertyBuilder); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { var propertyBuilder = propertyAspectDefinition.PropertyBuilder; propertyBuilder.SetSetExpression(expression); return new BindingSetPropertyFragmentInterceptionAspectExpression(expression, propertyAspectDefinition, propertyBuilder); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }; }
public Func<IAspectDefinition, IAspectExpressionBuilder> Visit(GetPropertyInterceptionAspect aspect) { return aspectDefinition => { Func<IAspectExpression, IAspectExpression> ctor = null; var propertyAspectDefinition = aspectDefinition as IPropertyAspectDefinition; if (lastAspect.Top) { ctor = expression => { return new TopGetPropertyInterceptionAspectExpression(expression, propertyAspectDefinition); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { return new BindingGetPropertyInterceptionAspectExpression(expression, propertyAspectDefinition); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }; }
internal BindingOnMethodBoundaryAspectExpression(IAspectExpression aspectExpression, IMethodAspectDefinition aspectDefinition, IAspectDefinition topAspectInScopeDefinition) : base(aspectExpression, aspectDefinition) { this.topAspectInScopeDefinition = topAspectInScopeDefinition; }
internal AbstractTopOnMethodBoundaryAspectWeaver(IAspectWeaver nestedAspect, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(nestedAspect, aspectDefinition, aspectWeavingSettings) { }
internal AbstractOnMethodBoundaryAspectWeaver(IAspectWeaver nestedAspect, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(aspectDefinition, aspectWeavingSettings) { IAdviceExpression selectedExpression = null; var catchWeavers = new List<IMethodScopeWeaver>(); var entryWeavers = new List<IMethodScopeWeaver>(); var finallyWeavers = new List<IMethodScopeWeaver>(); Action<ILGenerator> restoreArgsIfNeededAction = null; IMethodScopeWeaver restoreArgsIfNeededScopeWeaver = null; var adviceWeavingSettings = new AdviceWeavingSettings(aspectWeavingSettings, argumentsWeavingSettings); ArgumentType = argumentsWeavingSettings.ArgumentType; tryWeavers = new List<IMethodScopeWeaver>() { nestedAspect }; localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; byRefArgumentsStoreWeaver = aspectWeavingSettings.ByRefArgumentsStoreWeaver; restoreArgsIfNeededAction = byRefArgumentsStoreWeaver.RestoreArgsIfNeeded; restoreArgsIfNeededScopeWeaver = restoreArgsIfNeededAction.ToMethodScopeWeaver(); if (adviceDiscoveryVistor.HasOnMethodEntryAdvice) { selectedExpression = ResolveOnMethodEntryAdvice(); entryWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); } AddEntryScopeWeavers(entryWeavers); if (adviceDiscoveryVistor.HasOnMethodSuccessAdvice) { selectedExpression = ResolveOnMethodSuccessAdvice(); tryWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); } if (argumentsWeavingSettings.IsFunction()) { OnFunctionWeavingDetected(); } if (adviceDiscoveryVistor.HasFinallyAdvice) { selectedExpression = ResolveFinallyAdvice(); finallyWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); AddFinallyScopeWeavers(finallyWeavers); if (adviceDiscoveryVistor.HasOnMethodExceptionAdvice) { var aspectMember = aspectRepository.GetAspectFieldByType(aspectDefinition.Aspect.AspectType); var settings = new TryCatchFinallySettings(ArgumentType, localBuilderRepository); selectedExpression = ResolveOnMethodExceptionAdvice(); catchWeavers.Add(restoreArgsIfNeededScopeWeaver); catchWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); weaver = new TryCatchFinallyAspectWeaver(settings, entryWeavers, tryWeavers, catchWeavers, finallyWeavers, returnValueWeaver); } else { finallyWeavers.Insert(0, restoreArgsIfNeededScopeWeaver); weaver = new OnMethodBoundaryTryFinallyAspectWeaver(entryWeavers, tryWeavers, finallyWeavers, returnValueWeaver); } } else { if (!byRefArgumentsStoreWeaver.ContainsByRefParams) { var weavers = entryWeavers; weavers.AddRange(tryWeavers); if (returnValueWeaver.IsNotNull()) { weavers.Add(returnValueWeaver); } weaver = new MethodScopeWeaversQueue(weavers); } else { AddFinallyScopeWeavers(finallyWeavers); finallyWeavers.Insert(0, restoreArgsIfNeededScopeWeaver); weaver = new OnMethodBoundaryTryFinallyAspectWeaver(entryWeavers, tryWeavers, finallyWeavers, returnValueWeaver); } } }
internal AbstractOnMethodBoundaryAspectWeaver(IAspectWeaver nestedAspect, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(aspectDefinition, aspectWeavingSettings) { IMethodScopeWeaver entryWeaver = null; IMethodScopeWeaver catchWeaver = null; Action <ILGenerator> storeArgsAction = null; IAdviceExpression selectedExpression = null; IMethodScopeWeaver storeArgsArgsWeaver = null; var finallyWeavers = new List <IMethodScopeWeaver>(); var adviceWeavingSettings = new AdviceWeavingSettings(aspectWeavingSettings, argumentsWeavingSetings); ArgumentType = argumentsWeavingSetings.ArgumentType; byRefArgumentsStoreWeaver = aspectWeavingSettings.ByRefArgumentsStoreWeaver; storeArgsAction = byRefArgumentsStoreWeaver.StoreArgsIfNeeded; storeArgsArgsWeaver = storeArgsAction.ToMethodScopeWeaver(); tryWeavers = new List <IMethodScopeWeaver>() { nestedAspect }; localBuilderRepository = aspectWeavingSettings.LocalBuilderRepository; if (adviceDiscoveryVistor.HasOnMethodEntryAdvice) { selectedExpression = ResolveOnMethodEntryAdvice(); entryWeaver = selectedExpression.Reduce(adviceWeavingSettings); } if (adviceDiscoveryVistor.HasOnMethodSuccessAdvice) { selectedExpression = ResolveOnMethodSuccessAdvice(); tryWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); } if (argumentsWeavingSetings.IsFunction) { OnFunctionWeavingDetected(); } if (adviceDiscoveryVistor.HasFinallyAdvice) { selectedExpression = ResolveFinallyAdvice(); finallyWeavers.Add(selectedExpression.Reduce(adviceWeavingSettings)); finallyWeavers.Add(storeArgsArgsWeaver); if (adviceDiscoveryVistor.HasOnMethodExceptionAdvice) { var aspectMember = aspectRepository.GetAspectFieldByType(aspectDefinition.Aspect.AspectType); var settings = new TryCatchFinallySettings(ArgumentType, aspectMember, localBuilderRepository); selectedExpression = ResolveOnMethodExceptionAdvice(); catchWeaver = selectedExpression.Reduce(adviceWeavingSettings); weaver = new TryCatchFinallyAspectWeaver(settings, entryWeaver, tryWeavers, catchWeaver, finallyWeavers, returnValueWeaver); } else { weaver = new OnMethodBoundaryTryFinallyAspectWeaver(entryWeaver, tryWeavers, finallyWeavers, returnValueWeaver); } } else { var weavers = new List <IMethodScopeWeaver> { entryWeaver }; if (!byRefArgumentsStoreWeaver.ContainsByRefParams) { weavers.AddRange(tryWeavers); if (returnValueWeaver.IsNotNull()) { weavers.Add(returnValueWeaver); } weaver = new MethodScopeWeaversQueue(weavers); } else { finallyWeavers.Add(storeArgsArgsWeaver); weaver = new OnMethodBoundaryTryFinallyAspectWeaver(entryWeaver, weavers, finallyWeavers, returnValueWeaver); } } }
internal IsolatedMethodInterceptionBindingWeaver(IAspectExpression aspectExpression, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(aspectExpression, aspectDefinition, aspectWeavingSettings) { }
public IAspectExpressionBuilder VisitLast(IAspectDefinition aspectDefinition, IArgumentsWeavingSettings argumentsWeavingSettings) { Func<IAspectExpression, IAspectExpression> expressionFactory = null; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (lastAspect.IsInBinding) { if (topAspectInScopeDefinition.AspectType == AspectType.MethodInterceptionAspect) { expressionFactory = expression => { return new BindingMethodAspectDecoratorExpression(methodAspectDefinition, argumentsWeavingSettings); }; } else if (topAspectInScopeDefinition.IsPropertyAspectDefinition()) { var propertyAspectDefinition = (IPropertyAspectDefinition)topAspectInScopeDefinition; expressionFactory = expression => { if (topAspectInScopeDefinition.IsGetPropertyAspectDefinition()) { return new BindingGetPropertyAspectDecoratorExpression(propertyAspectDefinition); } return new BindingSetPropertyAspectDecoratorExpression(propertyAspectDefinition); }; } else if (topAspectInScopeDefinition.IsEventAspectDefinition()) { var eventAspectDefinition = (IEventAspectDefinition)topAspectInScopeDefinition; if (topAspectInScopeDefinition.AspectType == AspectType.AddEventInterceptionAspect) { expressionFactory = expression => { return new BindingAddEventAspectDecoratorExpression(eventAspectDefinition); }; } else if (topAspectInScopeDefinition.AspectType == AspectType.RemoveEventInterceptionAspect) { expressionFactory = expression => { return new BindingRemoveEventAspectDecoratorExpression(eventAspectDefinition); }; } else { expressionFactory = expression => { return new BindingRaiseEventAspectDecoratorExpression(eventAspectDefinition); }; } } else { expressionFactory = expression => { return new MethodInvokerAspectExpression(methodAspectDefinition, argumentsWeavingSettings, (IMethodAspectDefinition)topAspectInScopeDefinition); }; } } else { expressionFactory = expression => { return new NestedMethodInvokerAspectExpression(argumentsWeavingSettings, (IMethodAspectDefinition)topAspectInScopeDefinition); }; } return new AspectNodeExpressionBuilder(expressionFactory); }
internal NestedOnMethodBoundaryAspectWeaver(IAspectWeaver nestedWeaver, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(nestedWeaver, aspectDefinition, aspectWeavingSettings) { }
internal AbstractSetPropertyInterceptionAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings, FieldInfo weavedType) : base(aspectDefinition, aspectWeavingSettings, weavedType) { }
public Func<IAspectDefinition, IAspectExpressionBuilder> Visit(RaiseEventFragmentInterceptionAspect aspect) { return aspectDefinition => { Func<IAspectExpression, IAspectExpression> ctor = null; var eventAspectDefinition = (IFullEventAspectDefinition)aspectDefinition; if (lastAspect.Top) { ctor = expression => { var eventBuilder = eventAspectDefinition.EventBuilder; eventBuilder.SetInvokeExpression(expression); return new TopRaiseEventFragmentInterceptionAspectExpression(expression, eventAspectDefinition, eventBuilder); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { ctor = expression => { var eventBuilder = eventAspectDefinition.EventBuilder; eventBuilder.SetInvokeExpression(expression); return new BindingRaiseEventFragmentInterceptionAspectExpression(expression, eventAspectDefinition, eventBuilder); }; } } lastAspect.IsInBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }; }
internal static ArgumentsWeavingSettings ToArgumentsWeavingSettings(this IAspectDefinition aspectDefinition) { return(aspectDefinition.ToBindingSettings() .ToArgumentsWeavingSettings(aspectDefinition.Aspect.AspectType)); }
public Func<IAspectDefinition, IAspectExpressionBuilder> Visit(MethodInterceptionAspectAttribute aspect) { return aspectDefinition => { Func<IAspectExpression, IAspectExpression> ctor = null; var _topAspectInScopeDefinition = (IMethodAspectDefinition)topAspectInScopeDefinition; var methodAspectDefinition = aspectDefinition as IMethodAspectDefinition; if (lastAspect.Top) { ctor = expression => { return new TopMethodInterceptionAspectExpression(expression, methodAspectDefinition); }; lastAspect = new Aspect(); } else { if (lastAspect.IsInBinding) { if (lastAspect.IsTopBinding) { lastAspect.IsTopBinding = false; ctor = expression => { return new TopBindingMethodInterceptionAspectExpression(expression, methodAspectDefinition); }; } else { ctor = expression => { return new BindingMethodInterceptionAspectExpression(expression, methodAspectDefinition, _topAspectInScopeDefinition); }; } } else { ctor = expression => { return new NestedMethodInterceptionAspectExpression(expression, methodAspectDefinition, _topAspectInScopeDefinition); }; } } lastAspect.IsInBinding = true; lastAspect.IsTopBinding = true; topAspectInScopeDefinition = aspectDefinition; return new AspectNodeExpressionBuilder(ctor); }; }
internal NestedOnMethodBoundaryAspectWeaver(Type previousAspectArgsType, IAspectWeaver nestedWeaver, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(nestedWeaver, aspectDefinition, aspectWeavingSettings) { }
internal AbstractAspectExpression(IAspectExpression aspectExpression, IAspectDefinition aspectDefinition = null) { this.aspectExpression = aspectExpression; this.aspectDefinition = aspectDefinition; }
internal NestedMethodInterceptionAspectExpression(IAspectExpression aspectExpression, IMethodAspectDefinition aspectDefinition, IMethodAspectDefinition topAspectInScopeDefinition) : base(aspectExpression, aspectDefinition) { this.topAspectInScopeDefinition = topAspectInScopeDefinition; }
internal AbstractMethodAspectWeaver(IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings) : base(aspectDefinition, aspectWeavingSettings) { aspectMethodDefinition = aspectDefinition; }