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);
            }
        }
Exemple #2
0
        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);
            });
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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()));
        }
Exemple #8
0
        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);
        }
Exemple #13
0
        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;
        }
Exemple #14
0
        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);
        }
Exemple #17
0
        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());
        }
Exemple #20
0
        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);
            };
        }
Exemple #21
0
        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);
        }
Exemple #22
0
        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)
            });
        }
Exemple #23
0
        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);
            });
        }
Exemple #24
0
        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);
            });
        }
Exemple #25
0
        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);
            });
        }
Exemple #26
0
        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);
            };
        }
Exemple #27
0
        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)
 {
 }
Exemple #33
0
        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)
 {
 }
Exemple #36
0
        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);
            };
        }
Exemple #37
0
 internal static ArgumentsWeavingSettings ToArgumentsWeavingSettings(this IAspectDefinition aspectDefinition)
 {
     return(aspectDefinition.ToBindingSettings()
            .ToArgumentsWeavingSettings(aspectDefinition.Aspect.AspectType));
 }
Exemple #38
0
        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);
            };
        }
Exemple #39
0
 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 NestedOnMethodBoundaryAspectWeaver(IAspectWeaver nestedWeaver, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings)
     : base(nestedWeaver, aspectDefinition, aspectWeavingSettings)
 {
 }
Exemple #43
0
 internal AbstractTopOnMethodBoundaryAspectWeaver(IAspectWeaver nestedAspect, IAspectDefinition aspectDefinition, IAspectWeavingSettings aspectWeavingSettings)
     : base(nestedAspect, aspectDefinition, aspectWeavingSettings)
 {
 }
 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;
 }